当前位置: 首页 > 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层详细…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...