Правильная обработка тайм-аутов NServiceBus

NServiceBus предоставляет механизм тайм-аута. С сайта nservicebus.com:

Метод RequestTimeout в базовом классе указывает NServiceBus отправить сообщение на другую конечную точку, которая будет надежно хранить время для нас... Существует процесс, который поставляется с NServiceBus, называемый диспетчером тайм-аута, который обеспечивает базовую реализацию этой функциональности.

Когда время истекло, Timeout Manager отправляет сообщение обратно в сагу, вызывая вызов его метода Timeout с тем же самым объектом состояния, который был передан изначально.

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

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


person Tobias Furuholm    schedule 16.09.2010    source источник
comment
Вы спрашиваете, что делать, если Timeout Manager не работает?   -  person Adam Fyles    schedule 16.09.2010
comment
Нет. Я рассматриваю крайний случай, когда тайм-аут срабатывает, даже если сообщение было доставлено получателю (например, ответ где-то застрял). Вопрос в том, как заставить ваше приложение вести себя хорошо, не зная наверняка, было ли сообщение доставлено или нет.   -  person Tobias Furuholm    schedule 17.09.2010


Ответы (1)


Если Клиент отправляет сообщение на Сервер, а затем запрашивает тайм-аут, состояние запроса будет сохранено. Если сообщение о тайм-ауте получено Клиентом до ответа от Сервера, вы можете сравнить состояние, возвращенное Тайм-аутом, с текущим состоянием и увидеть, что Сервер не ответил, и решить, что делать. Если запрос больше недействителен, вы можете проигнорировать ответ. Если это так, вы можете посмотреть атрибут «TimeToBeReceived» для сообщения сервера. Он будет отбрасывать сообщения, которые не может получить в назначенное время.

person Adam Fyles    schedule 17.09.2010