TL; DR; -我想在ASB主题上使用10k-100k相关过滤器,将传入消息路由到websocket服务器以向用户传递通知。
上下文:我正在尝试设计一种分布式通知传递系统的设计,该系统使用WebSocket(WS)服务器群集向连接到WS服务器的客户端传递通知(包括聊天和用户帐户事件)。显然,由于WS连接在客户端和WS之间是粘滞的,所以当事件在系统中某个地方发出时,为了将其传递到正确的客户端,我需要知道应该由哪个WS服务器处理消息。
尽管由于缺少确认功能或排队而我不想使用Redis pub / sub,RabbitMQ似乎很合适:我可以设置直接交换,以便每当WS服务器启动时, ,它将在该交换下创建一个新队列,并且每次客户端连接到WS服务器时,我都会在交换和WS服务器队列之间添加一个新的绑定键(等于用户ID)。这样,当事件以给定的用户ID发布到交易所时,所有WS服务器都将在其队列中获取消息以进行处理。
但是,无论是出于设置/配置的原因还是出于成本的原因,我都不想管理自己的RabbitMQ集群。鉴于我的应用程序很可能托管在Azure上,因此我不妨利用Azure Service Bus。直到最近,我还不知道它可以处理这样的工作负载,但我读到如果使用主题(相当于RMQ交换),则每个WS服务器都可以创建自己的订阅(相当于RMQ队列)并添加过滤器订阅,以便将具有某些属性的消息发布到该主题时,订阅(即WS服务器的队列)将在过滤后将消息传递给它。 设置为每次客户端连接到WS服务器时,该服务器将为其订阅添加一个新过滤器,该过滤器等于用户的ID。
这意味着,如果我有10,000个具有WS连接的活动用户,那么我的主题上将设置10k过滤器。
我对两个主要方面感兴趣(但希望能有更多的见解!)
是否正在快速向订阅中添加新功能并提高CPU /内存效率?
如果我每秒接收大约100条消息,是否有1万个相关过滤器(也许还有更多!ASB似乎在一个主题上最多支持10万个相关过滤器)会大大增加我的延迟?我希望(事件发布到ASB)->(客户端收到消息)的端到端延迟小于100ms。 (因此,必须包括ASB的使用,向WS服务器的交付以及从那里到客户端的交付)。
如果没有好的或直接的答案,我也会感谢定性的见解:)
谢谢!