【问题标题】:What is the use of heartbeat in stomp protocol?stomp协议中心跳有什么用?
【发布时间】:2021-08-21 09:31:34
【问题描述】:

目前我正在使用 stomp 协议向 activeMQ 发送消息并收听消息。这是在 Nodejs 中使用 stompit 库完成的。

当应用程序的 CPU 或内存使用率很高时,它会停止向代理发送心跳。所以 broker 重新传递当前正在处理的消息,导致重复处理同一条消息

在禁用心跳时,应用程序似乎工作正常,但我不确定禁用心跳可能导致的进一步问题。即使代理在发送消息时停止,无论有没有心跳,行为似乎都是相同的

我已经读到它是一个可选参数,但我无法找到它的确切用例

谁能提到没有心跳会导致应用出现问题的场景?

【问题讨论】:

    标签: node.js activemq stomp


    【解决方案1】:

    关于心跳的目的STOMP 1.2 specification只是说:

    Heart-beating 可以选择性地用于测试底层 TCP 连接的健康状况,并确保远程端处于活动状态并且正在运行。

    心跳可能既从客户端流向服务器,又从服务器流向客户端,因此此处规范中引用的“远程端”可能是客户端或服务器。

    对于服务器来说,心跳有助于确保及时清理服务器端资源,避免过度紧张。为所有客户端连接维护服务器端资源,它有助于代理能够快速检测这些连接何时失败(即未收到心跳),以便清理这些资源。如果心跳被禁用,则可能无法检测到死连接,并且服务器将不得不徒劳地为死连接维护其资源。

    对于客户端,心跳有助于在执行异步发送时避免消息丢失。消息通常由客户端异步发送(即即发即弃)。如果没有检测连接丢失的机制,客户端可以继续在死连接上异步发送消息。这些消息将丢失,因为它们永远不会到达代理。心跳缓解了这种情况。

    【讨论】:

    • 知道了,感谢详细解答。但是当应用程序崩溃时如何防止消息重新传递,这会导致重复处理。
    • 为了防止重新投递,首先要准确了解为什么会发生这种情况,这一点至关重要。我建议您为此创建一个新问题,以便提供所有详细信息。
    • 嗨贾斯汀,我对这个问题有疑问,如果服务器心跳被禁用并且在这种情况下不会检测到死连接。当 nodeJs 服务器停止消费队列时,broker 如何将消费者显示为 0?。
    猜你喜欢
    • 2021-10-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多