RabbitMQ 持久队列通过 STOMP 丢失消息
RabbitMQ durable queue losing messages over STOMP
我有一个使用 javascript/websockets 连接到 rabbit mq 代理的网页,该网页由部署在 tomcat 中的 spring 应用公开。外部应用程序每秒生成 1 条消息,并呈现在网页上。 javascript 订阅是持久的。
我遇到的问题是,当 javascript 客户端的网络连接中断一段时间(比如 60 秒)时,前 ~24 秒的消息会丢失。我查看了 tomcat 中部署的应用程序的日志,丢失的消息似乎在以下日志语句之前出现:
org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler - DEBUG - TCP connection to broker closed in session 14
我认为端点意识到 javascript 客户端已断开连接并决定关闭与代理的连接,导致未来的消息排队。
我的问题是如何确保网络被切断和端点意识到客户端断开连接之间的消息不丢失?端点是否应该以某种方式将消息放回队列中?也许有办法让它成为事务性的?
提前致谢。
RabbitMQ 团队监控 this mailing list 并且有时只在 Whosebug 上回答问题。
您的 Tomcat 应用程序在确认您的 Javascript 客户端已收到消息之前不应确认来自 RabbitMQ 的消息。这样,任何未被 JS 客户端确认的消息都不会被 Tomcat 确认,并且 RabbitMQ 将重新传送它们。
我不知道你的 JS 应用程序和 Tomcat 是如何交互的,但你可能必须在那里实现你自己的 ack 过程。
我有一个使用 javascript/websockets 连接到 rabbit mq 代理的网页,该网页由部署在 tomcat 中的 spring 应用公开。外部应用程序每秒生成 1 条消息,并呈现在网页上。 javascript 订阅是持久的。
我遇到的问题是,当 javascript 客户端的网络连接中断一段时间(比如 60 秒)时,前 ~24 秒的消息会丢失。我查看了 tomcat 中部署的应用程序的日志,丢失的消息似乎在以下日志语句之前出现:
org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler - DEBUG - TCP connection to broker closed in session 14
我认为端点意识到 javascript 客户端已断开连接并决定关闭与代理的连接,导致未来的消息排队。
我的问题是如何确保网络被切断和端点意识到客户端断开连接之间的消息不丢失?端点是否应该以某种方式将消息放回队列中?也许有办法让它成为事务性的?
提前致谢。
RabbitMQ 团队监控 this mailing list 并且有时只在 Whosebug 上回答问题。
您的 Tomcat 应用程序在确认您的 Javascript 客户端已收到消息之前不应确认来自 RabbitMQ 的消息。这样,任何未被 JS 客户端确认的消息都不会被 Tomcat 确认,并且 RabbitMQ 将重新传送它们。
我不知道你的 JS 应用程序和 Tomcat 是如何交互的,但你可能必须在那里实现你自己的 ack 过程。