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

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

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

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

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

Спасибо и прошу прощения за много вопросов.

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

Ответы на вопрос(5)

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

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

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

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's the general guideline of deciding whether to create a new connection
or session if I'm always connecting to the same queue?

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

Решение Вопроса

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

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

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

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

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

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

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

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

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

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

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

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

но все остальные - нет, поэтому вы должны создать один сеанс для каждого потока.

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

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

Ваш ответ на вопрос