This compose file will create following test setup for Faye messaging server with Redis backend:
- Redis master server and Redis slave server.
- Three Redis Sentinels connected to Redis instances and watching master/slave changes.
- Simple faye server setup with faye-ioredis plugin (faye redis backend), scaled by 3 instances with same name (simple dns round-robin balancing inside docker network).
- Simple faye publish service - every 10 seconds will publish in channel /msgs message with current date and time
- Simple faye client scaled by 10 instances. Every client configured to subscribe to channel /msgs and receive message published every 10 seconds.
Assume you have latest versions of docker and docker-compose. Clone repository, from cloned directory run
docker-compose up --build -d
Clients connect to faye server instances and receive messages no matter which server they are connected to, so Redis backend is working. We can monitor connected clients by running:
docker-compose logs faye-cluster
And we can monitor received messages by running:
docker-compose logs faye-client
We can stop Redis master container and initiate promoting slave Redis server to master by Sentinels and back to test Redis backend failover:
docker stop faye_cluster_redis-master_1
Then to resume:
docker start faye_cluster_redis-master_1
In this project faye-ioredis plugin was locked to version 0.2.0 (corresponds to ioredis 1.13.1). Last version (0.3.0 with bumped ioredis to 4.19.4) not working correctly - in about 1 min after server was created it crashes with error:
/usr/src/faye/node_modules/faye-ioredis/faye-redis.js:276
.bind(this)
^
TypeError: this._redis.setnx(...).bind is not a function
at Engine._withLock (/usr/src/faye/node_modules/faye-ioredis/faye-redis.js:276:8)
at Engine.gc (/usr/src/faye/node_modules/faye-ioredis/faye-redis.js:257:17)
at Timeout._onTimeout (/usr/src/faye/node_modules/faye-ioredis/faye-redis.js:47:44)
at listOnTimeout (internal/timers.js:557:17)
at processTimers (internal/timers.js:500:7)