При общении через http-запросы между микросервисами довольно легко ответить пользователям сообщениями об ошибках, вы можете просто поймать ошибку другого сервиса и перенаправить ее пользователю.
Но как работает обработка ошибок при общении через очередь сообщений?
Например, пользователь делает запрос к службе аутентификации, и эта служба аутентификации публикует сообщение о том, что необходимо создать нового пользователя. Служба пользователей использует это сообщение и пытается создать нового пользователя. Но что, если служба пользователей выдает ошибку, возможно, электронная почта уже занята. Как мы уведомим пользователя о том, что его запрос не выполнен?
Я предполагаю, что невозможно ответить пользователю с этой ошибкой, потому что первоначальный запрос к серверу аутентификации уже закрыт после публикации сообщения в очереди. Может ли это быть лучшим случаем для синхронной связи?
client -> Auth Service User Service
| ↑ |
| create User create User | | Fails to create User
| | |
↓ | ↓
----------------------Async Queue----------------------
Первый - отправить сообщение обратно. Служба пользователя знает, что служба auth отправила запрос, поэтому завершит цикл, сообщив об ошибке (или успехе).
Второй вариант - иметь общую БД рядом с очередью сообщений. Эта общая БД хранит информацию о заданиях, включая время, статус и информацию об ошибках.
Первый вариант лучше масштабируется и, как правило, более отказоустойчив, но его сложнее отлаживать, визуализировать и координировать.