При отправке сообщений от клиента к серверу или даже с сервера на другой сервер,если целевой сервер или соединение завершается неудачно после отправки сообщения, но до того, как отправитель получит ответ, что отправка (или принятие) была успешно обработана, отправитель не может точно знать, было ли сообщение успешно отправлено на адрес.
Если целевой сервер или соединение не удалось после того, как отправка была получена и обработана, но до того, как ответ был отправлен обратно, то сообщение будет успешно отправлено на адрес, но если целевой сервер или соединение не удалось до того, как отправка была получена иПосле завершения обработки он не будет успешно отправлен на адрес.С точки зрения отправителя, невозможно различить эти два случая.
Когда сервер восстанавливается, клиент оказывается в сложной ситуации.Он знает, что на целевом сервере произошел сбой, но не знает, достигло ли последнее сообщение своего места назначения.Если он решит повторно отправить последнее сообщение, это может привести к отправке дубликата сообщения на адрес.Если каждое сообщение было ордером или сделкой, это может привести к тому, что ордер будет выполнен дважды или сделка будет дважды забронирована.Это явно нежелательная ситуация.
Отправка сообщений в транзакции также не помогает.Если во время обработки подтверждения транзакции происходит сбой сервера или соединения, также не определено, была ли транзакция успешно принята или нет!
Для решения этих проблем Apache ActiveMQ Artemis обеспечивает автоматическое обнаружение дубликатов сообщений, отправляемых на адреса.