Ответ 1
Хорошо, если некоторые из сообщений дублируются или теряются? Когда клиент JMS подключается к брокеру JMS по сети, для любого вызова API существует три этапа.
- Вызов API, включая любые данные сообщения, передается по проводке брокеру.
- Вызов API выполняется брокером.
- Код результата и любые данные сообщения передаются обратно клиенту.
Подумайте о продюсере на минуту. Если соединение нарушено на первом шаге, брокер так и не получил сообщение, и приложение должно будет отправить его снова. Если соединение нарушено на третьем шаге, сообщение успешно отправлено и его отправка снова приведет к дублированию сообщения. Приложение не может определить разницу между этими и так, единственным безопасным выбором является повторная отправка сообщения об ошибке. Если сеанс транслируется, сообщение можно смело повторить во всех случаях, потому что, если оригинал сделал его брокеру, он будет откат.
Рассмотрим потребителя. Если соединение потеряно на третьем шаге, сообщение удаляется из очереди, но никогда не возвращается к клиенту. Но если сеанс транслируется, сообщение будет повторно добавлено при повторном подключении приложения.
За пределами транзакций возможна потеря или дублирование сообщений. Внутри транзакции существует одно и то же окно двусмысленности, но оно находится в вызове COMMIT, а не в PUT или GET. С транзакционными сеансами можно отправить или получить сообщение дважды, но не потерять его.
Спецификация JMS распознает это окно неоднозначности и предоставляет следующие рекомендации:
Если происходит сбой между время, в течение которого клиент выполняет свою работу сеанс и метод фиксации возвращает, клиент не может определить если сделка была совершена или откат. Такая же двусмысленность существует когда происходит сбой между беспроцентная отправка СТОРОНЫ сообщение и возврат из пересылка способ.
Это зависит от приложения JMS с этой двусмысленностью. В некоторых случаях, это может привести к тому, что клиент будет производить функционально повторяющиеся сообщения.
Сообщение, которое повторно отправлено из-за восстановление сеанса не считается дублирующее сообщение.
JMS-сессии должны всегда транслироваться, за исключением случаев, когда действительно можно потерять сообщения. Если сеансы транслируются, вам потребуется сеанс и соединение для потока из-за модели потока JMS.
Любые советы о влиянии производительности будут специфичными для поставщиков, но в целом постоянные сообщения за пределами точки синхронизации затвердевают на диск до возврата вызова API. Но транзакционный вызов может вернуться до того, как постоянное сообщение будет записано на диск, пока сообщение сохраняется до возвращения COMMIT. Если поставщик оптимизирован на основе этого, то гораздо более эффективно записывать несколько сообщений на диск и затем совершать их в пакетах. Это позволяет брокеру оптимизировать записи и флеши дисков блоком диска, а не для каждого сообщения. Количество сообщений для транзакции уменьшается с размером сообщения, а за пределами определенного размера сообщения уменьшается до одного.
Если ваши 20k-сообщения относительно малы (измерены в k, а не mb), вы, вероятно, захотите использовать транзакционные сеансы на поток и настроить интервал фиксации.