Python программа, использующая протокол Stomp для подключения к ActiveMQ, продолжает отключаться - PullRequest
0 голосов
/ 25 февраля 2020

Ниже приведены параметры подключения в программе 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)
                          )

Так что ReadCheckInterval и WriteCheckInterval установлены на 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). Есть предложения?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

После некоторого тестирования выяснилось, что даже задержка в несколько миллисекунд в контрольном импульсе клиента приводила к закрытию соединения брокером.

По той же причине с сервера ActiveMQ версии 5.9.0 транспорт .hbGracePeriodMultiplier (по умолчанию = 1) был добавлен. Это увеличило бы время ожидания сердцебиения на коэффициент установленного значения. Ниже приведена ссылка JIRA, которая использовалась для реализации этой функции.

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

Я также удалил пульс посредника, установив пульс как (60000 , 0) как это было избыточно.

0 голосов
/ 26 февраля 2020

Первым значением в заголовке сообщения о задержке подключения является значение «будет отправлено» для сердечных сокращений клиента брокеру. Клиент должен пытаться поддерживать постоянное сердцебиение на указанном уровне, который определяется как

наименьшее количество миллисекунд между ударами сердца, которое он может гарантировать

. брокер разрешит некоторый льготный период, основанный на этом значении, после которого, если клиент не отправил сердцебиение или любой другой кадр, соединение будет закрыто. Исходя из приведенной трассировки, клиент не отправляет сердцебиения или другие действия на уровне проводов, поэтому брокер прерывает соединение.

...