原生分布式架构
集群
现在已经成为CabloyJS
的一等公民。也就是说,CabloyJS项目随时做好准备,以便部署到集群环境中
EggJS原有的Worker + Agent
进程模型,对于单机环境而言非常便利。但是面对多机集群,特别是基于docker
的集群部署而言,Agent进程
就失去了用武之地。更重要的是,如果一开始基于Agent进程
进行开发,后续很难平滑的过渡到分布式场景
因此,CabloyJS采用Redis
,从框架底层就开始原生分布式的架构设计,并衍生出了广播Broadcast
、队列Queue
、定时任务Schedule
、启动项Startup
等一系列分布式的开发组件,方便我们从一开始就进行分布式的开发。因此当系统起量后,可以轻松做集群扩展,参见:
配置Redis
由于CabloyJS内置三个运行环境,因此,我们需要对不同的运行环境配置不同的Redis参数
注意:以下均是默认配置,一般不用变更,只要确保
host
和port
符合实际值即可
src/backend/config/config.{env}.js
- 1 // redis
- 2 const __redisConnectionDefault = {
- 3 host: '127.0.0.1',
- 4 port: 6379,
- 5 password: '',
- 6 db: 0,
- 7 };
- 8 const __redisConnectionDefaultCache = Object.assign({}, __redisConnectionDefault, {
- 9 keyPrefix: `cache_${appInfo.name}:`,
- 10 });
- 11 const __redisConnectionDefaultIO = Object.assign({}, __redisConnectionDefault, {
- 12 keyPrefix: `io_${appInfo.name}:`,
- 13 });
- 14
- 15 config.redisConnection = {
- 16 default: __redisConnectionDefault,
- 17 cache: __redisConnectionDefaultCache,
- 18 io: __redisConnectionDefaultIO,
- 19 };
- 20
- 21 config.redis = {
- 22 clients: {
- 23 redlock: config.redisConnection.default,
- 24 limiter: config.redisConnection.default,
- 25 queue: config.redisConnection.default,
- 26 broadcast: config.redisConnection.default,
- 27 cache: config.redisConnection.cache,
- 28 io: config.redisConnection.io,
- 29 },
- 30 };
上面的代码定义了多个Redis客户端实例,分别用于不同的场景,如:redlock
、limiter
等等。但是这些客户端实例最终都指向了同一个Redis服务
当访问量上升后,可以考虑不同的客户端实例指向不同的Redis服务,分担系统压力
- __redisConnectionDefault
名称 | 说明 |
---|---|
host | IP地址 |
port | 端口号 |
password | 密码 |
db | 所使用的数据库索引,默认为0 |
- config.redis.clients
名称 | 说明 |
---|---|
redlock | 分布式锁 |
limiter | 限流器 |
queue | 队列 |
broadcast | 广播 |
cache | 缓存 |
io | socketio |
评论: