Обработка ошибок в микросервисной архитектуре и асинхронной очереди сообщений

Обработка ошибок в микросервисной архитектуре и асинхронной очереди сообщений
Обработка ошибок в микросервисной архитектуре и асинхронной очереди сообщений - growtika @ Unsplash

При общении через http-запросы между микросервисами довольно легко ответить пользователям сообщениями об ошибках, вы можете просто поймать ошибку другого сервиса и перенаправить ее пользователю. Но как работает обработка ошибок при общении через очередь сообщений?
Например, пользователь делает запрос к службе аутентификации, и эта служба аутентификации публикует сообщение о том, что необходимо создать нового пользователя. Служба пользователей использует это сообщение и пытается создать нового пользователя. Но что, если служба пользователей выдает ошибку, возможно, электронная почта уже занята. Как мы уведомим пользователя о том, что его запрос не выполнен?

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

Пример потока:

client -> Auth Service                              User Service
                   |                                       ↑  |
                   | create User               create User |  | Fails to create User
                   |                                       |  |
                   ↓                                       |  ↓
           ----------------------Async Queue----------------------

В общем, у вас есть два варианта:

Первый - отправить сообщение обратно. Служба пользователя знает, что служба auth отправила запрос, поэтому завершит цикл, сообщив об ошибке (или успехе).

Второй вариант - иметь общую БД рядом с очередью сообщений. Эта общая БД хранит информацию о заданиях, включая время, статус и информацию об ошибках.

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


LetsCodeIt, 17 декабря 2022 г., 19:33