Skip to content

Latest commit

 

History

History
86 lines (66 loc) · 4.78 KB

design.md

File metadata and controls

86 lines (66 loc) · 4.78 KB

pepperbus

A realtime distributed messaging service

花椒bus总线

功能需求

  1. 持久化的任务与消息队列
  2. 任务的调度处理框架
  3. 任务的跟踪与管理,任务监控
  4. 支持定时任务的分发与管理

特性

  1. 支持redis协议作为总线数据输入,充分利用业务端成熟的redis扩展,对业务端友好,迁移和改造成本低
  2. 通过fastcgi协议与后端通信,与实际的业务逻辑解耦,方便的支持php和golang等多种语言接入
  3. 数据的输入和输出对于长连接友好,解决LNMP解决方案,长连接情况下,由于集群连接过多给后端服务造成压力,通过代理方式与最终的后端服务做连接复用,对输入不限制长连,对输出维持有限长连接
  4. 总线队列支持常规的生产者和消费者模式,消息可以按订阅关系重复消费
  5. 全链路监控策略,可以获取流水线作业的操作序列,完整自描述其关系
  6. 队列拥塞状态监控,通过与消费者协议交互,反馈处理异常的队列,计算队列消费者处理能力,动态扩容消费进程
  7. 总线支持定时任务的设置和管理,动态控制和迁移定时任务,解决常规的crontab的管理问题
  8. 总线队列支持平滑重启,平稳恢复所有任务

工作流程图

整体架构图

pepper_bus_overview

架构描述

1.业务服务器可以与bus总线实例混合部署也可以独立部署,混合部署时可以优先访问本地总线服务器,独立分离部署可以与总线服务用域名进行通信 2.总线服务器与php-fpm交互可以通过本地也可以通过网络

任务处理流程图

pepper_bus_overview_1

业务处理流程图说明

  1. 业务服务器将任务加入到总线服务
  2. 总线服务存储任务到存储
  3. 将总线任务传输给cgi进程
  4. cgi进程返回处理结果
  5. 总线移除处理任务

详细设计

名词解释:

名词 解释 备忘
任务队列(Queue) 总线可以按需要分为多个队列,是任务的载体 每个队列可以对应一组任务
任务(Job) 业务加入到指定队列的数据,每个任务要选择加入一个队列,通常任务与队列一一对应。任务分为多个类型,每个任务涉及多个属性 正常是一个待处理JSON数据
FIFO任务 该任务是强时序任务,按照先入先出的方式交付给消费者进程处理,并不能保证处理完成时间一致
可重复消费任务 可被多个订阅者重复消费
任务属性 执行失败是否可以重试,重试多少次后放到重试队列,多少次失败放入失败队列,是否放到对应的重试队列等细节控制参数,任务优先级
通道(channel) 为任务消费者提供一个通道,多个消费者可以订阅不同的通道重复消费队列中的数据 所有队列都有一个默认通道,每一个通道是一份独立的数据拷贝,要求通道需要对队列服务进行单独操作进行创建
重试通道 指定通道响应失败的数据,允许配置重试 重试成功后移除,重试失败后保留在失败通道不再重试
失败通道 重试超过一定次数,移动到失败通道 失败通道的数据可以通过命令行移动到重试通道

数据接口

接口名称 说明 协议 备注
添加任务 向总线添加任务 redis:LPUSH 向队列添加任务
删除任务 将总线中未执行的某个任务标记为删除 http/redis:LREM 删除指定任务
修改任务配置 修改执行任务对应的配置 http/redis:HMSET 如:重试次数,重试间隔,任务执行超时时间
队列配置接口 修改指定队列对应的配置 http/redis:HMSET 如:队列对应的引擎,存储认证信息,消费fastcgi端口
队列查询接口 查询队列的执行状态 http/redis:HGETALL 如:队列长度,对应辅助队列长度,输入QPS,输出QPS,并发数
配置参数 含义 类型 备注
chunk 合并多条job传输给消费者 int 可以指定一次传输和处理的条数,便于优化使用操作后端资源
retryTimes 重试的次数 int 最大重试设置为10
retryInterval 重试间隔 int 每条数据的重试间隔
waitTimeout 等待队列响应时长 int 数据响应的等待时长,这个waitTimeout要配合chunk使用

job数据结构 获取方式: cgi进程通过获取 $SERVER["job"]获取,内容如下: job是抽象给应用层概念,在sdk中有表示,底层透明

字段 说明
jobid 添加时生成的唯一id
channel 来自的channel,默认是default
content 透传内容