Лучшие практики для отмены рабочих потоков в архитектуре микросервисов - PullRequest
0 голосов
/ 03 мая 2019

У меня есть три службы.

  • Первый генерирует некоторые данные в нескольких потоках и публикует каждый фрагмент сгенерированных данных в очереди.

  • Второй прослушивает эту очередь и обрабатывает каждый фрагмент полученных данных в рабочих потоках прослушивателя Spring Rabbit, а затем публикует результаты в очереди.

  • Третий делает то же самое, что и второй.Все части данных объединены неким уникальным ключом, который распространяется вместе с ними.

Если я получу исключение в некоторых потоках в первом сервисе, я хотел бы отменить все рабочиепотоки в других, которые работают с данными для данного ключа.

Есть ли лучшие рекомендации для этого?

Я думал об использовании чего-то вроде Future/CompletableFuture в Rabbit Listeners.Заверните задачу в нее, сохраните ссылку на нее в некоторой карте по заданному ключу, а затем заблокируйте ее или просто отправьте в вызов.И затем, в случае каких-либо ошибок, я могу опубликовать "fail event" с ключом данных, получить его в других сервисах, перейти на эту карту и отменить всех работников для этого ключа.А также сделать так, чтобы сервисы отклоняли вновь полученные сообщения для этого ключа в будущем.Но я не уверен, что это лучшее решение.

...