如何在Web应用程序中使用ServiceStack Redis来利用pub/sub范例

Oli*_*VAL 7 asp.net asp.net-ajax publish-subscribe redis servicestack

我对Pub/Sub范例感兴趣,以便提供一个通知系统(即:像Facebook一样),特别是在一个Web应用程序中,该应用程序具有发布者(在同一Web服务器IIS上的多个Web应用程序中)和一个或多个订阅者,收费以在网络上显示前端用户的通知.

我发现了Redis,它似乎是一个很棒的服务器,提供了有趣的功能:缓存(如Memcached),Pub/Sub,队列.

不幸的是,我没有在Web上下文(ASP.NET,使用Ajax/jQuery)中找到任何示例,除了WebSockets和NodeJS,但我不想使用那些(太早).我想我需要从出版商接收消息的过程(用户),但我不知道怎样做,在一个Web应用程序(发布/订阅正常工作与单元测试).

编辑:我们目前使用.NET(ASP.NET Forms)并试用ServiceStack.Redis库(http://www.servicestack.net/)

myt*_*thz 5

实际上Redis Pub/Sub很好地处理了这个场景,因为Redis是一个异步非阻塞服务器,它可以便宜地保存很多连接并且可以很好地扩展.

Salvatore(又名Mr Redis :) 描述了发布和订阅操作的O(1)时间复杂度:

您可以将订阅/取消订阅的工作视为一个常量时间操作,O(1)用于订阅和取消订阅(实际上,如果您已经使用相同的客户端订阅了许多模式,PSUBSCRIBE会比这更多工作 ).

...

关于内存,它类似于或小于密钥使用的内存,因此即使在小型服务器中也不会有订阅数百万个频道的问题.

因此Redis不仅能够为这种情况设计能力,而且Tom为了维持持久连接而指出的问题用户需要长时间运行的连接(又名http-push/long-poll),每个活跃的用户都会接受它自己的线程.持有一个线程对于可扩展性并不是很好,从技术上来说,最好使用像Manos de Mono这样的非阻塞http服务器或者同步和非阻塞的node.js,它们可以处理这种情况.注意:WebSockets对于通过HTTP的实时通知更有效,因此理想情况下,如果用户浏览器支持它,则使用它,如果不支持,则回退到常规HTTP(或者回退到客户端上使用Flash for WebSockets).

所以不是Redis或它的Pub/Sub不能在这里扩展,它是一个线程HTTP服务器(如IIS或Apache)的并发连接数,这就是说它仍然可以支持相当数量的并发用户使用IIS(这篇文章建议3000),因为IIS是瓶颈而不是Redis,你可以轻松地在混合中添加额外的IIS服务器并分配负载.


ElH*_*aix 5

对于这个应用程序,我强烈建议使用SignalR,这是一个.Net框架,可以实现对连接客户端的实时推送.


Tom*_*son 3

Redis 发布/订阅不是为这种情况设计的 - 它需要与 Redis 的持久连接,如果您正在编写工作进程,但在处理无状态 Web 请求时则不需要。

通过 http 为最终用户工作的发布/订阅系统需要更多的工作,但不会太多 - 最简单的方法是为每个通道使用排序集并记录用户上次收到通知的时间。您还可以使用记录每个频道的订阅者的列表来完成此操作,并在添加通知时写入每个用户的收件箱列表。

使用这两种方法中的任何一种,用户都可以非常快速地检索新通知。这将是一种轮询形式,而不是真正的推送通知,但由于 http 的性质,您并不能真正摆脱它。

从技术上讲,您可以将 redis pub/sub 与长时间运行的 http 连接一起使用,但如果每个用户都需要自己的线程与活动的 redis 和 http 连接,则可伸缩性不会很好。