Реализовать API длительного опроса с Symfony

Я пытаюсь реализовать API, который использует концепцию длительного опроса в среде Symfony.

Предположим, что у меня есть таблица «каналы», которая может только расти (предположим, что пользователи могут вставлять свои каналы из другого интерфейса). Я хочу создать страницу, обновляемую в режиме реального времени на стороне клиента. Идея заключается в следующем:

  1. Клиент отправляет запрос ajax с отметкой времени последней модификации (первый раз отправляет 0)
  2. Сервер сравнивает временную метку клиента с временной меткой, чтобы получить все сообщения с большей временной меткой, чем сообщение, отправленное пользователем.
  3. Если есть более новые сообщения, немедленно возвращайте их клиенту с отметкой времени последнего сообщения. 1-3 секунды (случайно) есть ли новые сообщения.
  4. Когда клиент получает ответ сервера, браузер обновляет представление и немедленно отправляет новый запрос ajax.

Другими словами, вместо того, чтобы отправлять вызов AJAX каждые x секунд, сервер удерживает запрос до тех пор, пока у него не появится новая информация для нас.

Имея хороший опыт работы с Symfony, я попытался реализовать простую демонстрацию этого API, и она отлично работает. У меня была проблема с блокировкой сеанса (вызов ajax удерживается, поэтому доступ к серверу невозможен), поэтому я просто добавил в действие следующее:

public function executeIndex(sfWebRequest $request)
{
  session_write_close();
       :
       :

(см. также эту ссылку )

Затем я тестирую массовый доступ к API. 100 пользователей работает нормально, 1000 все вылетает. Я понял, что у меня две проблемы:

  1. Для каждого доступа открывается новое соединение с БД
  2. Для каждого доступа сервер выполняет новый процесс

Для первой проблемы я попытался поместить persistent: true в свой разъем Doctrine database.yml. Когда я отслеживал подключения к серверу, я видел, что каждый доступ к API открывает новое подключение. Так что в основном я все еще заблокирован теми же двумя проблемами.

Кто-нибудь имеет какие-либо идеи или опыт в этом вопросе?? Или, может быть, мне следует отказаться от идеи реализации моего API с помощью Symfony??


person Guy    schedule 16.06.2011    source источник


Ответы (2)


Я думаю, что использование Symfony для этого - неправильный подход. Использование сокетов было бы намного проще.

Например, взгляните на nodejs или ape-project (комета)

они оба могут обрабатывать гораздо больше текущих пользователей, чем apache, lighttpd или nginx...

person Flask    schedule 16.06.2011

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

person Francis Manoj Fernnado    schedule 23.03.2015