Как создать масштабируемый процессор запросов / ответов в TIBCO EMS (или другой JMS)? - PullRequest
3 голосов
/ 01 ноября 2011

Я работаю над проектом на стороне сервера, предоставляющим услугу запрос / ответ через TIBCO EMS, и ищу советы по передовой практике для архивирования масштабируемости и низкой задержки в этом сервисе.Я делаю это в .NET, но так как TIBCO EMS предположительно реализует спецификацию JMS, я предполагаю, что рекомендации для других реализаций JMS, а также платформ (Java) были бы уместны.

В настоящее время мы используемодно соединение, один сеанс, один получатель и прослушивание сообщений с использованием обратного вызова на этом единственном получателе.Каждый запрос обрабатывается в потоке обратного вызова, синхронно отвечает в другой очереди (но в том же сеансе).Это работает, но, похоже, не масштабируется - загрузка ЦП незначительна даже при высоких скоростях транзакций, но время ожидания запроса продолжает расти.

Я предполагаю, что происходит то, что EMS использует один поток для обратного вызова, и поэтому время обработки, а также время, необходимое для отправки ответа, блокирует обработку других запросов, но - что лучшеспособ получить это в масштабе?

Одним из способов будет немедленное планирование фактической обработки входящего запроса в пуле потоков после его получения.Это быстрое решение, которое масштабируется, но добавит дополнительную задержку и вызовет проблемы с потоками при использовании сеанса.Другой - иметь несколько объектов Session или даже объектов Connection?Может кто-нибудь, пожалуйста, совет по наилучшей практике для этого, я думаю, это должен быть один из наиболее распространенных шаблонов использования там ...

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

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

Вам нужно будет выполнить небольшую синхронизацию, чтобы вернуть результаты нужному потребителю, но это должно быть относительно тривиально.

0 голосов
/ 04 марта 2013

На обработку сообщений влияет режим подтверждения и количество параллельных сеансов.

Из того, что вы говорите, для меня звучит, что вы используете только один сеанс и подтверждаете (подтверждение клиента) сообщение после обработки (и ответа) один за другим.

Это может быть ускорено с помощью автоматического подтверждения (подтверждение сообщения при получении) и / или используя несколько сеансов параллельно.

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

Поздний ответ, но я надеюсь, что это поможет;)

...