smallfish bio photo

smallfish

Engineer at Alibaba, Taobao.com #golang #clojure #nginx-lua #postgres

Email Twitter Github

最近造了一个轮子:rabbitmq-http,源于内部项目的一个翻版。基于 Go 语言实现。

先说说为什么要写 HTTP API,在使用 RabbitMQ 过程中碰到了以下几个问题:

  • 多语言,这样就要求每个语言都需要安装对应的 amqp 库。
  • 版本,“历史遗留”原因,对应的 amqp 库比较古老,升级不易。
  • 协议实现不全,这个也是跟版本有点关系。
  • 切分和扩展,想自己逻辑里按照用户或 vhost 等来做 hash 切分有点麻烦。
  • TCP,调试和跟踪不易啊。
  • 功能复杂,对于使用者来说曲线较高,大都数情况只是生产者消费者模型。

其实也不算是问题,就是不爽的地方。也就是想找一个自由度略大的方案,然后使用起来也简单方便。

就整出了一个 HTTP 的方案,刚好最近手痒,想用 Go 语言写点东西,遂趁着周末和晚上整了一下。

仓库地址:https://github.com/smallfish/rabbitmq-http

如何安装依赖、编译和启动这些操作,这里就不再赘述,直接参考项目里的 README.md

目前封装的接口大致分为一下几类:

  • Exchange
    • 新建
    • 删除
  • Queue
    • 新建
    • 删除
    • 绑定/取消绑定
    • 读取消息
  • Message
    • 发布新消息

上面的新建、删除、发送或者读取的行为对应 HTTP 请求中的几种方法,比如:POST、DELETE、GET等。

整个 API 的返回值(HTTP状态码)有一下三类:

  • 200,操作 OK,返回的 Body 体中有简单描述字符。
  • 405,不支持的请求方式,比如接口尚未实现。
  • 500,服务器端错误,Body 体中会有错误的描述。比如队列不存在、删除错误等。

好了,还是来一点实际的例子吧。完全是 curl 操作:

新建一个 Exchange:

$ curl -i -X POST http://127.0.0.1:8080/exchange -d \
'{"name": "e1", "type": "topic", "durable": true, "autodelete": false}'

新建一个 Queue:

$ curl -i -X POST http://127.0.0.1:8080/queue -d \
'{"name": "q1"}'

绑定 Queue 到 Exchange 上:

$ curl -i -X POST http://127.0.0.1:8080/queue/bind -d \
'{"queue": "q1", "exchange": "e1", "keys": ["aa", "bb", "cc"]}'

发布消息到 Exchange,指定 Routing-key:

$ curl -i -X POST http://127.0.0.1:8080/publish -d \
'{"exchange": "e1", "key": "bb", "body": "hahaha"}'

读取一下刚才发送的消息,即消费某个 Queue:

$ curl -i "http://127.0.0.1:8080/queue?name=q1"
        
PS:消费的接口输出为 Chunked 模式,可以用类似文件的行读取方式,接口是 HTTP 长连接。
同时这个接口也支持多个 Queue 一起消费,类似:“/queue?name=q1&name=q2” 即可。

基本常用的接口已经暴露出来, 后续还会封装一些其他语言的 SDK,其实都是普通的 HTTP 的请求。

欢迎 fork,欢迎当小白鼠, ^_^

END