原生分布式架构

集群现在已经成为CabloyJS的一等公民。也就是说,CabloyJS项目随时做好准备,以便部署到集群环境中

EggJS原有的Worker + Agent进程模型,对于单机环境而言非常便利。但是面对多机集群,特别是基于docker的集群部署而言,Agent进程就失去了用武之地。更重要的是,如果一开始基于Agent进程进行开发,后续很难平滑的过渡到分布式场景

因此,CabloyJS采用Redis,从框架底层就开始原生分布式的架构设计,并衍生出了广播Broadcast队列Queue定时任务Schedule启动项Startup等一系列分布式的开发组件,方便我们从一开始就进行分布式的开发。因此当系统起量后,可以轻松做集群扩展,参见:

配置Redis

由于CabloyJS内置三个运行环境,因此,我们需要对不同的运行环境配置不同的Redis参数

src/backend/config/config.{env}.js

  // redis
  const __redisConnectionDefault = {
    host: '127.0.0.1',
    port: 6379,
    password: '',
    db: 0,
  };
  const __redisConnectionDefaultCache = Object.assign({}, __redisConnectionDefault, {
    keyPrefix: `cache_${appInfo.name}:`,
  });
  const __redisConnectionDefaultIO = Object.assign({}, __redisConnectionDefault, {
    keyPrefix: `io_${appInfo.name}:`,
  });

  config.redisConnection = {
    default: __redisConnectionDefault,
    cache: __redisConnectionDefaultCache,
    io: __redisConnectionDefaultIO,
  };

  config.redis = {
    clients: {
      redlock: config.redisConnection.default,
      limiter: config.redisConnection.default,
      queue: config.redisConnection.default,
      broadcast: config.redisConnection.default,
      cache: config.redisConnection.cache,
      io: config.redisConnection.io,
    },
  };

上面的代码定义了多个Redis客户端实例,分别用于不同的场景,如:redlocklimiter等等。但是这些客户端实例最终都指向了同一个Redis服务

当访问量上升后,可以考虑不同的客户端实例指向不同的Redis服务,分担系统压力

  • __redisConnectionDefault
名称 说明
host IP地址
port 端口号
password 密码
db 所使用的数据库索引,默认为0
  • config.redis.clients
名称 说明
redlock 分布式锁
limiter 限流器
queue 队列
broadcast 广播
cache 缓存
io socketio