01、NATS基础介绍

项目中使用到了 NATS,但是之前并没有接触过,所以特意去学习了下,网上找了些资料,相对来说,都不是很全的介绍,所以特意记录下笔记,方便自己掌握,也希望可以帮助到其他小伙伴。

重点:

本系列教程以 NATS2.2 之后的版本为例进行讲解,2.2 之后的版本加入了较多的特性,其中最大的便是 JetStream 相关的。

1、基础介绍

github

document

1.1、简介

NATS 是一种旨在为数字化系统、服务和设备提供简单、安全和高性能通信的解决方案。作为云原生计算基金会(CNCF)的一部分,NATS 提供了多达 40 种不同编程语言的客户端实现,并且其服务器可以灵活地在本地、云端、边缘计算甚至树莓派等多种环境下运行。

NATS 的设计注重简洁性和可靠性,使得构建分布式系统变得更加容易。通过使用发布者-订阅者模型,NATS 允许系统中的不同组件之间进行异步通信,从而实现实时数据传递、事件通知以及系统状态更新等功能。此外,NATS 还支持请求-响应模式,使得系统能够实现简单且可靠的请求处理和响应。

注意,这里除了常见的消息队列的使用模式外,NATS 还支持请求-响应模式,这相对其他消息队列而言算是一个比较大的不同。

由于其出色的性能和安全特性,NATS 成为了构建现代分布式系统的首选工具之一。其适用范围涵盖了从云端应用到边缘设备,使得系统设计者能够更加专注于应用逻辑的开发,而无需过多关注底层通信机制。

这里说一个关于 NATS 的故事,NATS 的最初版本并不是使用 Go 编写的,而是使用 Ruby 。后面 Derek 使用 Go 重写了 NATS,发现性能效果更好,于是现在慢慢将Ruby版本的服务器淘汰了,现在官网也只维护一个Go 版本的 server,也就是我们这里的 nats-server。

1.2、NATS设计目标

NATS的设计原则是:高性能、可伸缩能力、易于使用,基于这些原则,NATS的设计目标包括:

  1. 简单性(Simplicity): NATS 的设计注重简洁性,使其易于理解、部署和使用。开发者可以迅速上手,而不必花费过多时间在复杂的配置和设置上。

  2. 安全性(Security): NATS 提供多种安全性特性,包括身份验证、访问控制和加密传输,以确保通信在分布式系统中的保密性和完整性。

  3. 高性能(High Performance): NATS 被设计为高性能的消息传递系统,能够在低延迟的情况下处理大量的消息。这使得 NATS 在需要实时性和高吞吐量的应用场景中表现出色。

  4. 可扩展性(Scalability): NATS 支持多种部署模式,可以在不同的环境中进行扩展,从本地部署到云端和边缘计算,甚至是嵌入式设备。

  5. 异步通信(Asynchronous Communication): NATS 基于发布者-订阅者模型,支持异步通信,使得系统中的不同组件能够松耦合地进行消息交换,从而实现实时事件传递和消息广播。

  6. 可靠性和持久性(Reliability and Persistence): NATS 支持持久订阅和可靠消息传递,确保即使在订阅者断开连接或宕机的情况下,消息也不会丢失。

  7. 请求-响应模式(Request-Response Pattern): NATS 提供了请求-响应模式,允许应用程序发起请求并接收响应,从而实现简单可靠的通信流程。

  8. 适应不同规模(Suitable for Different Scales): NATS 适用于各种规模的应用,从小型应用到大规模分布式系统,都能够根据需要进行调整。

  9. 开放性和跨平台支持(Openness and Cross-Platform Support): NATS 提供了多种编程语言的客户端实现,支持跨平台操作系统,使开发者能够在不同环境中使用其功能。

1.3、NATS应用场景

以下是一些常见的NATS应用场景:

  1. 微服务通信: 微服务架构中的不同服务可以使用NATS来进行通信。NATS提供低延迟和高吞吐量的消息传递,有助于实现微服务之间的解耦和快速通信。

  2. 事件驱动架构: NATS能够支持事件驱动架构,用于处理实时事件、通知和更新。通过发布订阅模型,服务可以订阅感兴趣的事件,以便在事件发生时作出相应。

  3. 分布式系统协调: 在分布式系统中,NATS可以用作协调机制,帮助不同的节点之间协调操作、共享状态信息和进行通信。

  4. 实时数据处理: NATS可以用于实时数据流处理,例如传感器数据、日志流等。它可以将数据发送到消费者,用于实时分析、监控和警报。

  5. 异步通信: NATS支持异步通信模式,适用于需要将请求和响应解耦的场景。客户端可以发送请求消息,而不需要立即等待响应。

  6. 发布订阅系统: NATS的发布订阅模型使其非常适合构建发布订阅系统,用于向订阅者广播事件、消息或数据更新。

  7. 服务发现和动态配置: NATS可以用于服务发现,帮助服务在网络中找到彼此。它还可以用于动态配置管理,允许服务在运行时获取配置更新。

  8. 高可用性和容错: NATS支持集群模式,可以提供高可用性和容错性,确保系统的可用性和健壮性。

  9. 物联网(IoT)应用: NATS可以用于连接和管理物联网设备,将传感器数据传输到云端进行处理和分析。

注意:

NATS的设计注重简单性和性能,它可能不适用于所有应用场景,特别是需要复杂事务处理和持久性存储的情况。

1.4、NATS客户端介绍

NATS客户端的实现语言挺多的,基本上主流的语言都有,需要的可以直接去 nats-io 上面去找,这里有一个规律,NATS客户端的命名一般事 nats.具体的语言,比如 nats.gonats.pynats.java

2、NATS与其他消息队列比较

详细的介绍可以直接看官方文档上面的介绍。

这里摘选觉得比较重要的比较。

Delivery Guarantees(交付保证):

Project Quality of Service / Guarantees
NATS At most once, at least once, and exactly once is available in JetStream.
gRPC At most once.
Kafka At least once, exactly once.
Pulsar At most once, at least once, and exactly once.
Rabbit At most once, at least once.

Message Retention and Persistence(消息保留和持久性):

Project Message Retention and Persistence Support
NATS Supports memory, file, and database persistence. Messages can be replayed by time, count, or sequence number, and durable subscriptions are supported. With NATS streaming, scripts can archive old log segments to cold storage.(支持内存、文件和数据库持久性。消息可以按时间、计数或序列号重播,并且支持持久订阅。使用NATS流,脚本可以将旧的日志段归档到冷存储中。)
gRPC N/A
Kafka Supports file-based persistence. Messages can be replayed by specifying an offset, and durable subscriptions are supported. Log compaction is supported as well as KSQL.(支持基于文件的持久性。可以通过指定偏移量来重播消息,并且支持持久订阅。日志压缩和KSQL一样受支持。)
Pulsar Supports tiered storage including file, Amazon S3 or Google Cloud Storage (GCS). Pulsar can replay messages from a specific position and supports durable subscriptions. Pulsar SQL and topic compaction is supported, as well as Pulsar functions.(支持分层存储,包括文件、亚马逊S3或谷歌云存储(GCS)。Pulsar可以从特定位置重播消息,并支持持久订阅。支持Pulsar SQL和主题压缩,以及Pulsar函数。)
Rabbit Supports file-based persistence. Rabbit supported queue-based semantics (vs log), so no message replay is available.(支持基于文件的持久性。Rabbit支持基于队列的语义(相对于日志),因此没有可用的消息重播。)

01、NATS基础介绍的更多相关文章

  1. NATS—基础介绍

    1. 介绍 NATS(Message bus): 从CloudFoundry的总架构图看,位于各模块中心位置的是一个叫nats的组件.NATS是由CloudFoundry的架构师Derek开发的一个开 ...

  2. NATS_01:NATS基础介绍

    1.介绍 NATS(Message bus): 从CloudFoundry的总架构图看,位于各模块中心位置的是一个叫nats的组件.NATS是由CloudFoundry的架构师Derek开发的一个开源 ...

  3. 【01】emmet系列之基础介绍

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 相关网址 官网:http: ...

  4. 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用

    043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...

  5. 011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三—— 变量值——即Java中的“字面值”

    011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三-- 变量值--即Java中的"字面值" 变量值可以是 ...

  6. 010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二——变量类型——即Java中的数据类型

    010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二--变量类型--即Java中的数据类型 Java中变量的三要素 变量名 变 ...

  7. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  8. OSPF基础介绍

    OSPF基础介绍 一.RIP的缺陷 1.以跳数评估的路由并非最优路径 2.最大跳数16导致网络尺度小 3.收敛速度慢 4.更新发送全部路由表浪费网络资源 二.OSPF基本原理 1.什么是OSPF a& ...

  9. shell脚本编程基础介绍

    Linux系统——shell脚本编程基础介绍 1.什么是shell 它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果 ...

  10. 黑马_13 Spring Boot:01.spring boot 介绍&&02.spring boot 入门

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 SpringBoot基础 1.1 原有 ...

随机推荐

  1. [转帖]总结:Springboot监控Actuator相关

    一.介绍 由于项目中使用的仍然是比较老旧的1.5.6版本,所以本文是基于此版本进行描述. 二.Actuator使用 ActuatorActuator是Spring Boot提供的对应用系统的监控和管理 ...

  2. Linux 通过yum 方式离线下载依赖rpm包的操作步骤

    离线下载依赖rpm包的方法 1.简单获取依赖关系 yum deplist rpm-build 注意 deplist 为依赖项目 我在arm 上面简单跑一下结果为 package: rpm-build- ...

  3. 谈JVM xmx, xms等内存相关参数合理性设置

    作者:京东零售 刘乐 说到JVM垃圾回收算法的两个优化标的:吞吐量和停顿时长,并提到这两个优化目标是有冲突的.那么有没有可能提高吞吐量而不影响停顿时长,甚至缩短停顿时长呢?答案是有可能的,提高内存占用 ...

  4. js下拉加载更多-详解

    场景 有些时候,我们在pc端经常会遇见滚动到底部的时候,去加载下一页的数据, 这个时候,我们就需要知道滚动条什么时候触底了, 如果触底了,就去加载下一页的数据; 在触底的过程中,我们需要注意的是,防止 ...

  5. vue同步组件和异步组件的区别

    异步组件 异步组件:只在组件需要渲染(组件第一次显示)的时候进行加载渲染并缓存,缓存是以备下次访问. Vue实现按需加载 在打包的时候,会打包成单独的js文件存储在static/js文件夹里面** 在 ...

  6. 【K哥爬虫普法】一个人、一年半、挣了2000万!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  7. 使用Python调用Nessus 接口实现自动化扫描

    @ 目录 认证 策略模板配置 创建策略模板 任务 创建任务 启动/停止任务 获取扫描结果 获取漏洞信息 获取漏洞输出信息与漏洞知识库信息 最后总结 之前在项目中需要接入nessus扫描器,研究了一下n ...

  8. 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略.添加基线(baseline).优势函数.动作分配合适的分数(credit) 1.核心词汇 策略(policy):在每一个演员中会有对应的 ...

  9. C# 字符与字符串操作

    在C#中,字符和字符串是两个重要的数据类型,有许多内置的方法可以处理字符和字符串.这些方法是非常有用的,可以帮助开发人员更方便.更高效地处理文本数据. 格式化字符串: using System; us ...

  10. 小米WIFI 7路由器BE6500 Pro开箱

    上次发帖与坛子里的网友们聊了小米的这款路由,正好今天拿到货了,所以来个开箱图,让其他彦祖们也见识见识小米家的路由产品. 以前买过小米家的路由器,但是当时就是买来尝鲜,这次咋的也是对WIFI 7的尝鲜吧 ...