我将设计一个系统,其中客户端和Web应用程序之间存在双向通信。 Web应用程序可以从客户端接收数据,以便它可以将其持久保存到数据库等,同时它还可以向客户端发送指令。出于这个原因,我将使用Node.JS和Socket.IO。
我还需要使用RabbitMQ,因为我希望如果Web应用程序向客户端发送指令,并且客户端关闭(因此套接字已经丢失),我希望它排队等级,以便每次都可以发送它客户端再次连接并创建一个新套接字。
从客户端到Web应用程序,它应该非常简单,因为客户端使用套接字将数据发送到Node.JS应用程序,然后Node.JS应用程序将其发送到队列,以便最终将其转发到Web应用。从这个方向来看,如果套接字关闭,则没有互联网连接,因此数据不会首先发送,也不会缓存在客户端上。
我关心的是另一个方向,在我以这种方式设计它并实际实现它之前我想要一个答案,所以我可以避免碰到任何砖墙。假设Web应用程序尝试向客户端发送指令。如果套接字可用,则Web应用程序将指令转发到队列,队列又将其转发到Node.JS应用程序,然后使用套接字将其转发到客户端。到现在为止还挺好。另一方面,如果来自客户端的互联网连接已经丢失,因此套接字当前已关闭,则Web应用程序仍将该指令发送到队列。我的问题是,当队列将指令转发给Node.JS,并且Node.JS发现套接字不存在,因此无法发送指令时,队列是否会收到Node.JS的回复,表示它无法转发数据,因此它应该保留在队列中?如果是这样的话,那将是完美的。当客户端设法连接到互联网时,它将再次执行握手,队列将再次尝试发送到Node.JS,只有这次Node.JS设法将指令发送给客户端。
这是否是这些组件如何相互作用的正确推理?
答案 0 :(得分:1)
这不会按你想要的方式运作。
当节点进程从rabbitmq收到消息并看到套接字消失时,您可以轻松地nack
将消息返回队列。
但是,该消息将立即再次处理。它不会坐在那里无所事事。节点进程将再次获取它。你最终会得到你的node / rabbitmq thrashing,因为它只是一遍又一遍地忽略一条消息,等待套接字重新上线。
如果您为没有连接的客户端发送了数十条或数百条消息,那么您将有数十条或数百条消息在这样的圆圈中晃动。它会破坏你的节点进程和rabbitmq的性能。
我的建议:
当节点应用程序从rabbitmq收到消息,并且套接字不可用于客户端时,将消息放入数据库表并将其标记为等待该客户端。
当客户端重新连接时,检查数据库中是否有任何待处理消息,并在此时转发所有消息。