/data-broker

Queue (kafka) backed context broker

Primary LanguageTypeScriptGNU General Public License v3.0GPL-3.0

dojot data-broker

This repository contains the implementation for the event broker used internally by dojot's event processing services. This component should replace functionality previously provided by FIWARE orion context broker.

How to build

Being written in TypeScript, one can use npm's configured scripts to build this:

# installs all dependencies
npm install
# builds
npm run-script build

To generate a docker container, one may issue the following command:

docker build -t <tag> -f docker/Dockerfile .

Then an image tagged as <tag> will be made available. Do notice that a pre-built "official" version for this component may be found at dojot's dockerhub.

How to run

Once built:

npm run subscription

Do notice that this component depends on a couple of external infrastructure to work. For an easier setup with an fully operational broker, please consider the use of the minimal docker-compose service definitions available at local/compose.yml, which configures instances of all required infrastructure for the broker.

To spin up an environment using that:

docker-compose -f local/compose.yml -p broker up

This will setup an environment using the latest "official" image from the service, retrieved from dockerhub. To use your own generated image either update the image stanza of the broker service on local/compose.yml to the tag of your own build, or comment out the broker service from the file, and create a container within the same network of the docker-compose environment:

docker run -it --rm -v $PWD:/opt/subscription-manager --network broker_default <tag> bash

That, along with the volume mounting (included in the example above) provides a very easy way of building a development environment for the service.

How to use

This service implements two information dissemination features required by most of the services that compose dojot: the management of topics for information dissemination (e.g. device creation events) and brokering of device data between interested parties (subscribers), based on flexible subscription patterns.

For the first (meta-information dissemination), this service handles the creation of runtime kafka topics that segregate information on a tenant context basis, restricting the set of events a given service is exposed to only the ones it is actually allowed to process.

The second use-case deals with the routing of device events to all interested parties - be them internal to dojot (e.g. history, flow processor) or external (e.g. an application).

As with the context broker in FIWARE, when a process is interested in receiving a set of particular events, it should issue a subscription request to data-broker, detailing the conditions that must be satisfied for an event to be sent to the requester. The set of specified conditions may take into account information about its original emitter (i.e. the device itself), some conditions on the values of individual attributes that are contained in the event or a combination of both.

When a subscription request is accepted by data-broker, a kafka topic identifier is returned to the caller, so that it can follow up on the events that meed the set of conditions imposed by the subscription request.

As with meta-information dissemination topics, all events sent to any given topic are restricted to the tenancy context from which the subscription request was originated. That said, should two users, from the same tenancy context, issue two different subscription requests with the exact same conditions specified, data-broker might return the same kafka topic to satisfy both subscriptions.

On both cases, as we are dealing with kafka queues, it is up to the consumers of the returned topics to keep track of where the head of its processed queue is at. That allows consumers to process events at their own pace, thus avoiding unwanted data loss in the process. Another important characteristic of the configured topics is that, at the moment, they are single-partitioned.