Как я могу настроить ActiveMQ на отключение потребителя, если он просто перестает принимать данные?

Сегодня я увидел много ошибок на своей консоли ActiveMQ 5.3.2:

ИНФОРМАЦИЯ | Достигнут предел памяти диспетчера использования. Остановка производителя (ID: ...) для предотвращения флуда topic: // mytopic. См. http://activemq.apache.org/producer-flow-control.html для получения дополнительной информации (блокировка на: 3422 мс)

Я немного покопался и определил, что подписчик ушел обедать:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp6       0 130320 10.208.87.178:61613     66.31.31.216:37951      ESTABLISHED

В этой ситуации я не хочу, чтобы производитель блокировал; Я бы предпочел полностью отказаться от клиента. http://activemq.apache.org/slow-consumer-handling.html объясняет, как ограничить количество сообщений в очереди, что является хорошим началом, но не совсем то, что я хочу. http://activemq.apache.org/slow-consumers.html намекает на то, что может отказаться от медленного потребителя, но не объясняет, как это можно сделать.

Итак, это мой вопрос: можно ли настроить ApacheMQ для полного отбрасывания медленных потребителей и как мне это сделать?


person archbishop    schedule 24.05.2010    source источник


Ответы (4)


Я бы отключил ProducerFlowControl для нужных вам тем или для всех так:

<policyEntry topic=">" producerFlowControl="false">

Это может привести к тому, что вам не хватит памяти или места на диске, потому что очередь сообщений может продолжать расти. Поэтому убедитесь, что вы настроили стратегию выселения и стратегию ограничения ожидающих сообщений, например:

<messageEvictionStrategy> 
    <oldestMessageEvictionStrategy/> 
</messageEvictionStrategy> 

<pendingMessageLimitStrategy>
    <constantPendingMessageLimitStrategy limit="10"/>
</pendingMessageLimitStrategy>

Это начнет отбрасывать сообщения после того, как будет достигнуто ограничение в 10. Самые старые сообщения будут выброшены первыми.

person Kelly    schedule 06.01.2011

AbortSlowConsumerStrategy, улучшенная в Active MQ 5.9.0, должна помочь в этом аспекте. У меня не было возможности тщательно протестировать его для различных конфигураций. Но я думаю, это то, что вы ищете, особенно ignoreIdleConsumers = true.

http://java.dzone.com/articles/coming-activemq-59-new-way

person Mahesh    schedule 18.11.2013

Вы можете настроить свойство ниже - "sendFailIfNoSpaceAfterTimeout" для выдачи ошибки Производителю вместо блокировки.

<systemUsage>
 <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
            <memoryUsage>
                <memoryUsage limit="256 mb"/>
            </memoryUsage>
 </systemUsage>
</systemUsage>
person akshat thakar    schedule 27.02.2015

Я не могу дать вам ответ о том, как отказаться от клиента (на самом деле: я не уверен, что это возможно все вместе), но вы можете добавить политику, чтобы не блокировать производителя:

"memoryLimit =" 10 МБ "продюсерFlowControl =" false "/>

Таким образом, ваш производитель не пострадает от медлительных потребителей.

person Noctris    schedule 01.06.2010