Centrifugo(六)引擎(Engines)
Centrifugo 引擎负责如何发布消息、处理订阅、状态及历史数据的保存及恢复等。
Centrifugo 可选的引擎为 Memory
和 Redis
,默认使用 Memory
。两者最大的不同在于,Memory
引擎只支持一个 Centrifugo 节点,而 Redis
引擎支持多节点部署。可以通过配置文件中的 engine
属性来设置 Centrifugo 使用的引擎,也可以在启动命令中通过 engine
参数指定:
centrifugo --config=config.json --engine=redis
也可以在配置文件中指定:
{
...
"engine": "redis"
}
Memory engine
只支持一个节点,所有信息存储在服务器内存中。
- 优点
- 速度快
- 简单,不需要安装 Redis
- 缺点
- 无法扩展节点
Redis engine
支持 Centrifugo 在多服务器伸缩部署,使用 Redis 作为消息路由,状态信息及历史数据保存在 Redis 内存数据库中,内部节点之间的通讯通过 Redis 的发布/订阅机制来进行通信。同时,此模式支持 API 命令排队。
Redis 最低版本要求为 v3.2.0
与 Redis 引擎相关的配置选项如下:
redis_host
(string, default"127.0.0.1"
)redis_port
(int, default6379
)redis_url
(string, default""
): optional Redis connection URLredis_password
(string, default""
)redis_db
(int, default0
): number of Redis db to useredis_tls
(boolean, defaultfalse
): enable Redis TLS connection (new in v2.0.2)redis_tls_skip_verify
(boolean, defaultfalse
): disable Redis TLS host verification (new in v2.0.2)redis_sentinels
(string, default""
): 以逗号分隔的 Sentinels for HA 列表redis_mastr_name
(string, default""
): name of Redis master Sentinel monitorsredis_prefix
(string, default"centrifugo"
): 用于 Redis 中的频道(channels)与键(keys)的自定义前缀redis_sequence_ttl
(int, default0
): 设置 Redis 引擎中序列数据的过期时间,以秒为单位。Sequence meta key in Redis is a HASH that contains current sequence number in channel and epoch value. 默认情况下,频道的序列数据是永不过期的。尽管在某下情况下(例如当频道只创建了很短一段时间,之后就不再使用),创建的序列元数据会被保存在内存中,而实际上并没有用。从长远来看,这也可以认为是一种内存泄漏。将本选项设置为一个合适的值,将有助于改善这种状况
以上这些选项均可以在配置文件中设置,其中的部分可以在启动命令行参数中直接设置 。
关于选项 redis_url
,该选项用于设置 Redis 的连接字符串,格式为 redis://:password@hostname:port/db
。当 --redis_url
参数生效时,--redis_host
、--redis_port
、--redis_password
、--redis_db
参数会被替代掉,不再生效。
KeyDB engine
Centrifugo Redis engine 可与 KeyDB 无缝协作,KeyDB 服务器与 Reids 兼容,并且提供其他一些附加功能。此功能为实验功能,不保证未来版本仍然与 KeyDB 兼容。
// —– 以下为老版本内容,未验证是否在新版本仍适用 ——-
--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 队列的同一频道中。
要想使 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))
RPUSH 命令允许在一个请求中将多条消息推入队列。
**注意:**我们通过 RPUSH 将消息推送到了 centrifugo.api
,这是 API 队列的默认名称,Centrifugo 实时对其监控。事实上,在 Redis 中,这是一个列表结构。此处,你推送过来的指令会被 Centrifugo 及时处理,但是并不会给客户端响应。如果需要获取响应,那只能使用 HTTP API
。
publish
是最常用的 Centrifugo 指令,Redis_API
的主要目的是降低高频率发布时的 HTTP 开销。同时,也方便各种类型的语言使用 Centrifugo,而不需要依赖 HTTP API client
。