Reputation: 43
We've got an SI application we use to route messages, do some validation, transformation, and filtering.
Essentially it consumes JMS messages from various queues and routes them to preregistered downstream outbound JMS queues.
We manage all of these through spring configs.
Inside of 1 JVM we have a few hundred(400-500) queue channels and associated pollers.
We're noticing as we scale this up (adding new inbound + outbound routes) we're having some decreased performance.
We don't seem to be having an impact to the box (CPU, memory, etc.) all seem pretty under utilized.
When profiled the application looks like so,
We've load tested the application from a volume perspective, but are in the process of looking at it from a scale up of in inbound + outbound processing flows.
We're running several of these on the box (all pointing at different external JMS resources), yet we only see slowdowns on one of these JVMs(the one with the most inbound + outbound flows configured).
From a long term perspective we're trying to understand
Upvotes: 2
Views: 1095
Reputation: 174739
Why so many queue channels? It is unusual, and usually unnecessary, to have more than one async handoff (if any) in a flow. It is often not necessary at all, especially when using message-driven inbound endpoints (such as the JMS message-driven adapter).
This is because the threading and concurrency can be entirely managed by the adapter's message listener container.
The most efficient configuration is to set the concurrency (number of threads) on the inbound adapter to that required and use direct channels throughout.
In fact this is required if you wish no possibility of lost messages; as soon as a message is handed off in a queue channel, the JMS message is ack'd (by default).
Upvotes: 2