You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Matt Pavlovich (Jira)" <ji...@apache.org> on 2021/03/18 14:31:00 UTC

[jira] [Assigned] (AMQ-5201) STOMP consumers that doesn't ACK cause broker memory to fill up before prefetchLimit is reached

     [ https://issues.apache.org/jira/browse/AMQ-5201?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Matt Pavlovich reassigned AMQ-5201:
-----------------------------------

    Assignee: Matt Pavlovich

> STOMP consumers that doesn't ACK cause broker memory to fill up before prefetchLimit is reached
> -----------------------------------------------------------------------------------------------
>
>                 Key: AMQ-5201
>                 URL: https://issues.apache.org/jira/browse/AMQ-5201
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.8.0
>            Reporter: Jostein Gogstad
>            Assignee: Matt Pavlovich
>            Priority: Major
>         Attachments: activemq-bug.zip
>
>
> We had a Perl script using STOMP to consume messages off an AMQ 5.8 broker. The broker would suddenly block all producers with no mention of producer flow control in the logs. This turned out to be caused by zombie threads created by the Perl script holding open TCP connections.
> The consumers have a {{prefetchLimit}} of {{Short.MAX_VALUE}}. When the broker dispatches messages to the consumers, it starts filling up memory immediately (this only happens when using STOMP). All producers are blocked when the topic uses about 70-90% of {{memoryUsage}}. I would've expect the broker to not keep dispatched messages around until the prefetchLimit is reached; the same behaviour as it has when using OpenWire. At least I would have expected a log entry explaining why everything stops.
> Attached is a test case that demonstrates the bug. Set {{memoryUsage}} to {{64mb}} or below to reproduce:
> {code:xml|title=activemq.xml}
>         <systemUsage>
>             <systemUsage>
>                 <memoryUsage>
>                     <memoryUsage limit="64 mb"/>
>                 </memoryUsage>
> ...
> {code}
> The only workaround I know of is to kill consumers that doesn't ACK using {{AbortSlowAckConsumerStrategy}}. I can't find it in the official AMQ docs, but it is well described [here|http://planet.jboss.org/post/coming_in_activemq_5_9_a_new_way_to_abort_slow_consumers] and [here|https://access.redhat.com/site/documentation/en-US/Red_Hat_JBoss_A-MQ/6.0/html/Tuning_Guide/files/TuningSlowConsumers.html]. This solves my problem. A log line hinting to why AMQ stops would be much appriciated though. It also seems wierd that STOMP caches messages not ACK'ed when OpenWire doesnt.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)