协议设计

在性能与可扩展性的平衡之上,zbus协议格式采用类HTTP格式:格式兼容HTTP,应用头部扩展做控制,Body透明传输。

简单可以理解zbus协议为: HTTP头部控制协议。

HTTP协议本身是标准,详细可以参考RFC2616, 但理解zbus协议不需要太多深入理解,

HTTP可以简化理解为:

从下面可以看出,表达zbus协议就变得非常简单

共同的头部

cmd: <cmd>        //协议的命令控制,比如produce,consume等等
topic: <topic>    //命令对应的队列标识,ZBUS的核心是操作队列

token: [token]    //Token权限控制码
id:  [id]         //消息唯一ID标识 
sender: [sender]  //消费发送者唯一标识,客户端不需要指定,zbus服务器内部唯一标识

生产消息(produce)

cmd: produce
tag: [tag]        //消息的标签,在订阅消费中用于过滤消息,可选
ack: true|false   //是否需要服务器应答
body: [body]

消费消息(consume)

cmd: consume
consume_group: [group_name]   //消费者所属分组通道
consume_window: [window_size] //支持的消费batch窗口大小,默认1

队列创建(declare)

cmd: declare
consume_group: [consume-group name]       //消费分组标识 short name=> group

topic_mask:    [topic mask value]         //队列的特殊MASK值,用于标识队列的某些特性,比如是否是内存队列
group_mask:    [consume-group mask value] //消费分组的MASK值
group_filter:  [message filter for group] //消费分组的过滤器,配合消息的Tag完成订阅功能

//locate the group's start point
group_start_copy:   [consume-group name]                 //消费分组创建时,从另外一个分组拷贝
group_start_time:   [consume-group start time]           //消费分组创建时,从某个时间点开始
group_start_offset: [consume-group start offset]         //消费分组创建时,从某个消息的偏移地址开始
group_start_msgid:  [consume-group start offset's msgid] //消费分组创建时,从某个消息的偏移地址开始,对应的消息ID,用于check

队列查询(query)

cmd: query              
consume_group: [consume-group]   //如果提供消费分组,则返回消费分组的信息

队列删除(remove)

cmd: remove
consume_group: [consume-group]   //如果提供消费分组,则删除对应的消费分组, 否则删除整个队列

队列清空(empty)

cmd: empty
consume_group: [consume-group]   //如果提供消费分组,则清空对应的消费分组, 否则清空整个队列

直接路由(route)

cmd: route 
recver: <id>  //接受消息的目标唯一标识, route路由消息在RPC,Proxy返回消息时候使用

浏览器友好设计

zbus协议设计是利用头部扩展,但浏览器最方便还是URL,为方便浏览器直接控制,zbus协议对URL做了兼容处理如下

/[topic]/[group]/[?cmd=xxx&&k=v...]    //cmd缺失默认值是produce

当头部和URL同时存在的时候,头部扩展优先级更高,同时当队列是RPC时候,支持直接浏览器访问RPC,格式

/topic/method/arg1/arg2.../[?module=xxx&k=v....] 

模块module是专门支持RPC中使用到,其他KV扩展跟上面规则一样, 参数部分是json兼容方式,复杂的数据需要提供json格式,合适在url中直接访问的是常见的string,数字等。

MQ示例:

http://localhost:15555/MyTopic?cmd=consume  从MyTopic队列上消费消息,默认分组跟队列同名
http://localhost:15555/MyTopic/group1?cmd=consume 从MyTopic队列的group1分组上消费消息
http://localhost:15555/MyTopic?cmd=declare 创建队列MyTopic,默认创建同名的消费分组
http://localhost:15555/MyTopic/group1?cmd=declare 创建队列MyTopic和消费分组group1
http://localhost:15555/MyTopic/group1?cmd=declare&group_filter=abc&group_mask=16 同上支持更多参数
http://localhost:15555/MyTopic?cmd=query  查询队列MyTopic
http://localhost:15555/MyTopic/group1?cmd=query  查询消费分组group1
http://localhost:15555/MyTopic?cmd=remove  删除队列MyTopic以及其所属全部消费分组
http://localhost:15555/MyTopic/group1?cmd=remove  删除队列MyTopic下的group1消费分组

RPC示例

http://localhost:15555/myrpc/plus/1/2  myrpc队列用于RPC时,调用plus(1,2)方法