A collection of services consuming PushNotification events to send push notifications to apns2/fcm/web push and Application events to receive configuration.
The systems are by default multi-tenant for sending push notifications to multiple different applications.
- apns2 for Apple notifications
- fcm for Google notificiations
- web_push for Web push notifications
- http_requester for generic HTTP requests
- common a library used by all four consumers
The consumers can be installed through Cargo:
> cargo install xorc-notificationsIt installs four different binaries: apns2, fcm, web_push and
http_requester, all named after the systems they present.
| variable | description | example |
|---|---|---|
CONFIG |
The configuration file location | /etc/xorc-notifications/config.toml |
LOG_FORMAT |
Log output format | text or json, default: text |
RUST_ENV |
The program environment | test, development, staging or production, default: development |
| section | key | description | example |
|---|---|---|---|
[kafka] |
input_topic |
Notification input topic | "production.notifications.apns" |
[kafka] |
config_topic |
Application configuration topic | "production.applications" |
[kafka] |
output_topic |
Notification response topic | "production.oam" |
[kafka] |
group_id |
Consumer group ID | "production.consumers.apns" |
[kafka] |
brokers |
Comma-separated list of Kafka brokers | "kafka1:9092,kafka2:9092" |
[kafka] |
consumer_type |
Decides the input protobuf deserialization | push_notification for PushNotification, http_request for HttpRequest |
The systems are written with Rust and it should always be possible to compile with the latest stable version. The de-facto way of getting the latest Rust is with rustup:
> curl https://sh.rustup.rs -sSf | sh
> rustup update
> rustup default stableTo check that everything works:
> rustc --version
rustc 1.30.0 (da5f414c2 2018-10-24)
> cargo --version
cargo 1.30.0 (36d96825d 2018-10-24)Some of the crates used in the project have dependencies to certain system libraries and tools, for Ubuntu 18.04 you get them with:
> sudo apt install build-essential libssl-dev automake ca-certificates libffi-dev protobuf-compilerThe project uses Protocol
Buffers for event schemas.
cargo build should generate the corresponding Rust structs to be used in the
code. By default the protobuf classes are included as a submodule, which must be
imported to the project tree:
> git submodule update --initConfiguration examples for all the consumers are in config. Create a copy from an example config removing the ending, and modify it to suit your test setup.
Running apns2:
> env CONFIG=./config/apns2.toml cargo run --bin apns2Running fcm:
> env CONFIG=./config/fcm.toml cargo run --bin fcmRunning web_push:
> env CONFIG=./config/web_push.toml cargo run --bin web_pushRunning http_requester:
> env CONFIG=./config/http_requester.toml cargo run --bin http_requesterThe examples directory contains helper scripts for testing the consumers.
To build them:
cargo build --release --examplesThe executables are in target/release directory.
The system is configuration is handled through a toml file and a environment variable.
- All four systems use an asynchronous Kafka consumer consuming the
input_topic, requesting the external service with a client, parsing the response and responding back to the caller. - System should implement the
EventHandler(request_consumer.rs) and respond withResponseProducer(response_producer.rs). - Consumer should keep track of connections for different applications using
the configuration values from the
config_topic. - In general none of the main code should never block.
- All consumers talk HTTP and when requested, return Prometheus statistics