Hi,

We have Apache Camel routes consuming messages and updating a database. Due
to the nature of the business, there will be multiple messages in the queue
that need to update the same row in the db tables. This results in a lot of
db transaction rollbacks as the number of consumers increases.

We have proved to ourselves that using Message Groups with part of the db
table primary key as the JMSXGroupID resolves the rollback. There will also
be considerably more groups than consumers, so I have no concerns about
consumers being idle because all groups are already serviced.

We have also proved that we can horizontally scale the Camel deployment
based on queue depth.

What we can't work out is how to put the two solutions together, as whilst
Message Group will rebalance when a consumer disconnects, it does not
rebalance on new consumers, according to the documentation.

The documentation suggests that sending in a message with a -1 SeqNr will
force the group to be treated as new, however at the point where we are
scaling up there will already be thousands of messages on the queue.

Does the reset happen when the broker receives the message or when the
message gets to the head of the queue? If the latter, could I use message
priority to force it to the head?

If those conditions are met then I thinking that the Camel routes could
process 1k msgs then send in a -1 reset message for their current GroupID
to cause it to be rebalanced. Would also need to set prefetch=1 to ensure
that the client does not have messages buffered, although even if we didn't
do that, this pattern should reduce the number of rollbacks significantly.

Is there a better way for groups to be moved to new consumers?

Any suggestions gratefully received.

Mark Johnson

Reply via email to