一、背景:
最近的项目是关于cloud foundry,其中的消息组件是使用的nats,前期由于项目需求,说是nats不支持持久化,所以想替换掉cf的消息总线,使用rabbitmq,期间整改一个月,使接口适配nats和rabbitmq。这里先介绍nats
二、正文:
1、nats是一款基于EventMachine、使用“发布--订阅”机制的轻量级消息中间件。
nats有ruby和go等版本。
服务端源码地址:https://github.com/derekcollison/nats
客户端源码地址:https://github.com/cloudfoundry/yagnats
2、NATS作为CF的神经网络,负责者组件之间的通讯和交互工作:
这种策略下,发布者与订阅者不需要相互知道,只要按照订阅的主题进行发布,订阅者就能收到消息。
我们可以看到这次sub-pub的交互过程如下:
(1). 双方的连接成功建立之后(CONNECT操作成功得到响应之后),客户端首先订阅了主题为foo的消息,SID为1。
(2). 服务器端会记录下这主题和SID并响应+OK。
(3). 客户端发布了一个主题为foo的消息,长度为12,然后紧接着发来了消息数据“Hello World!”。
(4). 服务器端通过主题匹配找到该主题订阅者的SID是1,于是服务器端把这个消息的主题foo,SID值1,还有消息本身携带的数据“Hello World!”一起返回给客户端。
客户端根据SID =1从自己维护的订阅者列表里找到对应的订阅者,然后把服务器端返回来的数据交给订阅者去使用,一次对PUB操作的响应也就完成了。
NATS服务器端负责进行主题匹配的数据结构被称作Sublist,关于这部分数据结构的存储可以参考前面有关NATS原理的文章。
3、个人单独拜读go版本nats client源码的理解如下
nats接口说明
(1)NewClient()
说明:初始化
(2)Connect()
说明:连接nats server
(3)Publish()
说明:发布接口
(4)Subscribe()
说明:订阅接口
4、nats server源码
5、nats安装及实例