Подтвердить что ты не робот

Связь между JMS-соединениями, сеансами и производителями/потребителями

Я хочу отправить пакет из 20k JMS-сообщений в одну очередь. Я разбиваю задачу на 10 потоков, поэтому каждая из них будет обрабатывать 2k сообщений. Мне не нужны транзакции.

Мне было интересно, не рекомендуется ли использовать одно соединение, один сеанс и 10 продюсеров?

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

Какова общая рекомендация о том, создавать ли новое соединение или сеанс, если я всегда подключаюсь к одной очереди?

Спасибо и извините за то, что попросили много раз.

(Здесь аналогичный вопрос, но он не совсем отвечал на то, что я искал. Долгоживущие JMS-сессии. Является ли хранение JMS-подключений/сеансов JMS открытой плохой оценкой?)

4b9b3361

Ответ 1

Хорошо, если некоторые из сообщений дублируются или теряются? Когда клиент JMS подключается к брокеру JMS по сети, для любого вызова API существует три этапа.

  • Вызов API, включая любые данные сообщения, передается по проводке брокеру.
  • Вызов API выполняется брокером.
  • Код результата и любые данные сообщения передаются обратно клиенту.

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

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

За пределами транзакций возможна потеря или дублирование сообщений. Внутри транзакции существует одно и то же окно двусмысленности, но оно находится в вызове COMMIT, а не в PUT или GET. С транзакционными сеансами можно отправить или получить сообщение дважды, но не потерять его.

Спецификация JMS распознает это окно неоднозначности и предоставляет следующие рекомендации:

Если происходит сбой между время, в течение которого клиент выполняет свою работу сеанс и метод фиксации возвращает, клиент не может определить если сделка была совершена или откат. Такая же двусмысленность существует когда происходит сбой между беспроцентная отправка СТОРОНЫ сообщение и возврат из пересылка способ.

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

Сообщение, которое повторно отправлено из-за восстановление сеанса не считается дублирующее сообщение.

JMS-сессии должны всегда транслироваться, за исключением случаев, когда действительно можно потерять сообщения. Если сеансы транслируются, вам потребуется сеанс и соединение для потока из-за модели потока JMS.

Любые советы о влиянии производительности будут специфичными для поставщиков, но в целом постоянные сообщения за пределами точки синхронизации затвердевают на диск до возврата вызова API. Но транзакционный вызов может вернуться до того, как постоянное сообщение будет записано на диск, пока сообщение сохраняется до возвращения COMMIT. Если поставщик оптимизирован на основе этого, то гораздо более эффективно записывать несколько сообщений на диск и затем совершать их в пакетах. Это позволяет брокеру оптимизировать записи и флеши дисков блоком диска, а не для каждого сообщения. Количество сообщений для транзакции уменьшается с размером сообщения, а за пределами определенного размера сообщения уменьшается до одного.

Если ваши 20k-сообщения относительно малы (измерены в k, а не mb), вы, вероятно, захотите использовать транзакционные сеансы на поток и настроить интервал фиксации.

Ответ 2

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

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

Лучшим решением будет для нас пул соединений и дать администратору некоторые параметры для настройки поведения в конкретной области.

Ответ 3

Из того, что я исследую в этой теме, один сеанс означает один поток. Это основано на спецификациях JMS. Если вам нужна многопоточность (несколько производителей/потребителей), необходимо создать несколько сеансов, одно соединение будет прекрасным.

Ответ 4

I was wondering if having one connection, one session, and 10 producers
is the recommended way to go or not? 

Конечно, но обратите внимание на то, что вы используете только один поток, только тот, который вы создаете при создании объекта Session. Все 10 производителей связаны с этим объектом сеанса и, следовательно, с тем же потоком.

How about if I had one producer shared by all the threads? Would my messages
be corrupt or would it be sent out synchronized (giving no performance gain)?

Очень плохая идея, я бы сказал. Спецификации JMS ясно говорят, что сеанс не должен делиться более чем одним потоком. Он не является потокобезопасным.

What the general guideline of deciding whether to create a new connection
or session if I'm always connecting to the same queue?

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

Ответ 5

В теории Соединения являются потокобезопасными, но все остальные нет, поэтому вы должны создать один сеанс для потока.

В действительности это зависит от используемой вами реализации JMS.