当前位置: 首页 > news >正文

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 字符(将来可能会更改)。

推荐字符:azAZ09(名称区分大小写,不能包含空格)。特殊字符:句点(用于分隔主题中的标记)和 * 和 >*>用作通配符)。保留的使用者名称:按照惯例,以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.easttime.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。当然,整个过程对使用者是透明的。

b9e2dbfb30ade0f551b84d529cbbc5f4.png

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 后,系统会更清晰。

  • 传统微服务架构

f0b5478b2e86755a0b1d6e87a15dbb6a.png

  • 采用 NATS 的微服务架构

c51cde5ab26a4211a814a4c9403602ba.png

五、组队列

当订阅者注册自己以接收来自发布者的消息时,消息传递的 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 时钟数据恢复主要完成两个工作&#xff0c;一个是时钟恢复&#xff0c;一个是数据重定时&#xff0c;也就是数据的恢复。时钟恢复主要是从接收到的 NRZ&#xff08;非归零码&#xff09;码中将嵌入在数据中的时钟信息提取出来。 2、CDR种类 PLL-Based CDROve…...

如何实现在on ethernetPacket中自动回复NDP response消息

对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…...

CSS清楚浮动

先看看关于浮动的一些性质 浮动使元素脱离文档流 浮动元素可以设置宽高&#xff0c;在CSS中&#xff0c;任何元素都可以浮动&#xff0c;浮动元素会生成一个块级框&#xff0c;而不论其本身是何种元素。 如果没有给浮动元素指定高度&#xff0c;&#xff0c;那么它会以内容的…...

HTTPS详解(原理、中间人攻击、CA流程)

摘要我们访问浏览器也经常可以看到https开头的网址&#xff0c;那么什么是https&#xff0c;什么是ca证书&#xff0c;认证流程怎样&#xff1f;这里一一介绍。原理https就是httpssl&#xff0c;即用http协议传输数据&#xff0c;数据用ssl/tls协议加密解密。具体流程如下图&am…...

EventLoop机制

JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说&#xff0c;同一时间只能做一件事情。 单线程执行任务队列的问题&#xff1a; 如果前一个任务非常耗时&#xff0c;则后续的任务就不得不一直等待&#xff0c;从而导致程序假死的问题。 同步任…...

倒立摆建模

前言 系统由一辆具有动力的小车和安装在小车上的倒立摆组成&#xff0c;系统是不稳定&#xff0c;我们需要通过控制移动小车使得倒立摆保持平衡。 具体地&#xff0c;考虑二维情形如下图&#xff0c;控制力为水平力FFF&#xff0c;输出为角度θ\thetaθ以及小车的位置xxx。 力…...

SpringSecurity支持WebAuthn认证

WebAuthn是无密码身份验证技术&#xff0c;解决了密码泄露的风险&#xff0c;主流的浏览器都支持。有很多开源的类库实现了WebAuthn规范&#xff0c;Java下流行的类库有&#xff1a;webauthn4jjava-webauthn-serververtx-authSpring Security官方暂时未支持WebAuthn&#xff0c…...

深度学习技巧应用3-神经网络中的超参数搜索

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中&#xff0c;一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数&#xff0c;例如&#xff1a;学习率、正则…...

【信号量机制及应用】

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、信号量机制 二、信号量的应用 >利用信号量实现进程互斥   >利用信号量实现前驱关系   >利用记录型信号量实现同步 三、例题 四、参考 一、信号量机制 信号量是操作系统提…...

围棋高手郭广昌的“假眼”棋局

&#xff08;图片来源于网络&#xff0c;侵删&#xff09;文丨熔财经作者|易不二2022年&#xff0c;在复星深陷债务压顶和变卖资产漩涡的而立之年&#xff0c;“消失”已久的郭广昌&#xff0c;在质疑与非议声中回国稳定军心&#xff0c;强调复星将在未来的五到十年迎来一个全新…...

学成教育-统一异常处理实现

一、统一异常处理实现 统一在base基础工程实现统一异常处理&#xff0c;各模块依赖了base基础工程都 可以使用。 首先在base基础工程添加需要依赖的包&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-web</…...

JNI内通过参数形式从C/C++中传递string类型数据至Java层

目录 0 前言 1 string类型参数形式传值 2 测试和结果 0 前言 类似之前我写过的两篇文章&#xff1a;一篇介绍了在JNI中基础类型int的传值方式&#xff1b;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C中传递一维、二维、三维数组数据至Java层详细…...

OpenClaw定时任务实践:GLM-4.7-Flash实现24/7自动化监控

OpenClaw定时任务实践&#xff1a;GLM-4.7-Flash实现24/7自动化监控 1. 为什么需要自动化监控&#xff1f; 去年接手一个数据采集项目时&#xff0c;我每天要手动检查十几个网页的数据更新情况。这种重复性工作不仅耗时&#xff0c;还经常因为时间差错过关键信息。直到发现Op…...

[特殊字符]️cv_resnet101_face-detection_cvpr22papermogface企业落地教程:集成至AI中台人脸分析模块

MogFace 极速智能人脸检测工具企业落地教程&#xff1a;集成至AI中台人脸分析模块 1. 引言&#xff1a;从实验室到生产线的挑战 想象一下&#xff0c;你是一家大型互联网公司的AI中台负责人。每天&#xff0c;来自电商、社交、安防等不同业务线的团队&#xff0c;都会向你提出…...

黑盒 vs 白盒测试:5个真实项目案例教你如何选择测试方法

黑盒与白盒测试实战指南&#xff1a;5个行业案例解析方法论选择 在软件质量保障领域&#xff0c;测试方法的选择往往决定着缺陷检测效率和项目交付质量。当金融系统的转账功能出现逻辑错误时&#xff0c;当电商促销活动页面突然崩溃时&#xff0c;背后往往存在着测试策略的失误…...

VSCode远程开发Qwen3-ForcedAligner-0.6B:Linux服务器调试全攻略

VSCode远程开发Qwen3-ForcedAligner-0.6B&#xff1a;Linux服务器调试全攻略 用VSCode远程连接Linux服务器&#xff0c;让语音文本对齐开发变得简单高效 你是否曾经遇到过这样的情况&#xff1a;在本地电脑上开发语音处理应用&#xff0c;但硬件性能跟不上&#xff0c;跑个模型…...

BH1750环境光传感器驱动开发与嵌入式应用实践

1. BH1750环境光传感器技术解析与嵌入式驱动开发实践BH1750是由ROHM&#xff08;罗姆&#xff09;半导体推出的高精度数字环境光传感器IC&#xff0c;专为智能照明控制、自动背光调节、人机交互界面亮度自适应等场景设计。该器件采用IC串行接口&#xff0c;内置16位ADC&#xf…...

ELClient:基于SLIP的ESP8266嵌入式Wi-Fi中间件

1. ELClient 库概述 ELClient 是一个面向嵌入式平台的轻量级 Wi-Fi 通信中间件&#xff0c;专为集成 ESP8266 SoC&#xff08;System-on-Chip&#xff09;而设计。其核心定位并非直接操作 ESP8266 的 AT 指令集&#xff0c;而是通过串行链路&#xff08;UART&#xff09;承载 S…...

家用路由器NAT配置实战:5分钟搞定内网穿透与端口映射

家用路由器NAT配置实战&#xff1a;5分钟搞定内网穿透与端口映射 现代家庭网络环境中&#xff0c;多设备联网已成为标配。当您需要远程访问家中NAS、搭建私人游戏服务器或运行智能家居中枢时&#xff0c;NAT配置便成为必须掌握的核心技能。本文将带您深入理解家用路由器的NAT机…...

GLM-OCR模型内网穿透部署方案:实现本地服务的公网安全访问

GLM-OCR模型内网穿透部署方案&#xff1a;实现本地服务的公网安全访问 你是不是也遇到过这样的烦恼&#xff1f;好不容易在本地电脑或者公司内网服务器上部署好了GLM-OCR模型&#xff0c;服务跑得挺顺畅&#xff0c;识别效果也不错。但问题来了&#xff1a;这个服务只能自己或…...

DAMO-YOLO模型量化部署:TensorRT加速实战

DAMO-YOLO模型量化部署&#xff1a;TensorRT加速实战 探索如何通过TensorRT量化加速技术&#xff0c;让DAMO-YOLO目标检测模型在保持精度的同时获得显著的速度提升。 1. 开篇&#xff1a;为什么需要量化加速&#xff1f; 在实际的目标检测应用场景中&#xff0c;我们经常遇到这…...

c++ 移动赋值/移动构造函数

在 C11 引入移动语义&#xff08;Move Semantics&#xff09;之前&#xff0c;对象之间的赋值或初始化通常涉及深拷贝&#xff08;Deep Copy&#xff09;&#xff0c;即复制所有数据。这对于包含动态分配资源&#xff08;如 std::vector, std::string, 原始指针管理的内存&…...