通过 Socket.IO 将数据从 RabbitMQ 发送到 Node.JS
Sending data from RabbitMQ to Node.JS via Socket.IO
我将设计一个系统,在该系统中,客户端和 Web 应用程序之间存在双向通信。 Web 应用程序可以从客户端接收数据,以便将其保存到数据库等,同时它还可以向客户端发送指令。因此,我将使用 Node.JS 和 Socket.IO。
我还需要使用 RabbitMQ,因为我希望如果 Web 应用程序向客户端发送指令,并且客户端已关闭(因此套接字已断开),我希望将其排队以便发送每当客户端再次连接并创建新套接字时。
从客户端到 Web 应用程序应该非常简单,因为客户端使用套接字将数据发送到 Node.JS 应用程序,后者又将数据发送到队列,因此最终可以转发到 Web 应用程序。从这个方向来看,如果套接字关闭,则没有互联网连接,因此数据不会首先发送,或者缓存在客户端。
我关心的是另一个方向,我想在我这样设计并实际实施之前得到一个答案,这样我就可以避免撞墙。假设 Web 应用程序尝试向客户端发送指令。如果套接字可用,Web 应用程序将指令转发到队列,队列又将其转发到 Node.JS 应用程序,后者又使用套接字将其转发到客户端。到目前为止,一切都很好。另一方面,如果来自客户端的 Internet 连接已断开,因此套接字当前已关闭,Web 应用程序仍会将指令发送到队列。我的问题是,当队列将指令转发给Node.JS,而Node.JS发现套接字不存在,因此无法发送指令时,队列会收到[=22=的回复吗? ] 它无法转发数据,因此它应该保留在队列中?如果真是这样,那就完美了。当客户端设法连接到互联网时,它将再次执行一次握手,队列将再次尝试发送到 Node.JS,只是这次 Node.JS 设法将指令发送到客户端。
这是关于这些组件如何相互作用的正确推理吗?
这不会按照您希望的方式工作。
当node进程收到rabbitmq发来的消息,看到socket不见了,可以轻松nack
把消息回队列
但是,该消息将立即再次处理。它不会坐在那里什么都不做。节点进程将再次拾取它。您最终会遇到节点/rabbitmq 抖动的情况,因为它一遍又一遍地发送消息,等待套接字重新上线。
如果您有数十条或数百条消息发送给未连接的客户端,那么您将有数十条或数百条消息像这样在圈子里乱窜。它会破坏你的节点进程和 rabbitmq 的性能。
我的推荐:
当节点应用程序收到来自 rabbitmq 的消息时,套接字对客户端不可用,将消息放入数据库 table 并将其标记为等待该客户端。
当客户端重新连接时,检查数据库中是否有任何待处理的消息并在此时将它们全部转发。
我将设计一个系统,在该系统中,客户端和 Web 应用程序之间存在双向通信。 Web 应用程序可以从客户端接收数据,以便将其保存到数据库等,同时它还可以向客户端发送指令。因此,我将使用 Node.JS 和 Socket.IO。
我还需要使用 RabbitMQ,因为我希望如果 Web 应用程序向客户端发送指令,并且客户端已关闭(因此套接字已断开),我希望将其排队以便发送每当客户端再次连接并创建新套接字时。
从客户端到 Web 应用程序应该非常简单,因为客户端使用套接字将数据发送到 Node.JS 应用程序,后者又将数据发送到队列,因此最终可以转发到 Web 应用程序。从这个方向来看,如果套接字关闭,则没有互联网连接,因此数据不会首先发送,或者缓存在客户端。
我关心的是另一个方向,我想在我这样设计并实际实施之前得到一个答案,这样我就可以避免撞墙。假设 Web 应用程序尝试向客户端发送指令。如果套接字可用,Web 应用程序将指令转发到队列,队列又将其转发到 Node.JS 应用程序,后者又使用套接字将其转发到客户端。到目前为止,一切都很好。另一方面,如果来自客户端的 Internet 连接已断开,因此套接字当前已关闭,Web 应用程序仍会将指令发送到队列。我的问题是,当队列将指令转发给Node.JS,而Node.JS发现套接字不存在,因此无法发送指令时,队列会收到[=22=的回复吗? ] 它无法转发数据,因此它应该保留在队列中?如果真是这样,那就完美了。当客户端设法连接到互联网时,它将再次执行一次握手,队列将再次尝试发送到 Node.JS,只是这次 Node.JS 设法将指令发送到客户端。
这是关于这些组件如何相互作用的正确推理吗?
这不会按照您希望的方式工作。
当node进程收到rabbitmq发来的消息,看到socket不见了,可以轻松nack
把消息回队列
但是,该消息将立即再次处理。它不会坐在那里什么都不做。节点进程将再次拾取它。您最终会遇到节点/rabbitmq 抖动的情况,因为它一遍又一遍地发送消息,等待套接字重新上线。
如果您有数十条或数百条消息发送给未连接的客户端,那么您将有数十条或数百条消息像这样在圈子里乱窜。它会破坏你的节点进程和 rabbitmq 的性能。
我的推荐:
当节点应用程序收到来自 rabbitmq 的消息时,套接字对客户端不可用,将消息放入数据库 table 并将其标记为等待该客户端。
当客户端重新连接时,检查数据库中是否有任何待处理的消息并在此时将它们全部转发。