У меня есть распределенная последовательность действий микросервиса. Службе A нужно сказать службе B что-то сделать, и как только это будет завершено, она сообщит об этом службе C. Последовательность важна, поэтому я использую шаблон саги, как вы можете видеть.
Моя проблема заключается в том, что служба B может масштабироваться, и каждый экземпляр должен получить сообщение и выполнить действие. Действие должно выполняться для каждого экземпляра службы B. Затем служба C должна запускаться только после того, как все экземпляры службы B завершат свою задачу.
Это очистка кеша, которая должна происходить на каждом экземпляре. У меня нет контроля над этой архитектурой, поэтому кеш службы B связан с каждым экземпляром. Если бы я мог, у меня был бы общий кеш для экземпляров.
Я придумал это решение для оркестровки, но оно требует сохранения состояния и большого количества дополнительного кода для обработки крайних случаев, которых я хотел бы избежать.
Есть ли лучшая альтернатива этому?
Предполагая, что вы не можете изменить архитектуру службы B, вы уловили существенную сложность операции: A должен будет отслеживать экземпляры службы B и иметь дело с массой пограничных случаев. Этот процесс в основном зависит от состояния.
Если команда очистки кеша является идемпотентной (т. е. вас не волнует, если она повторяется несколько раз в процессе), вы можете упростить некоторые операции пограничного случая и избавиться от состояния, которое будет менее устойчивым (в случае неудачи вы можете начать с начинать вместо того, чтобы реконструировать, где вы были в процессе).
Справедливо. Это помогает взглянуть на это другим умом. Благодарю вас!