Я создаю приложение чата в React Native, а бэкэнд находится в Node.JS Я использую GKE для развертывания кода сервера.
Я использую облако sql postgresql, соединяясь с внутренним IP. Это работает. Я также использую Memorystore (Redis). Вот проблема.
Для автоматического масштабирования я планирую получить несколько кластеров GKE в разных регионах (на данный момент, europe-west1 и us-central1). Я настроил балансировщик нагрузки с одним бэкэндом, содержащим все группы экземпляров. Я не знаю, это правильное / идеальное решение, но оно работает. Проблема заключается в том, что вы можете подключиться к базе данных Redis только из экземпляра в том же регионе. Если я использую use-central1 в качестве региона для своего экземпляра memorystore, я не могу подключиться к нему через виртуальные машины в кластере eu, который я создал.
Как лучше всего решить эту проблему? Я создал дополнительную виртуальную машину в том же регионе, что и экземпляр redis, с haproxy, настроенным для использования в качестве обратного прокси-сервера для memorystore, и таким образом я могу подключаться к базе данных redis через все экземпляры, независимо от того, в каком регионе они находятся в. Но я не знаю, является ли это правильным решением?
РЕДАКТИРОВАТЬ:
Я использую websockets (socket.io) для сообщений чата. Поскольку я планирую использовать несколько серверов, мне нужна централизованная база данных для хранения (ссылок на) идентификаторов сокетов, чтобы пользователи могли отправлять сообщения пользователям, которые подключены к другим серверам.
Я думаю, что redis является правильным решением по ряду причин:
- Я могу использовать socket.io-redis для хранения идентификаторов сокета на redis
- быстрое время ответа
- I не знаю, сколько данных хранится, но это точно не МБ
Я использую базу данных postgresql для хранения другой информации (например, имени пользователя, паролей), но, похоже, мне, что Redis является гораздо лучшим решением для приложений реального времени.