在搜索了类似WhatsApp这样的聊天应用程序中如何发送/接收消息后,我发现它们使用基于队列的消息系统。我正在尝试找出此功能的高级设计。
根据我的理解,高级设计如下:假设好友1和好友2在线。好友1已经建立了与Web服务器1的HTTP Web连接,而好友2已经建立了与Web服务器2的HTTP Web连接。好友1向好友2发送消息。
现在,当消息到达Web服务器1时,我需要将消息传递给Web服务器2,以便通过已建立的Web连接将消息推回到好友2。
我认为可以在此处使用分布式自定义Java队列,以将消息从一个服务器传播到另一个服务器。一旦消息到达一个服务器,它将使用消息内容、fromUserId、toUserId将其推送到分布式队列(由于负载平衡和高可用性而使用分布式队列)。队列上会有监听器,它会查看刚刚弹出的消息的目标用户ID,并查找目标用户ID在哪个Web服务器上是活动的。如果用户处于活动状态,则弹出消息并将其推送到客户端;否则,将其存储在数据库中,以便在用户上线时可以拉取。为了查看哪个用户在哪个服务器上处于活动状态,我们可以使用userId作为键,serverName作为值来维护treemap以进行高效查找。
实际设计可能比上述简要描述更复杂/可扩展。想知道这是否是可扩展聊天应用程序的正确方向?
此外,我认为我们需要拥有多个分布式队列而不是一个分布式队列来支持这样的可扩展应用程序。但是,如果我们拥有多个分布式队列,系统如何确保在分布式队列之间进行先进先出的消息传递?
根据我的理解,高级设计如下:假设好友1和好友2在线。好友1已经建立了与Web服务器1的HTTP Web连接,而好友2已经建立了与Web服务器2的HTTP Web连接。好友1向好友2发送消息。
现在,当消息到达Web服务器1时,我需要将消息传递给Web服务器2,以便通过已建立的Web连接将消息推回到好友2。
我认为可以在此处使用分布式自定义Java队列,以将消息从一个服务器传播到另一个服务器。一旦消息到达一个服务器,它将使用消息内容、fromUserId、toUserId将其推送到分布式队列(由于负载平衡和高可用性而使用分布式队列)。队列上会有监听器,它会查看刚刚弹出的消息的目标用户ID,并查找目标用户ID在哪个Web服务器上是活动的。如果用户处于活动状态,则弹出消息并将其推送到客户端;否则,将其存储在数据库中,以便在用户上线时可以拉取。为了查看哪个用户在哪个服务器上处于活动状态,我们可以使用userId作为键,serverName作为值来维护treemap以进行高效查找。
实际设计可能比上述简要描述更复杂/可扩展。想知道这是否是可扩展聊天应用程序的正确方向?
此外,我认为我们需要拥有多个分布式队列而不是一个分布式队列来支持这样的可扩展应用程序。但是,如果我们拥有多个分布式队列,系统如何确保在分布式队列之间进行先进先出的消息传递?