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