Мы столкнулись с этой же проблемой и временно решили ее, используя сравнение отметок времени LastUpdated
(та же концепция, что и у вашего VersionNumber).Каждую ночь (когда наше приложение работает медленно), каждый сервис публикует сообщение ServiceXLastUpdated
, которое включает самую последнюю временную метку, когда принадлежащие ей данные были добавлены / отредактированы.Любая другая служба, которая подписывается на эти данные, обрабатывает сообщение и, если имеется несоответствие, запрашивает все строки, к которым был произведен переход, с момента последнего локального обновления, чтобы он мог вернуться в синхронизацию.
Для нас, на данный момент, этоЭто нормально, так как новые сервисы не имеют тенденцию выходить в интернет и использоваться в тот же день.Но наш план на будущее заключается в том, что каждый раз, когда служба запускается, она может публиковать сообщение для каждой подписанной службы, указывающее, что это самая последняя отметка времени обновления кэша.Если служба «источник» видит, что временная метка не является текущей, она может отправлять обновления для повторной синхронизации данных.Преимущество этого заключается в отправке только необходимых обновлений определенной службе (службам), которая в них нуждается, хотя (по крайней мере для нас) все подписанные службы имеют доступ к сообщениям.
Мы начали с использования постоянных очередей, поэтомуесли бы все экземпляры микросервиса были недоступны, сообщения просто создавались бы в его очереди.Есть 2 проблемы, которые привели нас к созданию чего-то лучшего:
1) Очевидно, что это не решает сценарий «первого запуска», так как нет очереди для сообщений, которые нужно создать в
2) Если НИЧЕГО не работает либо при хранении сообщений в очереди, либо при их обработке, вы не синхронизированы.Если это произойдет, вам все еще нужен упреждающий механизм, подобный тому, который есть у нас сейчас, чтобы восстановить синхронизацию.Таким образом, казалось, что стоит пойти по этому пути
Я бы не сказал, что наш метод - «лучшая практика», и если он есть, я не знаю об этом.Но способ, которым мы это делаем (включая запланированную будущую работу), до сих пор оказался простым для построения, легким для понимания и мониторинга и надежным, поскольку крайне редко мы получаем событие, вызванное несинхронизированными локальными данными.