Microservices Setup [beta]

This guide is currently only valid for a special distribution of the Rocket.Chat.

The feature will be released for General Availability on the Enterprise Edition v4.0

Pre-requisites

The following environment variables should be set for Rocket.Chat services as well:

Variable

Value

Description

TRANSPORTER

nats://nats:4222

NATS address

DISABLE_DB_WATCH

true

Disables internal DB watcher and rely on mongodb-stream-hub

DISABLE_PRESENCE_MONITOR

true

Disables presence monitoring and rely on the presence-service

INTERNAL_SERVICES_ONLY

true

Do not run external services on rocket.chat process

Microservices

Rocket.Chat microservices are composed of a few Docker containers:

Accounts

Responsible for user authentications

docker run \
--name accounts-service \
-e MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs01 \
-e TRANSPORTER=nats://nats:4222 \
rocketchat/account-service:latest

Authorization

Responsible for the validation of access to features

docker run \
--name authorization-service \
-e MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs01 \
-e TRANSPORTER=nats://nats:4222 \
rocketchat/authorization-service:latest

DDP Streamer

Web socket interface between server and clients

docker run \
--name ddp-streamer \
-e MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs01 \
-e TRANSPORTER=nats://nats:4222 \
rocketchat/ddp-streamer-service:latest

DDP Streamer should be scaled from the beginning. (One per 500 concurrent users should be good enough)

MongoDB Stream Hub

Can not be scaled to multiple containers

Receives real-time data from MongoDB and emits that data to the system.

docker run \
--name mongodb-stream-hub \
-e MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs01 \
-e TRANSPORTER=nats://nats:4222 \
rocketchat/stream-hub-service:latest

Presence

Controls and update users' presence status.

In a situation where you have a huge amount of data/users, you can get away with not running it to reduce the traffic of presence processing. If you are not running it, the user's online/offline status and notification will not work properly.

docker run \
--name presence-service \
-e MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs01 \
-e TRANSPORTER=nats://nats:4222 \
rocketchat/presence-service:latest

Environment variables common to all services

Set the following environment variables to enable Prometheus metrics:

Variable

Default

Description

MS_METRICS

false

Enable Prometheus metrics endpoint

MS_METRICS_PORT

9458

Port of Prometheus metrics endpoint

Reverse proxy

Once all services are up and running the web socket connections should be targeted to ddp-streamer containers, the configuration depends on the reverse proxy you have set up, but you need to change the following routes:

  • /sockjs

  • /websocket

If using Kubernetes, an Ingress like the following can be used:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ddp-streamer
spec:
rules:
- host: your-hostname.rocket.chat
http:
paths:
- backend:
serviceName: ddp-streamer
servicePort: 3000
path: /(sockjs|websocket)

Summary:

To summarize it:

  1. You just need to deploy the reverse proxy to split the communication.

  2. Run all the above services pointing to the NATS and the MongoDB.

  3. Deploy NATS.

  4. Run Rocket.Chat according to the above-mentioned variables.