fbzmq
provides a framework for writing services in C++ while leveraging the awesomeness of libzmq
(message passing semantics). At a high level it provides
libzmq
which leverages newer C++ constructs and stricter type checking. Most notably it provides the ability to send/receive thrift objects
as messages over wire without worrying about wire encoding/decoding protocols.Async Framework
with EventLoop, Timeouts, SignalHandler and more to enable developers to write asynchronous applications efficiently.Here is a simple example demonstrating some powerful abstractions of fbzmq
which makes writing asynchronous applications easier on top of libzmq
// Create context fbzmq::Context context{1}; // Create eventloop fbzmq::ZmqEventLoop evl; // Create thrift serializer apache::thrift::CompactSerializer serializer; // Create REP and PUB server sockets fbzmq::Socket<ZMQ_REP, ZMQ_SERVER> reqSocket; fbzmq::Socket<ZMQ_PUB, ZMQ_SERVER> pubSocket; reqSocket.bind("tcp://[::1]:12345"); pubSocket.bind("tcp://[::1]:12346"); // Attach callback on reqSocket evl.addSocket(RawZmqSocketPtr{*reqSocket}, ZMQ_POLLIN, [&](int evts) noexcept { // It must be POLLIN event CHECK(evts | ZMQ_POLLIN); // Read request auto request = reqSocket.recvThriftObj<thrift::Request>(serializer); // Send response thrift::Response response; response.request = request; response.success = true; reqSocket.sendThriftObj(response, serializer); }); // Create periodic timeout to send publications and schedule it every 10s auto timeout = fbzmq::ZmqTimeout::make(&evl, [&]() noexcept { thrift::User user; user.name = "TestPerson"; user.email = "test@person.com"; pubSocket.sendThriftObj(nodeData, serializer); }); timeout->scheduleTimeout(std::chrono::seconds(10), true /* periodic */); // Let the magic begin evl.run()
We have tried fbzmq
on Ubuntu-14.04
, Ubuntu-16.04
and CentOS-7
. This should work on all Linux based platforms without any issues.
At the top level of this repo are the build
and fbzmq
directories. Under the former is a tool, fbcode_builder
, that contains scripts for generating a docker context to build the project. The fbzmq
directory contains the source for the project.
cmake
gflags
gtest
libsodium
libzmq
zstd
folly
fbthrift
We've provided a script, build/build_fbzmq.sh
, well tested on Ubuntu-16.04, to install all necessary dependencies, compile fbzmq and install C++ binaries as well as python tools. Please modify the script as needed for your platform. Also, note that some library dependencies require a newer version than provided by the default package manager on the system and hence we are compiling them from source instead of installing via the package manager. Please see the script for those instances and the required versions.
Learn more here.
// Step into `build` directory cd build // Install dependencies and fbzmq sudo bash ./build_fbzmq.sh make test
fbzmq
builds a static library and install steps installs library as well all header files to /usr/local/lib/
and /usr/local/include/
(under fbzmq sub directory)
cd fbzmq/fbzmq/py python setup.py build sudo python setup.py install
zmq/*
are a straight forward C++ wrappers over raw libzmq objects (like zmq_msg_t, zmq_ctx_t, etc) in C. ZmqEventLoop is an event loop which allows you to attach different event callbacks on sockets as well as schedule timeouts. Internally it maintains a dynamic poll-list which is updated only when new socket/fd
is added/removed and uses zmq_poll
APIs for polling the list. It also maintains internal heap of timeouts ordered on their expiry times.
To understand how to use library, take a look at examples/
directory. All of our code is very well documented and refer to appropriate header files for up to date and detailed documentation of various APIs/functionalities.
fbzmq is MIT-licensed.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4