Centrifugo(六)引擎(Engines)

    Centrifugo 引擎负责如何发布消息、处理订阅、状态及历史数据的保存及恢复等。
    Centrifugo 可选的引擎为 MemoryRedis,默认使用 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, default 6379)
  • redis_url (string, default ""): optional Redis connection URL
  • redis_password (string, default "")
  • redis_db (int, default 0): number of Redis db to use
  • redis_tls (boolean, default false): enable Redis TLS connection (new in v2.0.2)
  • redis_tls_skip_verify (boolean, default false): 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 monitors
  • redis_prefix (string, default "centrifugo"): 用于 Redis 中的频道(channels)与键(keys)的自定义前缀
  • redis_sequence_ttl (int, default 0): 设置 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