我需要设计类似的东西,比如什么应用程序或任何像模块这样的信使。
高流量
Client > Load Balancer > Web servers(assume 10 clustered server for now) > Rest based controller > Service > DAO > DB
挑战 :-
说朋友 1 和朋友 2 在线。朋友 1 已与网络服务器 1 建立 HTTP 网络连接,而朋友 2 已与网络服务器 2 建立 HTTP 网络连接。朋友 1 将消息发送给朋友 2。
现在,一旦消息到达网络服务器 1,我需要将消息传送到网络服务器 2,以便可以通过已经建立的网络连接将消息推送回朋友 2
我在这里有几个相关的问题:-
- 我可以使用分布式队列 将消息从一台服务器传播到另一台服务器。一旦消息到达一台服务器,它就会将其推送到分布式队列(由于负载平衡和高可用性而导致的分布式队列),消息内容为fromUserId,toUserId。我的问题是如何通知正确的服务器(在本例中为 Web 服务器 2)?因为如果我使用 JMS 队列,只有一台服务器会通过监听器得到通知。如果我使用主题,所有服务器都会收到通知。在这种情况下,除了 fromUserId 所在的一个服务器之外,所有服务器都可以拒绝该消息。有没有更好的方法让队列根据一些元数据通知正确的服务器?
此外,如果destinationUserId 处于脱机状态,我需要将消息放回队列中。不确定如何实现?我相信我们需要使用其他一些队列实现(可能是基于 java 的内存队列)而不是 JMS 队列/主题?服务器代码只有在得到客户端的确认后才会从自定义队列中删除消息。
如果在发送消息时任何客户端处于离线状态,在这种情况下,当他上线时,他将发送拉取请求。服务器将向分布式队列发出请求,分布式队列将从正确的物理队列中提取消息。我的问题是分布式队列是否应该将destinationUserId 和消息作为元数据中的值保留?
DB vs Queue :- 使用这种方法,我相信不需要将消息存储在 DB 中,这在高度实时的应用程序(如 messenger)中可能比队列(内存中的队列)成本高(时间复杂度)。我们只需要在 db 中存储用户/组的详细信息。
更新:-我在quora上找到了相关链接,最后一点,即What protocol is used in Whatsapp app ?...
Kah Seng Tay 也证实了使用 queue 的类似方法,但我在 queue 上的上述问题仍未得到解答。