Реализация отказоустойчивости в распределенных очередях сообщений

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

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

Похоже, что произойдет, если получатель умрет после того, как очередь сообщений доставит ему сообщение? Как отправитель узнает, был ли его предполагаемый запрос выполнен получателем или нет?

1 ответ

Решение

Для начала вам нужно прочитать http://en.wikipedia.org/wiki/Two_Generals%27_Problem.

Это пример очень известной и очень распространенной проблемы в информатике. Технически это считается "решенным", поскольку мы знаем ответ; однако, краткий рассказ таков: то, что вы просите, (строго говоря) невозможно. Существуют протоколы, которые вы можете разработать, которые позволят вам достичь любого уровня достоверности того, что сообщение было (или не было) доставлено, при условии, что достоверность <1,0.

На практике используются вариации двух- и трехфазных протоколов распределенных транзакций, а также различные запасные варианты повторной передачи и повторной синхронизации. Особенности зависят от реализации.

Часто выбор состоит в том, чтобы разрешить возможность дублирования и потребовать, чтобы Получатель ответил соответствующим образом. Это выбор, сделанный TCP, который, если подумать, пытается найти разумный ответ на тот же вопрос.

Другие вопросы по тегам