beanstalkd-协议

beanstalk协议以ASCII编码运行在TCP协议上;客户端的执行的周期为:连接服务,发送命名和数据,等待响应,关闭连接,对于一个连接而言;服务器按接收顺序依次处理命令,并以相同的顺序发送响应;所有的数字都将转换成无符号的十进制整型.

命名,对于ASCII字符串而言,名字可以包含字母(A-Z, a-z), 数字(0-9),横线(‘-’),加号(‘+’), 斜线(“/”), 分号(“;”), 顿号(“.”), 美元符号(“$”),以及括号(“()”),但是不能以横线作为开头.字符串以空白符结尾,但是每一个名字至少包含一个字符

该协议包含两种数据格式,文本行,非结构化的数据块.其中文本行主要用于客户端命令和服务端响应,数据块常用来保存任务详情以及状态.每一个消息体 都是一个字节序列,服务端不会对消息进行检查和修改,只会原样返回,这样使得客户端能够正确的解析消息

beanstalk中并没有用于关闭连接的命令,客户端如果长时间未使用服务将会自动关闭TCP连接,对于beanstalk而言,能够同时保持大量的连接,对于客户端而言就能够更好的保持连接以及重用连接,这样就避免了创建新的TCP连接带来的额外开销

如果客户端违反协议(如:发送非法格式请求数据,命令不存在)或者服务端发生了错误,客户端将会返回如下的错误信息

- "OUT_OF_MEMORY\r\n" 内存不足,服务端无法分配足够的内存用于消息的执行,客户端需要等待一段时间再尝试发送

- "INTERNAL_ERROR\r\n" 内部错误,服务端出现了BUG

- "DRAINING\r\n" 服务端不再接受新的消息,客户端需要尝试连接其他的服务或者关闭服务

- "BAD_FORMAT\r\n" 客户端发送了错误的数据格式

- "UNKNOWN_COMMAND\r\n" 客户端发送了错误的命令

生产者命令

指定使用的Tube,如果不指定Tube,那么任务将会被投递到一个名为default的Tube中,其名称长度不得大于200bytes,如果Tube不存在将会新建一个,执行成功后,将会返回USING <tube>\r\n

use <tube>\r\n

创建一个新的任务

put <pri> <delay> <ttr> <bytes>\r\n

创建一个任务的可能响应值如下

任务操作命令

消费者通过使用reserve命令从Tube的ready queue队列中获取可执行的任务

reserve\r\n

reserve-with-timeout <seconds>\r\n

如果ready queue队列中,没有可用的任务,则会等待有可用的任务时才返回响应,一旦 获取到任务,那么就需要在之前创建任务时指定的<ttr>时间间隔内对任务进行处理,一旦超时 则会将任务重新投递到ready queue队列,超时时间和剩余时间可以通过stats-job命令获得

最后一秒由服务器保存为安全边际,在此期间客户不会被迫等待另一个任务,如果消费者对任务执行了 reserve操作,或者时间已到,服务端将会做出如下的反应

正常情况下,获取到的任务响应结构如下

    RESERVED <id> <bytes>\r\n
    <data>\r\n

任务执行完成以后,可以使用delete命令,将任务删除

delete <id>\r\n

执行删除后,可能的响应为 - DELETED\r\n 删除成功

当然,也可以通过使用release命名,将任务重新投递到队列中,该命令通常用于任务处理失败的情况

release <id> <pri> <delay> \r\n

在任务由reserved状态变更为ready或者delayed状态的过程中,其可能会返回如下的响应

对于执行完成的任务而言,可以使用bury命令来将任务保留,知道将其重新投递到ready queue队列或者删除

bury <id> <pri>\r\n

执行成功以后,可能会返回的响应如下

通过使用kick命令,可以手动的将buried状态的任务变更为ready状态

kick <bound>\r\n

执行后,将会返回对应的执行成功的任务数量KICKED<count>\r\n

对于耗费时间较长的任务,除了在创建时设置执行时间,还可以通过touch来更新任务的执行时间

touch <id>\r\n

执行成功后,返回的响应可能为

消费者命令

对于消费者而言,可以通过watch命令,来增加消费者的消费Tube,执行成功后,将会返回连接的Tube数量<count>\r\n,

watch <tube>\r\n

相反的,可以通过ignore命令来将Tube从列表中剔除

ignore <tube>\r\n

剔除后,可能会返回如下的响应

对于一个任务而言,有时候需要获取该任务的详细信息,因此通过stats-job命令可以查看任务在当前状态下信息

stats-job <id>\r\n

那么,其可能的响应为以下两种情况

对于任务存在的时候,返回的data将会是一个YAM格式的数据,其包含如下的信息

当然Tube的状态也是一个我们需要关注的点,通过使用stats-tube命令,可以获取某个Tube的当前状态

stats-tube <tube>\r\n

那么,其可能的响应为以下两种情况

对于Tube存在的时候,返回的data将会是一个YAM格式的数据,其包含如下的信息

更进一步,通过使用stats命令可以获取整个系统的统计信息,这里不在描述,直接看说明文档

其他的一些统计命令如下:

参考资料