6.7 KiB
FairMQ
C++ Message Queuing Library and Framework
FairMQ was designed to help implementing large-scale data processing workflows needed in next-generation High Energy Physics experiments. FairMQ is written in C++ and aims to
- provide a message queuing abstraction of different data transport technologies,
- provide a reasonably efficient data transport service (zero-copy, high throughput),
- be data format agnostic, and
- provide some of the basic building blocks needed to implement higher level data processing workflows.
The core of FairMQ provides an abstract message queuing API with scalability protocols
inspired by ZeroMQ (e.g. PUSH/PULL, PUB/SUB).
FairMQ provides multiple implementations for its API (so-called "transports",
e.g. zeromq
, shmem
, nanomsg
, and ofi
(in development)) to cover a variety of use cases
(e.g. inter-thread, inter-process, inter-node communication) and machines (e.g. Ethernet, Infiniband).
In addition to this core functionality FairMQ provides a framework for creating "devices" - actors which
are communicating through message queuing. Device execution is modelled as a simple state machine that
shapes the integration points for the user task. Devices also incorporate a plugin system for runtime configuration and control.
Next to the provided devices and plugins (e.g. DDS)
the user can extened FairMQ by developing her own plugins to integrate her devices with external
configuration and control services.
FairMQ has been developed in the context of its mother project FairRoot - a simulation, reconstruction and analysis framework that is based on the ROOT system.
Dependencies
- Boost (PUBLIC)
- FairLogger (PUBLIC)
- CMake (BUILD)
- GTest (BUILD, optional,
tests
) - ZeroMQ (PRIVATE)
- Msgpack (PRIVATE, optional,
nanomsg_transport
) - nanomsg (PRIVATE, optional,
nanomsg_transport
) - OFI (PRIVATE, optional,
ofi_transport
) - Protobuf (PRIVATE, optional,
ofi_transport
) - DDS (PRIVATE, optional,
dds_plugin
)
Supported platforms: Linux and MacOS.
Installation
git clone https://github.com/FairRootGroup/FairMQ fairmq
mkdir fairmq_build && cd fairmq_build
cmake -DCMAKE_INSTALL_PREFIX=./fairmq_install ../fairmq
cmake --build . --target install
If dependencies are not installed in standard system directories, you can hint the installation location via -DCMAKE_PREFIX_PATH=...
or per dependency via -D{DEPENDENCY}_ROOT=...
. {DEPENDENCY}
can be GTEST
, BOOST
, FAIRLOGGER
, ZEROMQ
, MSGPACK
, NANOMSG
, OFI
, PROTOBUF
, or DDS
(*_ROOT
variables can also be environment variables).
Usage
FairMQ ships as a CMake package, so in your CMakeLists.txt
you can discover it like this:
find_package(FairMQ)
If FairMQ is not installed in system directories, you can hint the installation:
set(CMAKE_PREFIX_PATH /path/to/FairMQ_install_prefix ${CMAKE_PREFIX_PATH})
find_package(FairMQ)
find_package(FairMQ)
will define an imported target FairMQ::FairMQ
(An alias FairRoot::FairMQ
is also defined (if you use CMake 3.11+) for backwards compatibility, but it is deprecated).
In order to succesfully compile and link against the FairMQ::FairMQ
target, you need to discover its public package dependencies, too.
find_package(FairMQ)
find_package(FairLogger ${FairMQ_FairLogger_VERSION})
find_package(Boost ${FairMQ_Boost_VERSION} COMPONENTS ${FairMQ_BOOST_COMPONENTS})
Of course, feel free to customize the above commands to your needs.
Optionally, you can require certain FairMQ package components and a minimum version:
find_package(FairMQ 1.1.0 COMPONENTS nanomsg_transport dds_plugin)
find_package(FairLogger ${FairMQ_FairLogger_VERSION})
find_package(Boost ${FairMQ_Boost_VERSION} COMPONENTS ${FairMQ_BOOST_COMPONENTS})
When building FairMQ, CMake will print a summary table of all available package components.
CMake options
On command line:
-DDISABLE_COLOR=ON
disables coloured console output.-DBUILD_TESTING=OFF
disables building of tests.-DBUILD_NANOMSG_TRANSPORT=ON
enables building of nanomsg transport.-DBUILD_OFI_TRANSPORT=ON
enables building of the experimental OFI transport.-DBUILD_DDS_PLUGIN=ON
enables building of the DDS plugin.- You can hint non-system installations for dependent packages, see the #Installation section above
After the find_package(FairMQ)
call the following CMake variables are defined:
${FairMQ_Boost_VERSION}
contains the minimum Boost version FairMQ requires.${FairMQ_Boost_COMPONENTS}
contains the list of Boost components FairMQ depends on.${FairMQ_FairLogger_VERSION}
contains the minimum FairLogger version FairMQ requires.- ... TODO
Documentation
Standard FairRoot is running all the different analysis tasks within one process. FairMQ (Message Queue) allows starting tasks on different processes and provides the communication layer between these processes.
License
GNU Lesser General Public Licence (LGPL) version 3, see LICENSE.
Copyright (C) 2013-2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH