Обработка исключений
Обработка исключений в асинхронных сценариях с сообщениями иногда оказывается трудной задачей. Если критерием истины является практика, возможно, нам удастся узнать что-нибудь полезное, наблюдая за обработкой исключений в Starbucks. Что делает кассир, если клиент не может расплатиться? Он выливает напиток, если он уже был приготовлен, или чашка исключается из очереди. Если напиток приготовлен неправильно или неудовлетворительно, его готовят заново. Если эспрессо-машина ломается, и приготовить напиток невозможно, клиенту возвращают деньги. Каждый из перечисленных сценариев представляет конкретную стратегию обработки ошибок:
Аннулирование
Самая простая стратегия обработки ошибок: не делать ничего или ликвидировать уже проделанную работу. На первый взгляд такое решение выглядит сомнительно, но в повседневной коммерческой деятельности оно может оказаться приемлемым. Если потери невелики, может оказаться, что реализация исправления ошибки обойдется дороже, чем простое аннулирование. Например, некоторые провайдеры интернета выбирают такой подход при наличии несоответствий в циклах выставления счетов/обслуживания. В результате клиент может пользоваться услугой без выставления счета. Потери доходов достаточно несущественны, что оправдывает такой подход к ведению бизнеса.
Повторная попытка
Если некоторая группа операций с большим набором «транзакций» завершается неудачей, фактически возможны два варианта: отменить уже внесенные изменения или попытаться повторить те из них, которые не удалось провести. Повторная попытка является приемлемым вариантом при наличии реальных шансов на ее успешное завершение. Например, если операция нарушает действующие бизнес-правила, вряд ли ее удастся повторить со второй попытки. Однако если внешняя система временно недоступна, возможно, повторная попытка окажется успешной. Особым случаем является повторная попытка с Идемпотентным получателем. В этом случае можно просто повторять все операции снова и снова, потому что в случае успеха получатель будет игнорировать дубликаты.
Компенсация
Наконец, в последнем варианте уже завершенные операции отменяются с целью возврата системы в целостное состояние. Например, такие «компенсации» хорошо работают в финансовых системах, где снятые со счета суммы могут компенсироваться их повторным занесением.