• Как реализовать сервер очередей заданий по HTTP?

    @cthulhudx
    RabbitMQ или Quartz Scheduler
    Ответ написан
    Комментировать
  • Как реализовать сервер очередей заданий по HTTP?

    kivsiak
    @kivsiak
    software engineer
    RabbitMQ + https://www.rabbitmq.com/web-stomp.html

    И не городите велосипед.
    Ответ написан
    Комментировать
  • Как реализовать сервер очередей заданий по HTTP?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    если задача все же настоящая, она сводится к нахождению ответа "какой из сторонних серверов очередей нормально работает с WebSocket": составляете список, изучаете, пробуете
    Ответ написан
    Комментировать
  • Как получить 3 уровня вложенных записей одним SQL запросом?

    zona7o
    @zona7o
    Веб-разработчик
    А зачем просто не выбрать все записи из таблицы и уже в коде программы формировать дерево, тем более это не исключается?
    Ответ написан
    3 комментария
  • Как получить 3 уровня вложенных записей одним SQL запросом?

    @iamnothing
    Как вариант:
    SELECT * FROM :table WHERE 
      company_id = :company_id 
      OR parent_id = (
        SELECT id FROM :table WHERE company_id = :company_id)
      OR parent_id IN (
        SELECT id FROM :table WHERE parent_id = (
          SELECT id FROM :table WHERE company_id = :company_id))

    А вложенный массив уже потом можно собрать в коде
    Ответ написан
    Комментировать
  • Long polling в nginx

    @rowdyro
    Мы делали название канала секретным.

    После авторизации пользователю передается случайная строка - имя канала, которую он читает.
    Ответ написан
    1 комментарий
  • Как оптимизировать БД (2 Гб. на жестком диске)?

    2Гб база - это не много.
    Нужно смотреть в сторону нормализации модели базы.
    Left / Right JOIN запросы не критичны, вот Inner / Outer очень сильно могут подпортить производительность. На моей практике денормализировать и партицировать модель для предотвращения JOIN'ов приходилось только при работе с 30Гб+ табличками.

    Выносить БД на B-tree в память нет смысла, проще использовать Redis или hashtable индексы.
    В случае с MySQL у InnoDB есть встроенный кэш для ключей первого порядка...

    Вам нужно просто прикрутить нормально кэш второго уровня типа memcached или ehcache и не заморачиваться.

    Как сказал @affka полнотекстовые поисковые движки нужны 100%.
    Лично мне Sphinx не очень нравится, больше склоняюсь к Solr / Elastic Search и к встроенному полнотекстовому движку PosgreSQL.

    Можно почитать это и это.
    Для PostgreSQL можно глянуть это
    Также желательно помнить про VACUUM и пользоваться pg_reorg для предотвращения блокировок.

    В принципе ваши проблемы 100% решаются EXPLAIN'ом и нормальным кэшированием с нормализацией модели.

    Шардинги / репликации и партицирование слишком большой геморой если не решены самые элементарные вопросы. Тем более что у MySQL что у PostgreSQL master-master репликация вообще не торт. Это "План Я" для любого проекта.
    Ответ написан
    Комментировать
  • Как оптимизировать БД (2 Гб. на жестком диске)?

    affka
    @affka
    http://affka.ru
    Если в запросах участвуют не сильно много данных (не целиком несколько таблиц, а лишь некоторые колонки), то помогут грамотно проставленные индексы. СУБД индексы кешируют в памяти сами и поиск по ним очень быстр.
    Если у вас запросы LIKE по каким-нить большим blob полям, то вероятно структура БД неверная и нужно искомую информацию заранее, на этапе записи, выносить в отдельные столбцы. Тем более что у вас 95% select запросов.
    В любом случае от LIKE запросов лучше избавляться, сервер провалится от нагрузок даже если у вас всё в памяти будет лежать. Если это поиск по тексту, то советую посмотреть в сторону поисковых движков, например sphinx.
    Ответ написан
    Комментировать
  • Как оптимизировать БД (2 Гб. на жестком диске)?

    @bondbig
    2Гб - это смехотворно мало и безусловно должно находиться в памяти целиком. Но это всего лишь один из шагов оптимизации.
    Ответ написан
    2 комментария
  • Рабочие процессы в асинхронных серверах

    AxisPod
    @AxisPod
    Основной смысл в том, что обработка ведется на основе событийной модели. Для этого используются epoll/kqueue и подобные решения в зависимости от ОС. Далее используется не одна очередь, в этом случае без использования потоков использовалось бы только одно ядро, что неправильно (именно поэтому хорошо сливают библиотеки libuv (разрабатывается для node.js), libevent и подобные). Для того чтобы полностью использовать все ядра процессора и запускается по одному процессу на ядро. По идее можно было бы использовать и многопоточность, но в этом случае потребуется синхронизация, а она в свою очередь негативно скажется на производительности.
    Ответ написан
    Комментировать
  • Рабочие процессы в асинхронных серверах

    IlyaEvseev
    @IlyaEvseev
    Opensource geek
    Смысл есть, т.к. по умолчанию асинхронное приложение работает в одном потоке, т.е. может загрузить не более одного процессорного ядра.
    Если одного ядра мало и\или есть риск, что в потоке возникнет долгая операция - увеличивайте количество воркеров.
    В Лайти многопоточный режим отлажен менее тщательно, поэтому предупреждают.
    В Nginx'e проблем нет, ставьте "auto".
    Ответ написан
    Комментировать
  • Рабочие процессы в асинхронных серверах

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    если на низком уровне то все просто. Главный процесс слушает сокет и делает accept. Затем есть 2 варианта: мультиплексировать запросы (из массива выбирать сокеты готовые для чтения через select/epoll и делать recv или accept в зависимости от того что за сокет готов предоставить данные) либо запихнуть обработку сокета в отедельный поток/процесс. Процессы надежнее ибо если он упадет то серверу от этого ничего не сделается.

    А далее уже идут оптимизации. Тот же nginx использует мультиплексирование внутри процессов-воркеров. Мультиплексирование позволяет более грамотно подойти к использованию ресурсов внутри одного процесса, а несколько процессов позволяют обрабатывать паралельно больше запросов. В то же время обработка этих запросов никак не затрагивает главный процесс слушающий сокет на предмет новых подключений.

    По поводу самих воркеров. Так как форк нового процесса все же операция не такая уж и дешевая, имеет место такая практика как префорк. То есть в памяти уже крутится какое-то число готовых процессов и при появлении запросов на обработку они просто передаются туда. При повышении количества запросов увеличивается количество воркеров, что минимизирует потери от блокировки процессов...

    вообще погуглите про проблему 10k, можно нагуглить кучу алгоритмов обработки запросов.

    А что касается lighttpd то в документации описаны случаи когда нужно использовать многопроцессорность, и приведены возможные проблемы с модулями. Именно советов "не использовать" там нету.
    Ответ написан
    Комментировать
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.

    Вот это почитайте - http://habrahabr.ru/post/128772/
    Если вкратце - то асинхронная модель не лучше и не хуже. У неё своя область применения. Например, запускать тяжелую математику внутри NodeJS-сервера - смерть всему и всем. А вот тяжелые запросы в БД из PHP вполне себе бодренько будут бегать по серверу (ну насколько для них это возможно).
    Или хороший пример - из nginx-ового перла запросы в mysql-базу делать (да-да, он и такое может). Тогда он тоже начинает крайне отвратно работать)

    То есть асинхронная модель (по крайней мере, в районе web-серверов/приложений) хороша только тогда, когда все запросы у вас быстро отрабатывают. Как то так.

    (ну и как обычно - комментарии не менее ценны, чем статья).

    Ответ написан
    1 комментарий
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)

    Все сервера предназначенные для больших нагрузок являются асинхронными. То есть обработка новых входящих соединений происходит раньше, чем закончат работу текущие соединения.
    Преимущество готовых асинхронных серверов в том, что они готовы. Вы можете точно так же написать асинхронный сервер на php (socket + select), но это не настолько эффективно как в python и тем более в node.js, где этот функционал идет из коробки.

    Стандартный кейс применения node.js/Python twisted и любых других реализаций - обработка либо сырых tcp-соединений (например push уведомления) или же keep-alive для тех же целей. При обработке же коротких http запросов профит уже не так велик. Во всяком случае между php и python. node.js будет пошустрее, но и памяти он будет кушать чуточку больше.

    Ответ написан
    1 комментарий
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    IlyaEvseev
    @IlyaEvseev
    Opensource geek

    Достаточно одного узкого места, чтобы поставить колом всю систему.
    Частично асинхронная система лучше, чем система вообще без асинхронности.
    Но хуже, чем полностью асинхронная.

    Создание и поддержка множества процессов и потоков для синхронной обработки - операция недешевая, даже если они в находятся в состоянии ожидания. На практике это выглядит как бешеный рост LoadAverage.

    Асинхронность позволяет держать фиксированное количество рабочих процессов (в идеале, по одному процессу на каждое процессорное ядро). Процессы создавать не надо, переключать почти не надо - в биткойне у меня такая схема обрабатывала тысячи одновременных коннектов с загрузкой cpu менее 1%.

    Ответ написан
    Комментировать
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    AMar4enko
    @AMar4enko

    Если коротко, то ошибка закралась вот тут:
    В асинхронном сервере в единый момент времени обрабатывается столько запросов, сколько есть воркеров

    Представьте себе, что у вас на сервер приходит запрос, связанный с выборкой данных из БД.
    Он отрабатывает, предположим, за 150 мс, из которых 130 это работа с базой данных.

    В случае с PHP у вас воркер будет заблокирован эти 150 мс для обработки других запросов.
    В случае с асинхронным сервером, он, пока запрос 1 ждет данные от БД в течение 130 мс, сможет принять и начать обрабатывать другие запросы. Предположим, что у нас один PHP-воркер. В этом случае таких запросов, как из примера, он сможет обработать семь штук за секунду.

    Асинхронному же, допустим, прилетят 20 запросов. Он обработает каждый до взаимодействия с БД, допустим за 10 мс, полетят 20 запросов к БД, пройдут, допустим, за 500 мс, и сервер сформирует ответ. И это все практически параллельно. Итого меньше чем за секунду мы таким образом обработаем 20 запросов.

    Можно, конечно, увеличить пул FastCGI, но оверхед при обработке запроса каждым воркером будет несоизмеримо выше, чем при обработке асинхронным сервером.

    Ответ написан
    4 комментария