Broker User Manual¶
Broker is a library for type-rich publish/subscribe communication in Zeek’s data model.
Outline¶
Section 1 introduces Broker’s key components and basic terminology, such as endpoints, messages, topics, and data stores.
Section 2 shows how one can send and receive data with Broker’s publish/subscribe communication primitives. By structuring applications in independent endpoints and peering with other endpoints, one can create a variety of different communication topologies that perform topic-based message routing.
Section 3 presents Broker’s data model, which applications can pack into messages and publish under given topics. The same data model is also used by Broker’s data stores.
Section 4 introduces data stores, a distributed key-value abstraction operating with the complete data model, for both keys and values. Users interact with a data store frontend, which is either an authoritative master or a clone replica. The master can choose to keep its data in various backends, currently either in-memory, or persistently through SQLite, or RocksDB.
Section 6 discusses the Broker’s Python bindings, which transparently expose all of the library’s functionality to Python scripts.
Finally, Section 7 dives deep into the architecture and implementation of Broker. This Section is meant for guiding C++ software developers that wish to contribute to Broker.
Synopsis¶
#include <iostream>
#include <broker/broker.hh>
using namespace broker;
int main()
{
endpoint ep;
ep.peer("1.2.3.4", 9999); // Connect to remote endpoint on given address/port.
// Messages
ep.publish("/test/t1", set{1, 2, 3}); // Publish data under a given topic.
auto sub = ep.make_subscriber({"/test/t2"}); // Subscribe to incoming messages for topic.
auto msg = sub.get(); // Wait for one incoming message.
std::cout << "got data for topic " << get_topic(msg) << ": " << get_data(msg) << std::endl;
// Data stores
auto m = ep.attach_master("yoda", backend::memory); // Create data store.
m->put(4.2, -42); // Write into store.
m->put("bar", vector{true, 7u, now()});
if ( auto d = m->get(4.2) ) // Look up in store.
std::cout << "value of 4.2 is " << to_string(d) << std::endl;
else
std::cout << "no such key: 4.2" << std::endl;
}