ZeroMQ and Ring Buffer (Disruptor) Channels
The ZeroMQ binding can be combined with Ring Buffer Channels and the LMAX Disruptor to create low-latency processing engines. Consider the following topology where a consumer receives events from one channel, processes them and subsequently invokes another service that in turn publishes output to a second channel:
The above topology is configured to use ring buffer channels as follows:
<composite ...> <channel name="IncomingChannel" type="ring.buffer"> <f3:binding.zeromq addresses="192.0.2:2024"/> </channel> <channel name="OutgoingChannel" type="ring.buffer"> <f3:binding.zeromq addresses="190.0.1:2024"/> </channel> <component name="Component1"> <implementation.java class="..."/> <consumer name="channel" source="IncomingChannel"/> </component> <component name="Component1"> <implementation.java class="..."/> <producer name="channel" target="OutgoingChannel"/> </component> </composite>
At runtime, the above composite results in the following:
A message is read from a ZeroMQ socket on thread 1 and placed in a ring buffer (Disruptor) slot. The business logic runs on a second thread, which receives the message from the ring buffer (Disruptor). When processing is complete, a business logic component publishes the output event to the second channel which results it being placed in an outgoing ring buffer slot. A third thread responsible for dispatching messages over a ZeroMQ socket receives the output event and publishes it.
This channel architecture can be applied to a number of use cases which require fast (low-latency) and predictable (limited GC activity) performance. For an in-depth example, see the FastQuote sample.