You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

Parallel Processing and Ordering

It is a common requirement to want to use parallel processing of messages for throughput and load balancing, while at the same time process certain kinds of messages in order.

How to achieve parallel processing

You can send messages to a number of Camel Components to achieve parallel processing and load balancing such as

  • SEDA for in-JVM load balancing across a thread pool]
  • ActiveMQ or JMS for distributed load balancing and parallel processing
  • JPA for using the database as a poor mans message broker

Issues of ordering with parallel processing

As soon as you send multiple messages to different threads or processes you will end up with an unknown ordering across the entire message stream as each thread is going
to process messages concurrently.

So when procssing messages concurrently, you should consider ordering and concurrency issues.

While this in itself is a large and diverse topic, here are some recommendations...

  • for distributed locking, try use a database by default, they are very good at it (smile)
  • to preserve ordering across a JMS queue consider using Exclusive Consumers in the ActiveMQ component
  • even better are Message Groups which allows you to preserve ordering across messages while still offering parallelisation via the JMSXGrouopID header to determine what can be parallelized

A good rule of thumb to help reduce concurrency problems is to make sure each single can be processed as an atomic unit in parallel (either without concurrency issues or using say, database locking); or if it can't, use a Message Group to relate the messages together which need to be processed in order by a single thread.

Using Message Groups with Camel

To use a Message Group with Camel you just need to add a header to the output JMS message based on some kind of Correlation Identifier to correlate messages which should be processed in order by a single thread - so that things which don't correlate together can be processed concurrently.

For example the following code shows how to create a message group using an XPath expression taking an invoice's product code as the Correlation Identifier

from("activemq:a").setHeader("JMSXGroupID", xpath("/invoice/productCode")).to("activemq:b");

You can of course use the Xml Configuration if you prefer

  • No labels