我正在开发一个具有各种类型通知的应用程序。通知示例:
- 已创建消息
- 已提交清单
- 上市批准
我想将所有这些都与 SignalR 联系起来,以便任何连接的客户端都能实时获得更新。
就架构而言 - 现在应用程序完全位于托管在 Azure 网站上的单个解决方案中。这些通知类型中的每一个的触发器都存在于此应用程序中。
当触发器被触发时,我想告诉 signalR,“嘿,将此消息发送给以下客户端”以及用户 ID 列表。我假设可以根据 userId 识别连接的客户端......并且我假设send message to clients
应该在 Web 应用程序之外执行该过程,以免减慢 MVC 应用程序或冒丢失数据的风险异步调用中断。第一个问题——这些假设是否正确?
假设是这样,这意味着我需要一个专门的网络/工作者角色来向客户发送消息。我可以将消息从我的 Web 应用程序直接传递到这个进程,但是如果进程终止会发生什么?弹性问题让我相信传递消息的正确方法是通过某种队列。第二个问题——这是一个有效的思路吗?
假设是这样,这意味着我可以使用一个好的 ol' Azure SQL 数据库作为队列,但似乎有一些专门的(可能更便宜的)服务来处理消息队列,例如:
http://www.windowsazure.com/en-us/develop/net/how-to-guides/queue-service/
第三个问题:这应该用作signalR的排队机制吗? 我有兴趣在未来使用 Redis 进行缓存...... Redis 会比队列服务更好还是更差?
最后一个问题:
我试图在这里说明我提出的架构:
我在这里最不清楚的是 MVC 应用程序如何知道何时排队,或者 SignalR 进程如何知道何时广播。MVC 应用程序是否应该盲目排队,而不关心连接的客户端?这似乎在队列上引入了大量浪费的空间,并在工作角色中浪费了周期,因为只有极少数的客户端会被连接。
我能想到的唯一其他方法是以某种方式让 MVC 应用程序可以看到 SignalR 进程,以查看客户端是否已连接......如果是,则 Enqueue。不过,这让我感到不舒服,因为这意味着我必须为每个被触发的触发器点击图表上的红线,这 - 即使完成异步 - 让我担心性能和可靠性。
对于可扩展的高性能 SignalR 消息广播,推荐的架构是什么? 性能是重中之重,其次是成本。
奖金问题:
- 如果某些消息的优先级高于其他消息怎么办?是否应该使用两个队列,其中一个总是在另一个之前被检查?