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.
- Ensure you have Go 1.13 or higher.
- Install foundationdb (both the server and clients package).
- Install redis.
- Add a variable in
cmd/gateway/main.gonamedTokenthat contains your token. - Enable modules
export GO111MODULE=on - Run
go buildincmd/gateway - To run, do
./gatewayincmd/gateway
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"]}'- Run
go buildincmd/state - To run, do
./stateincmd/state