2013-08-26 4 views
3

Я хотел бы реализовать чат-систему как часть игры, которую я разрабатываю в App Engine. Чтобы реализовать это, я хотел бы использовать WebSockets и подключать клиентов друг к другу, хотя концентратор, в данном случае экземпляр GCE. Предполагая, что эта игра должна масштабироваться до нескольких экземпляров на GCE, как это будет работать? Если у меня был клиент 1, и балансировщик нагрузки направил запрос клиента 1 в экземпляр A, а другой клиент (2) пришел и был направлен в экземпляр B, но эти клиенты хотели общаться друг с другом, каждый из них был бы связанные с разными концентраторами, и не смогут достичь друг друга. Как это будет настроено для работы со шкалой? Будет ли я реализовывать его с помощью очередей, где каждый экземпляр прослушивает эту очередь, и если да, то как мне это сделать?Масштабирование WebSockets на Google Compute Engine

ответ

2

Google Play Game Services предлагает именно те функции, которые вы хотите, но в отношении клиентов Android и ios. Таким образом, этот вариант может быть несовместим с вашим техническим дизайном игры.

В целом вы рассуждаете правильно. Сообщения от клиента, которые хотят поговорить друг с другом, чаще всего попадают в разные экземпляры сервера. То, что вы хотите сделать, - заставить экземпляры обрабатывать связь между пользователями. Pub/sub (publish-subscribe pattern) - очень подходящий шаблон в этом сценарии. Грубо говоря:

  • всякий раз, когда есть сообщение, направленное на клиента X сообщение опубликовано на канале X,
  • всякий раз, когда клиент X создает сеанс, обработки экземпляра он поддерживает канал X.

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

Вы можете ожидать, что один экземпляр любого решения сможет обрабатывать тысячи QPS.

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

PS. Существуют и другие темы, которые вы можете изучить, например: сохранение сообщений и восстановление отказа. Здесь я вообще не обращался.

0

Я не пытался реализовать это, но, скорее всего, мне скоро придется, я думаю, это должно быть довольно просто справиться с этим.

У вас есть: сервер 1 со списком клиентов и у вас есть сервер 2 с другим списком клиентов, поэтому, если клиент хочет послать данные другому клиенту, который может находиться на сервере 2, вы должны:

  1. Поиск, если ресивер находится на текущем сервере - если это так, вы просто отправляете его (стандарт)
  2. В противном случае вы отправляете одни и те же данные на все другие серверы, которые у вас есть, поэтому они будут проверять свои списки для конкретного клиента (или клиентов)) и отправить данные им.