долгого время слушателя, первый раз вызывающему на Stackoverflow :)ActiveMQ сети брокеров приводит к высокой латентности сообщения отправкой
У меня есть брокера ActiveMQ с производителем и потребителем. Продюсер подключается к брокеру activeMQ. Существует потребитель, который привязан к одному и тому же брокеру. Когда я отправляю сообщения с этой настройкой P -> B -> C, время ожидания мало и нет, а сообщения отправляются со скоростью 8 мс на сообщение.
Теперь я добавляю еще одного брокера для создания сети брокеров и отправки сообщений, используя следующую конфигурацию: P -> B1 -> B2 -> C занимает до 80 мс на сообщение.
Дополнительная информация:
P и B1 находятся в одном центре обработки данных, DC1.
B2 и C находятся в одном центре обработки данных, DC2.
DC1 и DC2 - это два разных центра обработки данных на одном и том же побережье с задержкой пинга около 20-30 мс.
Я использую конфигурацию по умолчанию, поставляемую с tar-файлом activemq. Единственная конфигурация, которую я добавил, - это подключение брокеров к созданию сети брокеров.
На B1 я добавил следующую конфигурацию, чтобы activemq.xml
<networkConnectors>
</networkConnectors>
На В2 я добавил следующую конфигурацию, чтобы activemq.xml
<networkConnectors>
<networkConnector name="B2" uri="static://(tcp://b1.prod.xxx.com:61616)" duplex="true"/>
</networkConnectors>
Это полнодуплексное соединение и В2 находится позади брандмауэр работает так, как рекламируется.
Любые мысли о том, что добавленная латентность намного выше. 10-кратная латентность неприемлема. Это может быть хуже, когда число производителей увеличивается.
Что я делаю что-то неправильно?
редактировать:
Я вижу, что отправка сообщения от В1 до В2 принимает> 240ms за сообщение. Вот некоторая релевантная информация в activemq.log
2013-07-10 23: 05: 00,186 | TRACE | Инициализация задачи запуска 932 - Транспортное соединение с: vm: // broker1 # 0 | org.apache.activemq.thread.PooledTaskRunner: 128 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,187 | DEBUG | (broker1 -> broker2) ActiveMQBytesMessage {...} ActiveMQBytesMessage {...}, потребитель: ID: broker1-50755-1373522507018-2: 1: 1: 2, целевая тема: //LogMessageTopic.Server.xxx.com , brokerPath: [ID: broker1-50755-1373522507018-0: 1], сообщение: ActiveMQBytesMessage {...} ActiveMQBytesMessage {bytesOut = null, dataOut = null, dataIn = null} | org.apache.activemq.network.DemandForwardingBridgeSupport: 974 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,438 | TRACE | Инициализация задачи запуска 933 - Транспортное соединение с: vm: // broker1 # 0 | org.apache.activemq.thread.PooledTaskRunner: 128 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,439 | DEBUG | (broker1 -> broker2) ActiveMQBytesMessage {...} ActiveMQBytesMessage {...}, потребитель: ID: broker1-50755-1373522507018-2: 1: 1: 2, целевая тема: //LogMessageTopic.Server.xxx.com , brokerPath: [ID: broker1-50755-1373522507018-0: 1], сообщение: ActiveMQBytesMessage {...} ActiveMQBytesMessage {bytesOut = null, dataOut = null, dataIn = null} | org.apache.activemq.network.DemandForwardingBridgeSupport: 974 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,708 | TRACE | Инициализация задачи запуска 934 - Транспортное соединение с: vm: // broker1 # 0 | org.apache.activemq.thread.PooledTaskRunner: 128 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,709 | DEBUG | (broker1 -> broker2) ActiveMQBytesMessage {...} ActiveMQBytesMessage {...}, потребитель: ID: broker1-50755-1373522507018-2: 1: 1: 2, целевая тема: //LogMessageTopic.Server.xxx.com , brokerPath: [ID: broker1-50755-1373522507018-0: 1], сообщение: ActiveMQBytesMessage {...} ActiveMQBytesMessage {bytesOut = null, dataOut = null, dataIn = null} | org.apache.activemq.network.DemandForwardingBridgeSupport: 974 | ActiveMQ BrokerService [broker1] Task-3
2013-07-10 23: 05: 00,962 | TRACE | Инициализация задачи запуска 935 - Транспортное соединение с: vm: // broker1 # 0 | org.apache.activemq.thread.PooledTaskRunner: 128 | ActiveMQ BrokerService [broker1] Task-3
Похоже, что брокер для передачи данных через посредник занимает много времени.
Я пробовал настройку persistent = false и удалял с помощью KahaDB без каких-либо успехов.
У меня есть несколько вопросов для разъяснения: 1) Когда вы говорите «отправлено со скоростью 8 мс на сообщение», вы имеете в виду, что у вас есть латентность 8 мс на сообщение или что вы отправляете сообщение каждые 8 мс? 2) Предполагая, что вы имеете в виду латентность 8 мс (поскольку вы говорите о 10-кратном увеличении латентности позже). Как это возможно, когда есть латентность 20-30 мс между B1 и C? Просьба уточнить. – SirRichie
SirRichie, 1) Это правильно. Задержка между P и B1 составляет 8 мс. 2) Задержка составляет 20-30 мс между B1 и B2 в DC1 и DC2. – geekay
Я не очень хорошо читаю файлы журналов. Из того, что я могу определить, вы используете vm: // в качестве транспортного протокола?Вы обязательно должны переключиться на tcp: //; также попробуйте отправить TextMessage для целей тестирования, а не ByteMessage; и вопрос: как вы измеряете задержку? – SirRichie