【问题标题】:Python program using Stomp protocol to connect to ActiveMQ keeps disconnectingPython程序使用Stomp协议连接ActiveMQ不断断开连接
【发布时间】:2020-06-09 13:58:29
【问题描述】:

下面是python程序中连接ActiveMQ的连接参数

broker_url = config_params.items('BROKERS')
conn = stomp.Connection12(broker_url, 
                          reconnect_sleep_initial=20.0, 
                          reconnect_sleep_increase=2.0, 
                          reconnect_attempts_max=10, 
                          heartbeats=(60000,60000)
                          )

因此,ReadCheckIntervalWriteCheckInterval 设置为 1 分钟用于连接。心跳似乎被错过了。我只是想弄清楚客户端或 ActiveMQ 服务器端是否缺少心跳。有人可以帮我吗?

以下是 Python 程序的日志:

2020-02-25 12:27:16,141 - INFO - Attempting connection to host
2020-02-25 12:27:16,142 - INFO - Established connection to host
2020-02-25 12:27:16,142 - INFO - Starting receiver loop
2020-02-25 12:27:16,143 - DEBUG - Sending frame: ['STOMP', '\n', 'accept-version:1.2\n', 'client-id, 'heart-beat:60000,60000\n',]
2020-02-25 12:27:16,143 - DEBUG - Received frame: 'CONNECTED', headers={'server': 'ActiveMQ/5.15.2', 'heart-beat': '60000,60000']body=''
2020-02-25 12:27:16,143 - DEBUG - Sending frame: ['SUBSCRIBE', '\n', 'ack:auto\n', 'activemq.subscriptionName:subscriber\n']
2020-02-25 12:30:16,144 - DEBUG - Received frame: 'heartbeat', headers={}, body=None
2020-02-25 12:30:16,145 - ERROR - disconnected from broker, will attempt to reconnect...
2020-02-25 12:30:16,145 - INFO - Receiver loop ended
2020-02-25 12:30:16,320 - INFO - Attempting connection to host
2020-02-25 12:30:16,321 - INFO - Established connection to host
2020-02-25 12:30:16,321 - INFO - Starting receiver loop
2020-02-25 12:30:16,321 - DEBUG - Sending frame: ['STOMP', '\n', 'accept-version:1.2\n', 'client-id:\n', 'heart-beat:60000,60000\n']
2020-02-25 12:30:16,322 - DEBUG - Received frame: 'CONNECTED', headers={'server': 'ActiveMQ/5.15.2', 'heart-beat': '60000,60000']body=''
2020-02-25 12:30:16,322 - DEBUG - Sending frame: ['SUBSCRIBE', '\n', 'ack:auto\n', 'activemq.subscriptionName:subscriber]

我看到客户端和服务器都缺少相互发送心跳的信息。以下是客户端错过发送心跳的日志。连接在 12:03:32 建立。客户端在 12:03:32 发送第一个心跳,然后订阅 ActiveMQ 目标。它不断收到消息,所以有活动,直到 12:12:08。然后一段时间不活动,直到 12:13:32(>60 秒),连接被终止。这是 ActiveMQ 服务器对来自客户端错过的心跳的容忍度太低的问题吗?在这种情况下,将客户端的心跳间隔增加到 120 秒会有帮助吗?

2020-02-26 12:03:32,498 - INFO - Established connection to host, port 61613
2020-02-26 12:03:32,499 - INFO - Sending frame: 'STOMP', headers={'heart-beat': '60000,60000'}
2020-02-26 12:03:32,512 - INFO - Received frame: 'CONNECTED', headers={'heart-beat': '60000,60000'}
2020-02-26 12:03:32,513 - INFO - Sending frame: 'SUBSCRIBE'
2020-02-26 12:04:27,924 - INFO - Received frame: 'MESSAGE'
.
.
2020-02-26 12:12:08,475 - INFO - Received frame: 'MESSAGE'
2020-02-26 12:13:32,519 - INFO - Received frame: 'heartbeat'
2020-02-26 12:13:32,548 - ERROR - disconnected from broker

我还看到服务器缺少发送心跳和客户端收到心跳超时错误的问题。我正在考虑通过将心跳配置设置为(120000,0)来禁用服务器的心跳。有什么建议吗?

【问题讨论】:

  • ReadCheckIntervalWriteCheckInterval 是什么意思?你说的是心跳配置吗?
  • 您的客户端似乎没有发送任何心跳以保持连接处于活动状态。您是否有任何来自服务器的调试日志来表明它是否正在接收心跳?

标签: activemq stomp


【解决方案1】:

Connect hear-beat 标头中的第一个值是将客户端心跳的“将发送”值发送到代理。客户应尝试在指定的水平保持一致的心跳,该水平定义为

心跳之间的最小毫秒数 保证

代理将根据该值允许一段宽限期,在此之后,如果客户端未发送心跳或任何其他帧,则连接将关闭。从给定的跟踪来看,客户端没有发送任何心跳或其他线路级别的活动,因此代理正在断开连接。

【讨论】:

  • 谢谢蒂姆。我用一些额外的日志和观察编辑了我的问题。这是 ActiveMQ 服务器对来自客户端错过的心跳的容忍度太低的问题吗?在这种情况下,将客户端的心跳间隔增加到 120 秒会有所帮助吗?我还看到服务器缺少发送心跳和客户端收到心跳超时错误的问题。我正在考虑通过将心跳配置设置为(120000,0)来禁用服务器的心跳。有什么建议吗?
  • 鉴于上下文有限,我无法从日志中看出,代理代码已经测试多年,所以我会说你的客户端有问题。
【解决方案2】:

经过一些测试后发现,即使客户端心跳延迟几毫秒也会导致连接被代理关闭。

出于同样的原因,从 ActiveMQ 服务器版本 5.9.0 开始, 添加了 transport.hbGracePeriodMultiplier(默认值=1)。这会将心跳超时增加设置值的一个因子。以下是用于实现此功能的 JIRA 链接。

https://issues.apache.org/jira/browse/AMQ-4674

我还删除了代理心跳,将心跳设置为 (60000,0),因为它是多余的。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2017-01-17
    • 2012-06-17
    • 2010-10-12
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多