nats学习

初探Nats中间件

一,nats是什么

nats是一个go语言开发的开源的、轻量、高性能的原生消息系统。nats消息由主题处理,不依赖于网络位置。它提供了应用程序或服务与底层物理网络之间的抽象层。数据被编码并作为消息,由发布者发送。消息由一个或多个订阅者接收、解码和处理。

NATS使程序可以很容易地跨不同的环境、语言、云提供商和内部系统进行通信。客户机通常通过单个URL连接到NATS系统,然后向主题订阅或发布消息。通过这种简单的设计,NATS允许程序共享通用的消息处理代码,隔离资源和相互依赖。

二,nats是怎么工作的

NATS核心提供最多一次的服务质量。如果订户没有收听主题(没有主题匹配),或者在发送消息时未激活,则不会收到消息。这与TCP / IP提供的保证级别相同。默认情况下,NATS是一种即发即弃的消息传递系统。如果您需要更高级别的服务,您可以使用NATS Streaming或通过经过验证的可扩展参考设计为客户端应用程序构建额外的可靠性。

NATS在应用与底层网络之间提供了一个抽象层。应用数据被包装为消息(message)并由发布者发送。消息被一个或多个订阅者接收,解码并且处理。订阅者可以异步或同步地处理消息。

异步消息处理使用一个消息回调处理器来处理消息,当消息到达的时候,已经注册的回调处理器来处理该消息。客户端或消费者程序不会从其他事件中阻塞在等待消息的时候。异步消息处理可以让程序员创建多线程的分发设计。

同步消息处理需要应用程序代码显示地调用函数来处理到达的消息。通常显示的函数调用是一个阻塞的调用,它会等待一知道消息可用。如果没有可用的消息,客户端在调用消息的时候就会一直处于阻塞状态。同步消息处理通常是由一个服务器端充当,它的职责就是等待并处理到达的消息,并且给发送消息的一方发送回复内容。

三,nats工作模式

发布-订阅

发布者(crm)发送条消息到nats-server,每条消息都会有一个subject,而nats-server交付消息给所有注册了此主题的订阅者(ybind,fpga-agent等)。可选的是,你还可以发送带reply subject的消息到nats-server,这种方式为订阅者提供了接收消息并返回一条消息给发布者的方法。 这种模式的拓展也就是下面提到的请求响应模式。发布-订阅模式模型如下所示。


请求-回复

Request-Reply是现代分布式系统中的常见模式。发布者(crm)发送一个请求,应用程序(ybind,fpga-agent)要么在响应时等待一定的超时,要么异步接收响应。Request()是一个简单方便的API,它提供了一个伪同步的方式,使用了超时timeout设置。它创建了一个收件箱(收件箱是一种subject类型,对请求者唯一),订阅subject,然后发布你的请求消息(消息带reply地址)设置为收件箱的subject,然后等待响应,或者超时取消。请求-回复模型如下所示


队列订阅

NATS支持P2P消息通信的队列。要创建一个消息队列,订阅者需注册一个队列名。所有的订阅者用同一个队列名,形成一个队列组。当消息发送到主题后,队列组会自动选择一个成员接收消息。尽管队列组有多个订阅者,但每条消息只能被组中的一个订阅者接收。队列模式模型如下所示


四,nats优点

使用简单,配置简单。

速度极快,性能良好。

多语言支持,不依赖于网络位置,client端只需知道nats的节点和约定好的subject名称即可。

五,nats缺点

对服务器稳定性要求较高,机房出现故障,导致nats server端需要重连。可能需要重启nats-server。

在消息timeout后,需要在reconnection里要重新初始化连接,不方便。

六,nats在当前项目中使用

无论是发布订阅模式还是队列模式,nats都不能保证消息一定发送到订阅方,除非订阅者发送一个响应给发布者。所以订阅者必须发送一个回执给发布者,目前项目中可用最合适的应该就是请求响应模式。这要求订阅者一定要先完成订阅,发布消息后,订阅者才能收到消息,类似离线消息的模式nats不支持。就算先完成订阅,后发送消息,消息发送方也不知道是否有订阅者收到了消息,请求响应模式就是应对这种情况。

实现原理:

(1)配置中间件启用request模式发送消息(消息中包含了回执信息,reply主题),同步等待回执(有超时时间)。

(2)各个组件收到消息,在消息中取出回执信息=replay主题,对replay主题,主动发送普通消息(消息内容可自定义,比如crm nats-server 上的service1收到msgid=xxxx的消息。)。

(3)配置中间件在超时内收到消息,确认结束或crm在超时内未收到消息,超时结束。

两种模式:

one to one 默认模式:1条消息,N个订阅者,消息发送方,仅会收到一条回执记录(因为消息发送方收到回执消息后,就自动断开了对回执消息的订阅。),即使N个订阅都都收到了消息。注意:pub/sub和queue模式的不同

one to many 非默认模式:需要自己实现1条消息,N个订阅者,消息发送方,可以自己设定一个数量限制N,接受到N个回执消息后,断开对回执消息的订阅。

七,测试

Nats-server

所在设备 192.168.66.151

运行截图


订阅者

测试代码sub.go,所在设备192.168.5.41


发布者

测试代码pub.py  所在设备 192.168.5.40


测试结果


你可能感兴趣的:(nats学习)