Вы не упомянули протокол, по которому взаимодействуют все ваши сервисы, ради этого ответа я предполагаю HTTP.
Как вы сказали, ни одно из ваших возможных решений не похоже на то, что они будут работать на вас.
Службам слишком легко изменить состояние до или после проверки состояния, и, как вы сказали, любое корректирующее действие впоследствии также может легко потерпеть неудачу.
Я думаю, что в сценарии, который вы обрисовали в общих чертах, двухфазный коммит не может быть и речи. даже если вы владеете всеми службами, трудно получить это право, используя только HTTP.
Согласен
Из всех вариантов у этого есть ноги. Все зависит от ваших требований к «в реальном времени». Всякий раз, когда кто-то говорит это, я спрашиваю: что ты имеешь в виду? ничто не является «реальным временем», все занимает некоторое время для обработки. У кого-то всегда есть промежуток времени или что-то просящее, чтобы что-то было сделано, чтобы это действительно было сделано! разница между миллисекундами и секундами - это вопрос или требования, и сколько денег вы должны бросить.
Итак, вы говорите, что вызов вашей службы (давайте назовем его X) по HTTP вызывает две службы A и B снова синхронно и через HTTP. Если у вас много вызовов к X одновременно, нет способа (или, по крайней мере, его очень сложно) обеспечить порядок вызовов к A, что приведет к тому же порядку вызовов к B. Но это опять-таки зависит от ваших требований и того, что система работает и как, может быть, в вашу систему поступает только один звонок в день?
Лично я бы порекомендовал использовать очереди и перейти к архитектуре, управляемой событиями. Даже при наличии в конечном итоге непротиворечивой системы она может работать горячо и получать желаемое «реальное время», это будет стоить вам дороже!
Надеюсь, это было полезно для вас. Мне очень интересно услышать ваши мысли относительно моих предложений.