Обновление центрального кеша с изменением различных системных данных в масштабируемой архитектуре микросервисов

Мы создаем микросервисную систему, в которой новые данные могут поступать из трех (или более) разных источников и которые в конечном итоге влияют на конечного пользователя.
Неважно, какова цель системы для вопроса, поэтому я действительно попробуй сделать просто. Пожалуйста, смотрите прилагаемую схему.

Данные могут поступать из следующих источников:

  1. Сайт бэк-офиса: определите конфигурацию системы и пользователя.
  2. Основной сайт: место, где пользователь взаимодействует с сайтом и совершает действия.
  3. Данные из внешних источников: например, партнеры, которые могут предоставить дополнительные данные (дополнительную информацию) о пользователях.

Услуги:

  1. Служба бэк-офиса сайта: обслуживание сайта бэк-офиса.
  2. User-service: обслуживать основной сайт.
  3. Служба импорта: импортирует дополнительные данные (дополнительную информацию) из внешних источников.
  4. Служба пользовательского кэша: синхронизируйте все вышеуказанные системные данные и объедините их в заранее подготовленные ответы кэша. Причина этого в том, что основной сайт должен обслуживать сотни миллионов пользователей и работать с очень низкой задержкой.

Основная идея:

  1. У каждого микросервиса своя БД.
  2. Каждый микросервис может масштабироваться.
  3. Каждое изменение данных в одной из трех частей влияет на пользователя и должно быть отправлено в службу кэширования, чтобы в конечном итоге это отразилось на основном сайте.
  4. Кэш (Redis) содержит все данные, объединенные в заранее подготовленные ответы для основного сайта.
  5. Каждое изменение данных службы будет опубликовано в теме pubsub для службы кеша для обновления базы данных Redis.
  6. Система должна обслуживать около 200 миллионов пользователей.

Итак... вопросы: .

  1. поскольку служба пользовательского кэша может (и должна) масштабироваться, что произойдет, если, например, на pubsub ожидаются два сообщения с данными об обновлении, одно старое, а другое новое. как обрабатывать только новое сообщение и предотвратить случай, когда один экземпляр службы кеша обновляет данные нового сообщения до Redis и только после того, как другой экземпляр службы кеша переопределяет его старым сообщением.
  2. Также бывает случай, когда экземпляру Cache-сервиса нужно сначала прочитать текущие пользовательские данные кеша, внести в них изменение и только потом обновить кеш новыми данными. Как предотвратить случай, когда два экземпляра, например, читают текущие данные кеша, а третий экземпляр обновляет его новыми данными и переопределяет его своими данными.
  3. Можно ли вообще заранее подготовить ответы на основе нескольких источников, которые могут периодически меняться?? каков правильный подход к этой проблеме?

    Схема архитектуры системы


person tomn    schedule 10.11.2018    source источник


Ответы (1)


Я постараюсь ответить на некоторые из ваших вопросов, дайте мне знать, если я неправильно понял, о чем вы спрашиваете.

1) Я полагаю, вы спрашиваете о том, как обеспечить порядок сообщений, чтобы старое обновление не отменяло более новое. Поле «publish_time» сообщения (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.PubsubMessage) для координации на основе времени, полученного облачным сервером pubsub. ваш запрос на публикацию. Если вы хотите координировать на основе какого-либо другого механизма времени или порядка, вы можете добавить атрибут в свой PubsubMessage или полезную нагрузку, чтобы сделать это.

2) Похоже, это общая проблема синхронизации, не обязательно связанная с облачным pubsub; Я оставлю это другим, чтобы ответить.

3) Облачный поток данных реализует механизм окон и водяных знаков, аналогичный тому, что вы описываете. Возможно, вы могли бы использовать это для удаления конфликтующих обновлений и выполнения предварительной обработки перед их записью в резервное хранилище. https://beam.apache.org/documentation/programming-guide/#windowing< /а>

-Дэниел

person Daniel Collins    schedule 13.11.2018