Реализация потока уведомлений AsyncContext - PullRequest
6 голосов
/ 05 ноября 2011

Вот сценарий:

  • типичное веб-приложение push / комета, в котором короткие сообщения должны передаваться одновременно 3000-4000 подключенным пользователям;
  • переход от модели 1 потока / соединения к новой реализации с использованием Servlet 3.0 (AsyncContext) в Tomcat 7;

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

Самым простым способом является стандартный пример: 1 поток ожидает новое сообщение, а затем зацикливает список AsyncContext s и вызывает aCtx.getResponse().getWriter().print(message) для каждого.

Теперь меня беспокоит то, что происходит, когда подключены медленные клиенты (и, учитывая, что у нас может быть 1000, это всегда будет так). Может ли поток уведомлений быть заблокирован или тратить слишком много времени на ожидание этих медленных клиентов и повлиять на всех? Это может быть тривиально, но для меня не ясно, является ли «запись» асинхронной или блокирующей, или выходные буферы компенсируют это, по крайней мере, до некоторой степени.

Или лучше создать для каждого подключенного клиента Runnable (что будет aCtx.getResponse().getWriter().print(message)) и отправить его в Executor с использованием фиксированного пула потоков? Однако я не уверен, имеет ли смысл создание 4000 Runnable за один раз (для каждого сообщения) или какова будет производительность.

И последнее: кто-нибудь имеет реальный / производственный опыт использования Tomcat 7 для такого рода приложений (асинхронный сервлет)? Должен ли я считать, что производство готово в этой области? Спасибо.

...