Извлечение данных на отдельных серверах

#design-patterns #architecture #api-design #distributed-system #data-sharing

Вопрос:

У меня есть монолитный REST API и отдельный сервер WebSocket, который используется для обновлений в режиме реального времени. Они оба разделены, так что я могу масштабировать их независимо. API извлекает данные из базы данных и отправляет их пользователям, которые запрашивают их, но я также хочу извлекать данные из базы данных на своем сервере WebSocket, и я не уверен, как мне следует это делать согласованным образом.

Варианты: (те, о которых я думал)

  1. Создайте общий модуль базы данных со схемами и моделями для моей базы данных и используйте его на обоих серверах.
  2. На сервере WebSocket я мог бы запросить API, используя токен пользователя, для получения данных от их имени.
  3. Я мог бы разделить свою логику API на архитектуру микросервиса и использовать API в качестве шлюза с логикой аутентификации и перенаправлением запросов к микросервисам, а сервер WebSocket мог бы напрямую запрашивать микросервисы, не проходя через шлюз, поэтому ему не нужно проходить аутентификацию.
  4. Извлеките данные из API с помощью RPC через RabbitMQ.
  5. Вместо этого переместите логику, которая должна запрашивать базу данных, в мой API (не очень идеально)

Беспокойства:

  • Для варианта № 1, по-видимому, это плохой дизайн, и, честно говоря, мне не нужно извлекать много данных на моем сервере WebSocket, только определенные поля (которые можно кэшировать), и если я решу реализовать какую-либо форму кэша базы данных, будет два отдельных кэша (не говоря уже о том, что оба сервера должны быть масштабированы, чтобы было несколько экземпляров). Я мог бы реализовать кэш в своем общем модуле, но это звучит как плохая идея.
  • Вариант № 2 кажется мне довольно разумным. Хотя, опять же, мне не нужно извлекать ВСЕ данные, как вы делали бы при запросе API, может быть, это излишне?
  • Вариант № 3 кажется хорошей идеей, но я не уверен, как ее спроектировать с помощью узла/машинописи, для этого не так много ресурсов, и я также обеспокоен тем, как бы я настроил свой брандмауэр, чтобы внешние пользователи не могли получить доступ к частным микросервисам, ufw достаточно хорош на одном узле, но что, если у меня их несколько? а что, если я решу начать использовать Kubernetes? Просто кажется, что настройка-это заноза в заднице, и она подвержена проблемам.
  • I like option #4 but I’m not sure how fast it’ll be. Since this is a WebSocket server, I need things to happen in real-time as fast possible.
  • Для варианта № 5 «запросы» WebSocket, которым нужны данные, основаны на сеансе сокета, поэтому, если бы я переместил их в API, мне все равно пришлось бы использовать RabbitMQ или pub/sub для отправки запросов на мой сервер WebSocket. Похоже на медленный окольный процесс.

Как бы лучше всего подойти к этому? Есть ли другие варианты?