Большое многопользовательское приложение реального времени с Google App Engine - PullRequest
9 голосов
/ 03 декабря 2011

Я создаю многопользовательское приложение реального времени с Google App Engine (Python), которое будет выглядеть как подключаемый модуль Facebook для прямой трансляции: https://developers.facebook.com/docs/reference/plugins/live-stream/

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

Мои вопросы:- Может ли App Engine масштабировать до такого числа?- Если да, то как бы вы его разработали?- Если нет, что бы вы предложили?

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

Я знаю мое узкое место в задании .Все уведомлены через одну и ту же задачу / запрос.Прямо сейчас для 30 подключенных пользователей это длится около 1 секунды, поэтому для 100 000 пользователей вы можете себе представить, сколько времени это может занять.

Как бы вы исправили это?

Большое спасибо

1 Ответ

11 голосов
/ 03 декабря 2011

Сколько обновлений на пользователя вы ожидаете в секунду? Если каждый пользователь обновляется только один раз в час, вы будете отправлять 10 ^ 12 сообщений в час - каждое отправленное сообщение приводит к еще 1 000 000 отправкам. Это 277 миллион сообщений в секунду. Иными словами, если каждый пользователь отправляет сообщение в час, то получается 277 входящих сообщений в секунду или 277 миллионов исходящих сообщений.

Так что я думаю, что ваш базовый дизайн имеет недостатки. Но основной вопрос: «Как передать одно и то же сообщение множеству пользователей» остается в силе, и я рассмотрю его.

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

Для подобных случаев - множество клиентов, которым нужны точно такие же данные без сохранения состояния , я бы посоветовал вам использовать опрос, а не API канала, поскольку каждый клиент будет получать точно такой же информация - нет необходимости отправлять индивидуальные сообщения каждому клиенту. Определите приемлемую среднюю задержку (например, 1 секунду) и выполните опрос с удвоенной частотой (например, 2 секунды). Напишите очень легкий сервлет с поддержкой memcache, чтобы просто получить самый последний блок данных и позволить клиентам дуплетировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...