Centrifugo 引擎负责如何发布消息、处理订阅、状态及历史数据的保存及恢复等。Centrifugo 可选的引擎为 Memory
和 Redis
,默认使用 Memory
。两者最大的不同在于,Memory
引擎只支持一个 Centrifugo 节点,而 Redis
引擎支持多节点部署。可以通过配置文件中的 engine
属性来设置 Centrifugo 使用的引擎,也可以在启动命令中通过 engine
参数指定:
centrifugo --config=config.json --engine=redis
Memory engine
只支持一个节点,所有信息存储在服务器内存中。
Redis engine
支持 Centrifugo 在多服务器伸缩部署,使用 Redis 作为消息路由,状态信息及历史数据保存在 Redis 内存数据库中,内部节点之间的通讯通过 Redis 的发布/订阅机制来进行通信。同时,此模式支持 API 命令排队。
要想使 Centrifugo 支持通过 Redis engine API listener 发布消息,可以在启动时使用 --redis_api
参数:
centrifugo --config=config.json --engin=redis --redis_api
如此启动后,可以直接通过 Redis 客户端来发布消息,示例代码(Python):
import redis
import json
client = redis.Redis()
command = {
"method": "publish",
"params": {
"channel": "events",
"data": {"enent": "message"}
}
}
client.rpush("centrifugo.api", json.dumps(command))
<font color="blue">RPUSH</font> 命令允许在一个请求中将多条消息推入队列。
注意:我们通过 <font color="blue">RPUSH</font> 将消息推送到了 centrifugo.api
,这是 API 队列的默认名称,Centrifugo 实时对其监控。事实上,在 Redis 中,这是一个列表结构。此处,你推送过来的指令会被 Centrifugo 及时处理,但是并不会给客户端响应。如果需要获取响应,那只能使用 HTTP API
。
publish
是最常用的 Centrifugo 指令,Redis_API
的主要目的是降低高频率发布时的 HTTP 开销。同时,也方便各种类型的语言使用 Centrifugo,而不需要依赖 HTTP API client
。
与 Redis 引擎相关的参数如下:
--redis_api enable Redis API listener (Redis engine)
--redis_api_num_shards int Number of shards for redis API queue (Redis engine)
--redis_db string redis database (Redis engine) (default "0")
--redis_host string redis host (Redis engine) (default "127.0.0.1")
--redis_master_name string Name of Redis master Sentinel monitors (Redis engine)
--redis_password string redis auth password (Redis engine)
--redis_pool int Redis pool size (Redis engine) (default 256)
--redis_port string redis port (Redis engine) (default "6379")
--redis_sentinels string Comma separated list of Sentinels (Redis engine)
--redis_url string redis connection URL in format redis://:password@hostname:port/db (Redis engine)
说明:
1. 当 --redis_url
参数生效时,--redis_host
、--redis_port
、--redis_password
、--redis_db
参数会被替代掉,不再生效。
2. --redis_api_num_shards
参数必须与 --redis_api
参数配合使用。它将创建 N 个分片队列。该参数主要用于超高并发的消息发布。通过对 API 队列分片降低单队列的压力,提升消息发布效率。如果 --redis_api_num_shards
配置为 5,则将产生 5 个 API 队列分片:
centrifugo.api.0
centrifugo.api.1
centrifugo.api.2
centrifugo.api.3
centrifugo.api.4
当使用此参数时,在客户端侧,你必须指定要将消息发布到哪个 API 队列。为了保证频道中消息的顺序,需要注意在客户端中要将消息按顺序推送到同一 API 队列的同一频道中。