Проблема масштабирования Socket.IO в реальном времени - python - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь сделать что-то вроде потока на Facebook , с socket.io 0.6 и tornadio.

Каждый пользователь имеет свой кометный канал / группу в своей стене. Я посылаю кометное сообщение на стену всем своим друзьям (даже если они не в сети).

Проблема в масштабировании : что если у меня 1 миллион друзей? Это заняло бы много времени, чтобы написать во всех стенах.

Есть ли какое-нибудь решение, более эффективное, чтобы сделать это, используя комету?

1 Ответ

2 голосов
/ 27 сентября 2011

Это сложная проблема в социальном пространстве.Существует компромисс между двумя подходами:

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

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

Я в соавторстве написал бумагу о том, как это сделатьэто эффективно.По сути, мы использовали гибридный метод, определяющий, когда выполнять push или pull на основе статистики пользователя.

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

...