На самом деле Redis Pub / Sub достаточно хорошо справляется с этим сценарием, так как Redis является асинхронным неблокирующим сервером, он может дешево удерживать многие соединения и хорошо масштабируется.
Сальваторе (он же Мистер Редис :) описывает O (1) сложность времени операций публикации и подписки :
Вы можете рассмотреть работу
подписаться / отписаться как
работа в постоянном времени, O (1) для обоих
подписываться и отписываться
(на самом деле PSUBSCRIBE делает больше работы
чем это, если вы подписаны
уже много моделей с
тот же клиент).
...
По поводу памяти, похоже или меньше
чем тот, который используется ключом, так что вы
не должно быть проблем с подпиской
на миллионы каналов даже в
маленький сервер.
Таким образом, Redis более чем способен и предназначен для этого сценария, но проблема, как указал Том, для того, чтобы поддерживать постоянное соединение, потребует длительных подключений (так называемый http-push / long-poll) и каждого активного пользователя. возьму свою нить. Удержание потока не очень хорошо для масштабируемости, и с технической точки зрения было бы лучше использовать неблокирующий http-сервер, такой как Manos de Mono или node.js , которые являются асинхронными и не блокировка и может справиться с этим сценарием. Примечание: WebSockets более эффективен для уведомлений в режиме реального времени по HTTP, поэтому в идеале вы должны использовать его, если браузер пользователей поддерживает его, и переходить на обычный HTTP, если они этого не делают ( или использовать Flash для WebSockets на клиенте). ).
Таким образом, здесь не масштабируется Redis или его Pub / Sub, а число одновременных подключений, которое использует многопоточный HTTP-сервер, такой как IIS или Apache, при этом вы можете поддерживать достаточное количество одновременных пользователей с IIS ( в этом посте предлагается 3000 ), и поскольку IIS является узким местом, а не Redis, вы можете легко просто добавить дополнительный IIS-сервер в смесь и распределить нагрузку.