FairMQ/fairmq
mkrzewic c2d7c49cf5 Support multiple endpoints per socket
Sent messages will be scheduled among the endpoints according to socket
type: PUB will send the same data to all endpoints simultaneously, PUSH
will do round robin transfer.
Incoming data is fair queued between endpoints.

This is a feature of at least zeromq and nanomsg.

_____________
To use: in the device configuration, instead of specifying just one address,
specify a comma separated list e.g.

tcp://localhost:123,ipc:///tmp/socket

the connection method (bind/connect) applies to all endpoints in this case.
______________
Mixing binding and connecting endpoints is supported:
prefix "@" means "bind", "+" (or ">") means connect, e.g.

+tcp://localhost:123,@ipc:///tmp/socket,ipc:///tmp/asd

(in case of missing prefix, the default channel method is used for that
endpoint).
2016-11-11 16:58:55 +01:00
..
devices Enable new callback API 2016-09-30 14:36:35 +02:00
logger Enable new callback API 2016-09-30 14:36:35 +02:00
nanomsg Enable new callback API 2016-09-30 14:36:35 +02:00
options all: apply fer-json-fmt 2016-11-10 15:20:54 +01:00
plugins Update JSON files & readme, use FairMQDevicePtr, cleanup. 2016-11-09 15:01:40 +01:00
run all: apply fer-json-fmt 2016-11-10 15:20:54 +01:00
test Enable new callback API 2016-09-30 14:36:35 +02:00
tools Update JSON files & readme, use FairMQDevicePtr, cleanup. 2016-11-09 15:01:40 +01:00
zeromq Enable new callback API 2016-09-30 14:36:35 +02:00
.clang-format use clang-format for FairMQ 2014-06-06 14:30:41 +02:00
apply-clang-format.sh use clang-format for Tutorial3 2014-06-06 14:30:41 +02:00
CMakeLists.txt Move config & control DDS functionality into plugins. 2016-10-28 14:14:13 +02:00
FairMQChannel.cxx Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQChannel.h Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQConfigPlugin.h Move config & control DDS functionality into plugins. 2016-10-28 14:14:13 +02:00
FairMQConfigurable.cxx FairMQ Examples cleanup 2015-10-05 18:06:55 +02:00
FairMQConfigurable.h FairMQ Examples cleanup 2015-10-05 18:06:55 +02:00
FairMQControlPlugin.h Move config & control DDS functionality into plugins. 2016-10-28 14:14:13 +02:00
FairMQDevice.cxx Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQDevice.h Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQLogger.cxx Fix compiler warnings. 2016-03-14 13:37:55 +01:00
FairMQLogger.h Simplify logger filtering options, fix log error double printing issue 2016-09-19 11:20:22 +02:00
FairMQMessage.cxx Add license file LICENSE with LPGL license text copied from https://www.gnu.org/licenses/lgpl.html. Add license text to most of files of the project. 2014-06-06 14:57:56 +02:00
FairMQMessage.h Enable new callback API 2016-09-30 14:36:35 +02:00
FairMQParts.h Fix dereference before null check in example and formatting 2016-04-14 13:23:09 +02:00
FairMQPoller.cxx Add license file LICENSE with LPGL license text copied from https://www.gnu.org/licenses/lgpl.html. Add license text to most of files of the project. 2014-06-06 14:57:56 +02:00
FairMQPoller.h Several FairMQ fixes and improvements: 2015-09-28 12:17:22 +02:00
FairMQSocket.cxx Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQSocket.h Support multiple endpoints per socket 2016-11-11 16:58:55 +01:00
FairMQStateMachine.cxx Return if an unknown exception has been cought in Channel 2015-11-03 16:07:15 +01:00
FairMQStateMachine.h Enable new callback API 2016-09-30 14:36:35 +02:00
FairMQTransportFactory.cxx Add license file LICENSE with LPGL license text copied from https://www.gnu.org/licenses/lgpl.html. Add license text to most of files of the project. 2014-06-06 14:57:56 +02:00
FairMQTransportFactory.h Enable new callback API 2016-09-30 14:36:35 +02:00
README.md Enable new callback API 2016-09-30 14:36:35 +02:00
runFairMQDevice.h Update JSON files & readme, use FairMQDevicePtr, cleanup. 2016-11-09 15:01:40 +01:00

FairMQ

The standard FairRoot is running all the different analysis tasks within one process. The FairMQ (Message Queue) allows starting tasks on different processes and provides the communication layer between these processes.

Devices

The components encapsulating the tasks are called devices and derive from the common base class FairMQDevice. FairMQ provides ready to use devices to organize the dataflow between the components (without touching the contents of a message), providing functionality like merging and splitting of the data stream (see subdirectory devices).

Topology

Devices are arranged into topologies where each device has a defined number of data inputs and outputs.

Example of a simple FairMQ topology:

example of FairMQ topology

Topology configuration is currently happening via setup scripts. This is very rudimentary and a much more flexible system is now in development. For now, example setup scripts can be found in directory FairRoot/example/Tutorial3/ along with some additional documentation.

Communication Patterns

FairMQ devices communicate via the communication patterns offered by ZeroMQ (or nanomsg): PUSH-PULL, PUB-SUB, REQ-REP, PAIR, more info here.

Messages

Devices transport data between each other in form of FairMQMessages. These can be filled with arbitrary content and transport either raw data or serialized data as described above. Message can be initialized in three different ways:

  • with no parameters: This is usefull for receiving a message, since neither size nor contents are yet known.
  • given message size: Initialize message body with a size and fill the contents later, either with memcpy or by writing directly into message memory.
  • given message size and buffer: initialize the message given an existing buffer. This is a zero-copy operation.

After sending the message, the queueing system takes over control over the message body and will free it with free() after it is no longer used. A callback can be given to the message object, to be called instead of the destruction with free().

Transport Interface

The communication layer is available through an interface. Two interface implementations are currently available. Main implementation uses the ZeroMQ library. Alternative implementation relies on the nanomsg library. Here is an overview to give an idea how interface is implemented:

FairMQ transport interface

State Machine

Each FairMQ device has an internal state machine:

FairMQ state machine

The state machine can be querried and controlled via GetCurrentStateName() and ChangeState("<state name>") methods. Only legal state transitions are allowed (see image above). Illegal transitions will fail with an error.

If the device is running in interactive mode (default), states can be changed via keyboard input:

  • 'h' - help
  • 'p' - pause
  • 'r' - run
  • 's' - stop
  • 't' - reset task
  • 'd' - reset device
  • 'q' - end
  • 'j' - init task
  • 'i' - init device

Without the interactive mode, for example for a run in background, two other control mechanisms are available:

  • static (--control static) - device goes through a simple init -> run -> reset -> exit chain.
  • dds (--control dds) - device is controled by external command, in this case using dds commands (fairmq-dds-command-ui).

Examples

A collection of simple examples in FairRoot/examples/MQ directory demonstrates some common usage patterns of FairMQ.

A number of devices to handle the data from the Tutorial3 FairTestDetector of FairRoot are provided as an example and can be found in FairRoot/base/MQ directory. The implementation of the tasks run by these devices can be found FairRoot/examples/advanced/Tutorial3. The implementation includes sending raw binary data as well as serializing the data with either Boost Serialization, Google Protocol Buffers or Root TMessage. Following the examples you can implement your own devices to transport arbitrary data.