原生分布式架构

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

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

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

配置Redis

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

注意:以下均是默认配置,一般不用变更,只要确保hostport符合实际值即可

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

  1. 1 // redis
  2. 2 const __redisConnectionDefault = {
  3. 3 host: '127.0.0.1',
  4. 4 port: 6379,
  5. 5 password: '',
  6. 6 db: 0,
  7. 7 };
  8. 8 const __redisConnectionDefaultCache = Object.assign({}, __redisConnectionDefault, {
  9. 9 keyPrefix: `cache_${appInfo.name}:`,
  10. 10 });
  11. 11 const __redisConnectionDefaultIO = Object.assign({}, __redisConnectionDefault, {
  12. 12 keyPrefix: `io_${appInfo.name}:`,
  13. 13 });
  14. 14
  15. 15 config.redisConnection = {
  16. 16 default: __redisConnectionDefault,
  17. 17 cache: __redisConnectionDefaultCache,
  18. 18 io: __redisConnectionDefaultIO,
  19. 19 };
  20. 20
  21. 21 config.redis = {
  22. 22 clients: {
  23. 23 redlock: config.redisConnection.default,
  24. 24 limiter: config.redisConnection.default,
  25. 25 queue: config.redisConnection.default,
  26. 26 broadcast: config.redisConnection.default,
  27. 27 cache: config.redisConnection.cache,
  28. 28 io: config.redisConnection.io,
  29. 29 },
  30. 30 };

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

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

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