NATS—消息通信模型
消息通信模型
NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去;订阅者接收到消息,进行解码,再处理。订阅者处理NATS消息可以是同步的或异步的。
* 异步处理
异步处理使用回调消息句柄处理消息,当有消息到来时,已注册的回调句柄接收并控制处理消息。整个过程客户端不会被阻塞,可以同步执行其它任务。异步处理可以采用多线程调度的设计。
* 同步处理
同步处理需要应用程序显示调用方法来处理到来的消息。这种显示调用是阻塞式的调用,会暂停任务直到消息可用。如果没有可用的消息,消息处理阻塞的周期由客户端设置。同步处理通常用于服务器等待并处理传入的请求消息,并发送响应给客户端。
NATS支持以下三种消息通信模型:
1. 发布/订阅模型
NATS的发布/订阅通信模型是一对多的消息通信。发布者在一个主题上发送消息,任何注册(订阅)了此主题的客户端都可以接收到该主题的消息。订阅者可以使用主题通配符订阅感兴趣的主题。
对于订阅者,可以选择异步处理或同步处理接收到的消息。如果异步处理消息,消息交付给订阅者的消息句柄。如果客户端没有句柄,那么该消息通信是同步的,那么客户端可能会被阻塞,直到它处理了当前消息。
服务质量(QoS)
至多发送一次 (TCP reliability):如果客户端没有注册某个主题(或者客户端不在线),那么该主题发布消息时,客户端不会收到该消息。NATS系统是一种“发送后不管”的消息通信系统,故如果需要高级服务,可以选择"NATS Streaming" 或 在客户端开发相应的功能
至少发送一次(NATS Streaming) :一些使用场景需要更高级更严格的发送保证,这些应用依赖底层传送消息,不论网络是否中断或订阅者是否在线,都要确保订阅者可以收到消息
2. 请求/响应模型
NATS支持两种请求-响应消息通信:P2P(点对点)和O2M(一对多)。P2P最快、响应也最先。而对于O2M,需要设置请求者可以接收到的响应数量界限(默认只能收到一条来自订阅者的响应——随机)
在请求-响应模式,发布请求操作会发布一个带预期响应的消息到Reply主题。
请求创建了一个收件箱,并在收件箱执行调用,并进行响应和返回
多个订阅者(reply 例子)订阅了同一个 主题,请求者向该主题发送一个请求,默认只收到一个订阅者的响应(随机)
事实上,NATS协议中并没有定义 “请求” 或 "响应"方法,它是通过 SUB/PUB变相实现的:请求者先 通过SUB创建一个收件箱,然后发送一个带 reply-to 的PUB,响应者收到PUB消息后,向 reply-to 发送 响应消息,从而实现 请求/响应。reply-to和收件箱都是一个 subject,前者是后者的子集(O2M的情况)
3. 队列模型
NATS支持P2P消息通信的队列。要创建一个消息队列,订阅者需注册一个队列名。所有的订阅者用同一个队列名,形成一个队列组。当消息发送到主题后,队列组会自动选择一个成员接收消息。尽管队列组有多个订阅者,但每条消息只能被组中的一个订阅者接收。
队列的订阅者可以是异步的,这意味着消息句柄以回调方式处理交付的消息。同步队列订阅者必须建立处理消息的逻辑
NATS支持P2P消息通信的队列。要创建一个消息队列,订阅者需注册一个队列名。所有的订阅者用同一个队列名,形成一个队列组。当消息发送到主题后,队列组会自动选择一个成员接收消息。尽管队列组有多个订阅者,但每条消息只能被组中的一个订阅者接收。
队列的订阅者可以是异步的,这意味着消息句柄以回调方式处理交付的消息。异步队列订阅者必须建立处理消息的逻辑。
队列模型一般常用于数据队列使用,例如:从网页上采集的数据经过处理直接写入到该队列,接收端一方可以起多个线程同时读取其中的一个队列,其中某些数据被一个线程消费了,其他线程就看不到了,这种方式为了解决采集量巨大的情况下,后端服务可以动态调整并发数来消费这些数据。说白了就一点,上游生产数据太快,下游消费可能处理不过来,中间进行缓冲,下游就可以根据实际情况进行动态调整达到动态平衡。
NATS特性
NATS提供了以下独特的功能:
1)纯发布/订阅
永远不假定有接收者
总是在线
2)集群模式的服务器
NATS服务器可以集群;
发布式的队列可以跨域集群;
集群感知的客户端
3)订阅者的自动修剪
要支持可伸缩性,NATS提供了客户端连接的自动修剪功能;
如果某个客户端APP处理消息很慢,NATS会自动关闭此客户端的连接;
如果某个客户端在ping-pong时间间隔内未做响应,服务器会自动关闭此连接;
客户端实现重连逻辑
4)基于文本的协议
开发上手比较容易;
不影响服务器的性能;
可以直接用Telnet连接服务器
5)多种 QoS
至多发送一次(TCP level reliability)---NATS立即向符合条件的订阅者发送消息,并不存留消息
https://www.zhihu.com/question/49596182
至少发送一次(via NATS Streaming)--- 如果匹配的订阅者一时不在线,Message 将被存储直到它被传送给订阅者,并得到订阅者确认。除非 该消息超时或存储空间耗尽
6)持久性订阅(via NATS Streaming)
服务端维护 持久性订阅者的 订阅推送状态,这样,持久性订阅者就可以知道它们在上一次会话中是在哪儿断开的
7)Event 流服务(via NATS Streaming)
根据时间戳、序列号或相对位差,消息被持久化存储在 内存、文件或其它二级存储设备中
8)缓存 最新一个或第一个值 (via NATS Streaming)
订阅者连接上服务器以后,先向订阅者推送最近一次的publish消息
转自:http://www.cnblogs.com/liang1101/p/6641290.html
NATS—消息通信模型的更多相关文章
- NATS_02:NATS消息通信模型
消息通信模型 NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去:订阅者接收到消息,进行解码,再处理.订阅者处理NATS消息可以是同步的或异步的. * 异步处理 异步处 ...
- JMS中的消息通信模型
1. MQ简介: 消息队列(Message Queue,简称MQ),是应用程序与应用程序之间的一种通信方法.应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信,而无需专用连接来链接它们 ...
- 一种开源的分布式消息系统Nats
一种开源的分布式消息系统Nats 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 1.NATS介绍 NATS是一个开源的 ...
- NATS—基础介绍
1. 介绍 NATS(Message bus): 从CloudFoundry的总架构图看,位于各模块中心位置的是一个叫nats的组件.NATS是由CloudFoundry的架构师Derek开发的一个开 ...
- NATS_01:NATS基础介绍
1.介绍 NATS(Message bus): 从CloudFoundry的总架构图看,位于各模块中心位置的是一个叫nats的组件.NATS是由CloudFoundry的架构师Derek开发的一个开源 ...
- benthos stream nats 集成试用
测试demo 来自官方例子 使用docker-compose 进行运行 nats docker-compose file version: '3.3' services: nats: image: n ...
- NATS_08:NATS客户端Go语言手动编写
NATS客户端 一个NATS客户端是基于NATS服务端来说既可以是一个生产数据的也可以是消费数据的.生产数据的叫生产者英文为 publishers,消费数据的叫消费者英文为 subscriber ...
- ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型
1. 面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无关的数据交流 ...
- [golang] nats的消息传递模型介绍
目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...
随机推荐
- 2019.03.24 Ajax
也还是会用到jquery中的Ajax请i求 所以第一还是引入jQuery包 可以去网上搜腾讯网静态资源库 然后引入包 Ajax还是异步处理 处理堵塞问题 import time 就可以了 ...
- 实践 : Ubuntu 上 Testlink 部署
1.安装apache sudo apt-get install apache2 2. sudo /etc/init.d/apache2 restart 测试: Http:\localhost or I ...
- (转载)spring单例和多例详解。如何在单例中调用多例对象
spring生成对象默认是单例的.通过scope属性可以更改为多例. <bean id="user" class="modle.User" scope=& ...
- smali参数引用说明
比如非静态函数test(IJZ)V; p0表示this p1 I p2 J 以此类推
- C#使用HttpWebRequest与HttpWebResponse模拟用户登录
模拟艺龙旅游网登录 想模拟登录,首先整理一下流程 1.通过360浏览器(IE,火狐等等)F12开发人员工具抓到相关数据 2.获取验证码(拿到cookie),登录时也需要使用 3.登录 -------- ...
- equals和==的区别小结
==: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1.比较的是操作符两端的操作数是否是同一个对象 ...
- 有关g++的Xlinker选项
事情的起因是,在使用Eclipse配置opencv的库时,发现使用-Wl 选项需要自己在Linker flags的输入框里指定.并不是像使用-l选项或-I选项那样可以直接添加选项的条目就可以了.但是在 ...
- Redis Cluster(集群)的搭建
一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...
- Linux 运维测试及第三应用及测试工具
一 .第三方应用及测试工具链接地址 https://pan.baidu.com/s/1rLQ5NCZvxcy93YQ4fGFaBQ 1.linux LSI系列raid卡监测工具 1)使用参数详解链接: ...
- uva 10369 Arctic Network
题意: 有许多基地,每个基地都有两种收发信号的方式,一种是通过无线电收发机,另一种是通过卫星.两个基地之间可以通过卫星交流不管它们相距多远:但是通过无线电交流,就要求它们的距离不超过D.为了方便布置, ...