межсерверный многоадресный обмен сообщениями с помощью Google Cloud PubSub?

У меня есть кластер внутренних серверов на GCP, и им нужно отправлять сообщения друг другу. Все серверы должны получать каждое сообщение, но я могу допустить низкий уровень ошибок. Я могу иметь дело с получением сообщения более одного раза на данном сервере. Порядок пакетов не имеет значения.

Мне не нужно много слоя постоянства. Сообщение становится устаревшим в течение нескольких секунд после его отправки.

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

Размер моего кластера серверов динамически определяется автомасштабированием. Он запускает экземпляры ВМ по мере необходимости с динамическими именами хостов и IP-адресами. Нет удобного способа сопоставить динамические хосты со статическими подписками, но кажется, что это мой единственный реальный вариант: создать больше подписок, чем мой максимальный размер пула серверов, а затем использовать какую-то систему paxos (конфигурация времени выполнения, zookeeper, что угодно) для выделения серверов подпискам.

Мне начинает казаться, что, несмотря на то, что мой вариант использования кажется очень простым («Каждый сервер может отправить многоадресное сообщение на любой другой сервер в моей группе»), он может не подходить для Cloud PubSub.

Должен ли я использовать GCM/FCM? Или какая-то другая технология?


person Stevey    schedule 26.03.2018    source источник


Ответы (1)


Cloud Pub/Sub может вам подойти или не подойти, в зависимости от размера вашего серверного кластера. Неспособность подтвердить сообщения, безусловно, не сработает, потому что вы не можете быть уверены, что каждый экземпляр получит сообщение; его можно просто повторно доставлять в один и тот же экземпляр снова и снова.

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

person Kamal Aboul-Hosn    schedule 26.03.2018