Управление транзакционными очередями 101
Транзакционная очередь - это система промежуточного программного обеспечения, которая асинхронно маршрутизирует сообщения одного вида другого между узлами, которые могут быть подключены или не подключены в любой момент времени. Это означает, что он также должен быть способен сохранять сообщение где-то. Примерами таких систем являются MSMQ и IBM MQ
Транзакционная очередь также может участвовать в распределенной транзакции , а откат может инициировать удаление сообщений. Это означает, что сообщение гарантированно будет доставлено с семантикой самое большее один раз или гарантированной доставкой, если не будет выполнено откат. Сообщение не будет доставлено, если:
Хост A отправляет сообщение, но Хост B
не подключен
Что-то (возможно, но не
обязательно инициируется с Host A)
откатывает транзакцию
B подключается после транзакции
откат
В этом случае B никогда не узнает, что сообщение вообще существует, если не получит информацию через какой-либо другой носитель. Если транзакция была отменена, это, вероятно, не имеет значения. Если B подключается и собирает сообщение до отката транзакции, откат также изменит действие сообщения на B.
Обратите внимание, что A может отправить сообщение в очередь с гарантией не более одной доставки. Если транзакция зафиксирована, узел А может предположить, что сообщение было доставлено надежным транспортным средством. Если транзакция откатана, узел А может предположить, что любые эффекты сообщения были сторнированы.
Веб-сервисы
Веб-служба - это удаленный вызов процедуры или другая служба (например, RESTFul API ), опубликованная (обычно) HTTP-сервером. Это протокол синхронного запроса / ответа, в котором нет гарантии доставки, встроенной в протокол. Клиент должен проверить, правильно ли была запущена служба. Обычно это происходит через ответ на запрос или тайм-аут вызова.
В последнем случае веб-сервисы не гарантируют семантику не более одного раза. Сервер может завершить обслуживание и не доставить ответ (возможно, из-за ошибки сервера). Приложение должно быть в состоянии справиться с этой ситуацией.
IIRC, службы RESTFul должны быть идемпотентными (такое же состояние достигается после любого количества вызовов одной и той же службы), , которая представляет собой стратегию для устранения этого отсутствия гарантированного уведомления об успехе / неудаче в архитектуры веб-сервисов. Идея состоит в том, что концептуально каждый пишет состояние, а не вызывает сервис, так что можно писать любое количество раз. Это означает, что приложение может допускать отсутствие обратной связи об успехе, поскольку оно может повторять попытку публикации, пока не получит сообщение «успех» от сервера.