# README
gateway
Service for multiplexing many Discord websockets on top of any number of backends. Consists of 2 components: Gateway & State Cache
NOTE: This currently only supports Tatsu's specific use case. More backends will be written in the future as time permits.
A custom ETF parser was written from the ground up. During peak traffic, gateway uses ~4 cores for 720 shards.
State is stored in foundationdb and accessed via the State Cache (cmd/state).
Events are pushed to redis using RPUSH
. The content is the d
key of the event encoded as ETF.
Common Dependencies
- Ensure you have Go 1.13 or higher.
- Install foundationdb (both the server and clients package).
- Install redis.
Setting up the Gateway
- Add a variable in
cmd/gateway/main.go
namedToken
that contains your token. - Enable modules
export GO111MODULE=on
- Run
go build
incmd/gateway
- To run, do
./gateway
incmd/gateway
Redis Configuration
The gateway requires the MULTI_REDIS
environment variable to be set. This allows you to configure one or more Redis instances with optional per-instance event filtering.
Format: {"redis_address": ["EVENT_TYPE1", "EVENT_TYPE2"], ...}
Examples:
Single Redis instance, no event filtering (all events sent):
export MULTI_REDIS='{"localhost:6379":[]}'
Single Redis instance with event filtering:
export MULTI_REDIS='{"localhost:6379":["MESSAGE_CREATE","MESSAGE_UPDATE","MESSAGE_DELETE"]}'
Multiple Redis instances with different event filters:
export MULTI_REDIS='{"redis1.example.com:6379":["MESSAGE_CREATE","MESSAGE_UPDATE"],"redis2.example.com:6379":["GUILD_CREATE","GUILD_UPDATE"]}'
Setting up the State
- Run
go build
incmd/state
- To run, do
./state
incmd/state