NAST概述
一、NATS介绍
NATS是由CloudFoundry的架构师Derek开发的一个开源的、轻量级、高性能的,支持发布、订阅机制的分布式消息队列系统。它的核心基于EventMachine开发,代码量不多,可以下载下来慢慢研究。
不同于Java社区的kafka,nats偏于redis式的消息中间件,不不像Kafka式的可以持久化。
NATS原来是使用Ruby编写,可以实现每秒150k消息,后来使用Go语言重写,能够达到每秒8-11百万个消息,整个程序很小只有3M Docker image,它不支持持久化消息,如果你离线,你就不能获得消息。
NATS适合云基础设施的消息通信系统、IoT设备消息通信和微服务架构。
目前已经采用了NATS系统的公司有:爱立信、HTC、百度、西门子、VMware。
NATS 有 3 个产品
- core-nats: 不做持久化的及时信息传输系统
- nats-streaming: 基于 nats 的持久化消息队列(已弃用)
- nats-jetstream: 基于 nats 的持久化消息队列
二、NATS服务器与客户端
NATS服务器与客户端
NATS服务器:用Golang语言开发,发行版包括二进制发布包和Docker镜像。
NATS客户端:包含了多种语言的客户端。
官方提供的客户端
Go client: https://github.com/nats-io/go-nats
Node.js client: https://github.com/nats-io/node-nats
Ruby client: https://github.com/nats-io/ruby-nats
Java client: https://github.com/nats-io/jnats
C client: https://github.com/nats-io/cnats
C# client: https://github.com/nats-io/csnats
Nginx C client:https://github.com/nats-io/nginx-nats
还有社区提供的客户端:
Spring: https://github.com/cloudfoundry-community/java-nats
Lua: https://github.com/DawnAngel/lua-nats
PHP: https://github.com/repejota/phpnats
Python:https://github.com/mcuadros/pynats
Scala: https://github.com/tyagihas/scala_nats/
Haskell:https://github.com/ondrap/nats-queue
查看客户端API技巧
对于Golang客户端API文档,需要这样:
1)用 Go 下载 go版本客户端源码及使用文档
go git https://github.com/nats-io/go-nats.git
2)使用 Go 文档查看器来查看线上文档
godoc -http :8080
3)通过浏览器访问 API 文档
http://localhost:8080/pkg/github.com/nats-io/gnatsd/
三、NATS的设计目标
3.1 NATS的设计原则
NATS的设计原则是:高性能、可伸缩能力、易于使用,基于这些原则,NATS的设计目标包括:
1)高性能(fast)
2)一直可用(dial tone)
3)极度轻量级(small footprint)
4)最多交付一次(fire and forget,消息发送后不管)
5)支持多种消息通信模型和用例场景(flexible)
3.2 NATS理想的使用场景
NATS理想的使用场景有:
1)寻址、发现
2)命令和控制(控制面板)
3)负载均衡
4)多路可伸缩能力
5)定位透明
6)容错
3.3 NATS设计哲学
NATS设计哲学认为,高质量的QoS应该在客户端构建,故只建立了请求-应答,不提供:
1)持久化
2)事务处理
3)增强的交付模式
4)企业级队列
四、基于主题的消息传递
从根本上说,NATS 是关于发布和侦听消息的。这两者都在很大程度上依赖于主题。
**什么是主题?**简单来说,主题只是一串字符,它们构成了发布者和订阅者可以用来查找彼此的名称。它有助于将消息范围限定为流或主题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhsRYivK-1678191670802)(null)]
4.1 使用者名称允许使用的字符
为了跨客户端兼容,我们建议使用 ASCII 字符(将来可能会更改)。
推荐字符:a
到 z
,A
到 Z
和0
到9
(名称区分大小写,不能包含空格)。特殊字符:句点。
(用于分隔主题中的标记)和 * 和 >
(*
和>
用作通配符)。保留的使用者名称:按照惯例,以a`$`开头的使用者名称保留供系统使用(例如,以$SYS
或$JS
或$KV
等开头的使用者名称)
4.2 主题层次结构
.
字符用于创建主题层次结构。例如,世界时钟应用程序可能会定义以下内容以对相关主题进行逻辑分组:
time.us
time.us.east
time.us.east.atlanta
time.eu.east
time.eu.warsaw
4.2.1 匹配单个子主题
第一个通配符是*
,它将匹配单个标记。例如,如果应用程序想要侦听东部时区,他们可以订阅 time.*.east,这将匹配time.us.east
和time.eu.east
。``
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DG3euyWI-1678191670677)(null)]
4.2.2 匹配一个子主题或该子主题下的迭代子主题
第二个通配符是>
它将匹配一个或多个标记,并且只能出现在主题的末尾。例如,time.us.>
将匹配time.us.east
和 time.us.east.atlanta,而 time.us.* 将只匹配 time.us.east
,因为它不能匹配多个。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfhrPWEQ-1678191672332)(null)]
4.2.3 监控和窃听
根据您的安全配置,通配符可以通过创建有时称为窃听的内容来用于监视。在最简单的情况下,您可以为>创建订阅者``。此应用程序将接收在 NATS 群集上发送的所有消息(同样,受安全设置的约束)。
4.2.4 混合通配符
通配符*
可以在同一主题中多次出现。这两种类型也可以使用。例如,*.*.east.>
将接收time.us.east.atlanta
。
4.3 主题大小
建议将主题中的最大bit数量保持在最多 16 个bit的合理值。
4.4 发布-订阅
NATS 为一对多通信实现了发布-订阅消息分发模型。发布者发送有关主题的消息,侦听该主题的任何活动订阅者都会收到该消息。订阅者还可以注册对通配符主题的兴趣,NATS 是一个发布订阅消息传递系统基于主题.侦听某个主题的订阅者会收到有关该主题发布的消息。如果订阅者未主动侦听主题,则不会收到消息。订阅者可以使用通配符标记(如 *
and>
)来匹配单个标记或匹配主题的尾部。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiqJ55vW-1678191670642)(null)]
4.5 消息
消息由以下部分组成:
- 一个主题。
- 字节数组形式的有效负载。
- 任意数量的header fields字段。
- 可选的’reply’地址字段。
消息具有最大大小(在服务器配置中使用max_payload
设置)。默认情况下,大小设置为 1 MB,但如果需要,可以增加到 64 MB(但我们建议将最大邮件大小保持在更合理的值,如 8 MB)。
4.6 请求-回复
请求-回复是现代分布式系统中的常见模式。发送请求,应用程序要么等待具有特定超时的响应,要么异步接收响应。
一般来说,消息系统是以异步的形式工作,也就是说,publisher 往 subject 上发布一条消息后,并不在意 subscriber 的 reply 是什么。如果 publisher 在意 subscriber 的 reply 是什么的话,那么消息系统就应该以同步的形式工作,在具体实现中,是通过两次发布订阅来完成的:当 publisher 发布消息后,它会订阅一个特定的 subject,当 subscriber 处理完消息后,它会把 reply 发布到这个特定的 subject。当然,整个过程对使用者是透明的。
NATS 使用其核心通信机制(发布和订阅)支持请求-回复模式。使用回复主题在给定主题上发布请求。响应者侦听该主题并将响应发送到回复主题。回复主题称为“收件箱”。这些是动态定向回请求者的唯一主题,无论任何一方位于何处。
4.6.1 NATS 使请求-回复变得简单而强大
-
多个 NATS 响应程序可以形成动态队列组。因此,无需在组内手动添加或删除订阅者,即可启动或停止分发消息。它是自动完成的。这允许响应者根据需求扩大或缩小规模。
-
NATS 应用程序“在退出之前耗尽”(在关闭连接之前处理缓冲的消息)。这允许应用程序在不丢弃请求的情况下缩减。
-
由于 NATS 基于发布-订阅,因此可观测性就像运行另一个应用程序一样简单,该应用程序可以查看请求和响应以测量延迟、监视异常、直接可伸缩性等。
-
NATS的强大功能甚至允许多个响应,其中第一个响应被利用,系统有效地丢弃额外的响应。这允许复杂的模式具有多个响应器,减少响应延迟和抖动。
无响应者
当请求发送到没有订阅者的主题时,可以方便地立即了解它。对于此用例,NATS 客户端可以选择加入no_responder消息.这需要支持标头的服务器和客户端。启用后,发送到没有订阅者的主题的请求将立即收到没有正文和
503
状态的回复。大多数客户端将通过引发或返回错误来表示这种情况。例如:
m, err := nc.Request("foo", nil, time.Second); # err == nats.ErrNoResponders
4.7 NATS在微服务中的应用
可以发现 request reply 模式已经有了 RPC 的味道。正是因为 NATS 具备了 RPC 的能力,所以在微服务中采用 NATS 后,系统会更清晰。
- 传统微服务架构
- 采用 NATS 的微服务架构
五、组队列
当订阅者注册自己以接收来自发布者的消息时,消息传递的 1:N 扇出模式可确保发布者发送的任何消息都能到达已注册的所有订阅者。NATS 提供了一个名为“队列”的附加功能,该功能允许订阅者将自己注册为队列的一部分。作为队列一部分的订阅者形成“队列组”。
队列组的工作原理
例如,考虑基于主题名称以 1:N 模式向所有订户传递邮件(甚至对不属于队列组的订户也会发生传递)。如果订阅者基于队列名称注册,它将始终根据主题名称接收其订阅的消息。但是,如果将更多订户添加到同一队列名称,则它们将成为队列组,并且每次队列组收到消息时,只有一个随机选择的队列组订户将使用一条消息。此类分布式队列是 NATS 提供的内置负载平衡功能。
优势
-
确保应用程序容错
-
工作负载处理可以纵向扩展或缩减
-
无需额外配置
队列组由应用程序及其队列订户定义,而不是由服务器配置定义
队列组名称遵循与科目最重要的是,它们区分大小写,不能包含空格。请考虑使用句点分层构建队列组。
.某些服务器功能可以使用通配符匹配在他们身上。
队列订阅者是扩展服务的理想选择(订阅者队列是一个集群构成的消费者,集群分担消费消息,集群可随时拓展和缩减)。纵向扩展就像运行另一个应用程序一样简单,缩减是终止应用程序,并发出耗尽正在进行的请求的信号。这种灵活性和无需任何配置更改使 NATS 成为一种出色的服务通信技术,可以与所有平台技术配合使用。
无响应者
当向服务(请求/回复)发出请求并且 NATS 服务器知道没有可用的服务(因为队列组中当前没有订阅主题的客户端应用程序)时,服务器将向请求客户端发送“无响应者”协议消息,该消息将中断阻止 API 调用。这允许应用程序立即做出反应。这进一步支持大规模构建响应速度快的系统,即使面对应用程序故障和网络分区也是如此。
作为队列流式传输
跟捷流]还可以通过将保留策略设置为工作队列策略
并利用流作为队列拉动
消费者]轻松实现处理的水平可扩展性(或使用带有订阅者队列组的显式 ACK 推送使用者)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7t1PYeSm-1678191672299)(null)]
排队地理关联性
连接到全局分布式 NATS 超级群集时,由于如果群集上没有可用于本地处理请求的侦听器,则服务请求消息只会路由到另一个群集(即另一个区域),因此会自动存在服务异地相关性。
相关文章:
NAST概述
一、NATS介绍 NATS是由CloudFoundry的架构师Derek开发的一个开源的、轻量级、高性能的,支持发布、订阅机制的分布式消息队列系统。它的核心基于EventMachine开发,代码量不多,可以下载下来慢慢研究。 不同于Java社区的kafka,nats…...
【JS知识点】——原型和原型链
文章目录原型和原型链构造函数原型显式原型(prototype)隐式原型(\_\_proto\_\_)原型链总结原型和原型链 在js中,原型和原型链是一个非常重要的知识点,只有理解原型和原型链,才能深刻理解JS。在…...
c盘怎么清理到最干净?有什么好的清理方法
c盘怎么清理到最干净?有什么好的清理方法?清理C盘空间是电脑维护的重要步骤之一。C盘是Windows操作系统的核心部分,保存了许多重要的系统文件,因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法 一.清理临时文件 在使用…...
day26_HTML
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、二阶段介绍 二、HTML 零、 复习昨日 见代码 一、二阶段介绍 第一阶段: 基础入门 java基本语法编程基础(方法,数组)面向对象编程常用类高级(IO,线程,新…...
深度剖析C语言预处理
致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.程序翻译过程: 2.字符串宏常量 3.用宏定义充当注释符号 4…...
【WPF 值转换器】ValueConverter 进阶用法
【WPF 值转换器】ValueConverter 进阶用法介绍基类实现子类实现效果介绍 值转换器在WPF开发中是非常常见的,当然不仅仅是在WPF开发中。值转换器可以帮助我们很轻松地实现,界面数据展示的问题,如:模块隐藏显示、编码数据展示为可读…...
Vue2的基本使用
一、vue的基本使用 第一步 引入vue.js文件 <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script> 或者<script src"./js/vue.js"></script> 第二步 在body中设置一个挂载点 {{msg}} <div id"app…...
【云原生kubernetes】k8s数据存储之Volume使用详解
目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 4.2 EmptyDir 实现文件共享 4.2.1 关于busybox 4.3 操作步骤 4.3.1 创建配置模板文件yaml 4.3.2 创建Pod 4.3.3 访问nginx使其产生访问日志 4.3.4 …...
SerDes---CDR技术
1、为什么需要CDR 时钟数据恢复主要完成两个工作,一个是时钟恢复,一个是数据重定时,也就是数据的恢复。时钟恢复主要是从接收到的 NRZ(非归零码)码中将嵌入在数据中的时钟信息提取出来。 2、CDR种类 PLL-Based CDROve…...
如何实现在on ethernetPacket中自动回复NDP response消息
对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…...
CSS清楚浮动
先看看关于浮动的一些性质 浮动使元素脱离文档流 浮动元素可以设置宽高,在CSS中,任何元素都可以浮动,浮动元素会生成一个块级框,而不论其本身是何种元素。 如果没有给浮动元素指定高度,,那么它会以内容的…...
HTTPS详解(原理、中间人攻击、CA流程)
摘要我们访问浏览器也经常可以看到https开头的网址,那么什么是https,什么是ca证书,认证流程怎样?这里一一介绍。原理https就是httpssl,即用http协议传输数据,数据用ssl/tls协议加密解密。具体流程如下图&am…...
EventLoop机制
JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题。 同步任…...
倒立摆建模
前言 系统由一辆具有动力的小车和安装在小车上的倒立摆组成,系统是不稳定,我们需要通过控制移动小车使得倒立摆保持平衡。 具体地,考虑二维情形如下图,控制力为水平力FFF,输出为角度θ\thetaθ以及小车的位置xxx。 力…...
SpringSecurity支持WebAuthn认证
WebAuthn是无密码身份验证技术,解决了密码泄露的风险,主流的浏览器都支持。有很多开源的类库实现了WebAuthn规范,Java下流行的类库有:webauthn4jjava-webauthn-serververtx-authSpring Security官方暂时未支持WebAuthn,…...
深度学习技巧应用3-神经网络中的超参数搜索
大家好,我是微学AI,今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中,一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数,例如:学习率、正则…...
【信号量机制及应用】
水善利万物而不争,处众人之所恶,故几于道💦 目录 一、信号量机制 二、信号量的应用 >利用信号量实现进程互斥 >利用信号量实现前驱关系 >利用记录型信号量实现同步 三、例题 四、参考 一、信号量机制 信号量是操作系统提…...
围棋高手郭广昌的“假眼”棋局
(图片来源于网络,侵删)文丨熔财经作者|易不二2022年,在复星深陷债务压顶和变卖资产漩涡的而立之年,“消失”已久的郭广昌,在质疑与非议声中回国稳定军心,强调复星将在未来的五到十年迎来一个全新…...
学成教育-统一异常处理实现
一、统一异常处理实现 统一在base基础工程实现统一异常处理,各模块依赖了base基础工程都 可以使用。 首先在base基础工程添加需要依赖的包: <dependency><groupId>org.springframework</groupId><artifactId>spring-web</…...
JNI内通过参数形式从C/C++中传递string类型数据至Java层
目录 0 前言 1 string类型参数形式传值 2 测试和结果 0 前言 类似之前我写过的两篇文章:一篇介绍了在JNI中基础类型int的传值方式;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C中传递一维、二维、三维数组数据至Java层详细…...
自动化测试——执行javaScript脚本
文章目录一、点击元素(对应的click())二、input标签对应的值(对应的send_keys())修改时间控件的属性值:三、元素的文本属性四、js脚本滚动操作一、点击元素(对应的click()) 使用场景:当使用显性等待不能解决问题时 代码中实现点击…...
常用十种算法滤波
十种算法滤波1. 限幅滤波法(又称程序判断滤波法)2. 中位值滤波法3. 算术平均滤波法4. 递推平均滤波法(又称滑动平均滤波法)5. 中位值平均滤波法(又称防脉冲干扰平均滤波法)6. 限幅平均滤波法7. 一阶滞后滤波…...
IO多路复用
一、概述 IO多路复用:进程同时检查多个文件描述符,以找出他们中的任何一个是否可执行IO操作。 核心:同时检查多个文件描述符,看他们是否准备好了执行IO操作。文件描述符就绪状态的转化是通过一些IO事件来触发。 二、水平触发和…...
Python中的错误是什么,Python中有哪些错误
7.1 错误(errors) 由于Python代码通常是人类编写的,那么无论代码是在解释之前还是运行之后,或多或少总会出现一些问题。 在Python代码解释时遇到的问题称为错误,通常是语法和缩进问题导致的,这些错误会导致代码无法通过解释器的解…...
记录自己开发一款小程序中所遇到的问题(uniapp+uview)(持续更新)
每次开发小程序中,都会遇到各种各样的问题。但是有的问题已经遇到过了,但是遇到的时候还是要各种的问度娘。 特此出这篇文章,方便自己也是方便大家。 仅供参考 1. u-collapse的样式在h5中正常,但是运行到微信小程序中样式就乱了…...
华为机试 HJ43 迷宫问题
经典迷宫问题dfs 题目链接 描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走…...
数据结构|链表
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的形式就像一条铁链环环相扣它与顺序表最大的不同是,单链表的数据存储是在不连续的空间,存储的数据里面含有…...
计算机写论文时,怎么引用文献? - 易智编译EaseEditing
首先需要清楚哪些引用必须注明[1]: 任何直接引用都要用引号并注明来源; 任何不是自己的口头或书面的观点、解释和结论都应注明来源; 即使不用原话,但是他人的思路、概念或观点也应注明; 不要为了适合你的观点修改原…...
实验三:贪心
1.减肥的小k1 题目描述 小K没事干,他要搬砖头,为了达到较好的减肥效果,教练规定的方式很特别: 每一次,小K可以把两堆砖头合并到一起,消耗的体力等于两堆砖头的重量之和。 经过 n-1次合并后, …...
MySQL日志文件
文章目录1.MySQL中的日志文件2.bin log的作用3.redo log的作用4.bin log和redo log的区别(1)存储的内容(2)功能(3)写入时间(4)写入方式5.两阶段提交6.undo log的作用1.MySQL中的日志…...
wordpress文章关联/网盘搜索神器
4个类就可体验HADOOP-RPC的简单、实用。 一,writable-rpc 一,协议 所谓协议,实际是一个接口,用来定义该RPC提供的功能 package rpc.writeable;public interface MyProtocol {void mkdir(String path);String getName(String na…...
怎么在虚拟空间做两个网站/企业网站有哪些功能
传送门 解题思路 首先给出的树形态没用,因为除根结点外每个点只有一个父亲,它只需要保证和父亲颜色不同即可。设\(f(k)\)表示至多染了\(k\)种颜色的方案,那么\(f(k)(k-1)^{(n-1)}*k\),而我们要求的是恰好染\(k\)种颜色的方案数&am…...
做动态网站 需要哪些知识/百度榜
①提交之前先更新,负责而谨慎地提交自己的代码 1.SVN更新的原则是要及时更新,及时提交。当完成了一个小功能,能够通过编译并且并且自己测试之后,尽量早的提交,这样也保存了历史版本,必要时候可以回滚&am…...
什么网站做微信公众账号/网络营销课程个人总结3000字
原因:音频编码原来为AMR,ios那边貌似不支持这种音频编码 VideoAbsActivity.java 加了 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 将音频录制格式从默认…...
襄阳网站seo厂家/神秘网站
1安装vmtools for linux: 启动VM中的linux, 选择vmware workstation程序菜单中VM > install VMware tools... 执行: mkdir /mnt/cdrom mount -o ro /dev/cdrom /mnt/cdrom (vmtools的安装文件放在vmware虚拟的cdrom中,首先要mo…...
wordpress前端用什么/浏阳廖主任打人
为什么80%的码农都做不了架构师?>>> 我们开发就是喜欢各种酷炫的东西,对于有洁癖的我,连命令行都不放过了 先上图看效果,命令行显示高亮部分 实现过程: 第一步:.bash_prompt脚本 # ~/.bash_p…...