Как вы управляете веб-сокетами в приложении, которое масштабируется по горизонтали? - PullRequest
3 голосов
/ 05 августа 2020

У меня есть приложение, написанное на Golang, размещенное на Google App Engine и использующее Firestore в качестве серверной части.

Google App Engine масштабируется по горизонтали.

Я использую серверную часть Firebase для отправки сообщения веб-сокета. Поэтому не имеет значения, к какому экземпляру App Engine подключен пользователь.

Каждый раз, когда пользователь проходит аутентификацию, создается веб-сокет и становится доступен список онлайн-пользователей.

В Firestore, Я просто помечаю этого пользователя как «Активный», когда его сокет подключен, и как «Неактивный», когда он отключен.

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

Веб-клиенты не подключены к Firebase. Только на сервер Go.

Я не могу отметить всех пользователей как неактивных при запуске приложения. Поскольку несколько приложений могут запускаться из-за загрузки большего количества экземпляров App Engine. Если бы я сделал это, пользователи, которые находятся в сети, были бы помечены как отключенные при загрузке нового экземпляра из-за нагрузки.

Как можно обойти такие проблемы?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Это не ясно из вашего вопроса, но похоже, что вы надеетесь, что клиентское приложение может управлять активным состоянием в зависимости от подключения сокета. Это вообще не сработает, отчасти из-за ваших наблюдений здесь, но также потому, что, если клиент полностью потеряет соединение, он также не сможет обновить статус на бэкэнде.

Вам следует управлять статус подключения с помощью веб-сокета с точки зрения серверной части. Он никогда не должен терять возможность подключения. (Фактически, это то, как Realtime Database управляет своим присутствием .)

1 голос
/ 05 августа 2020

Существует способ обновлять базу данных, периодически отслеживая состояние приложения, располагая сервер мониторинга посередине (app- [monitor] -firebase).

...