01、NATS基础介绍
01、NATS基础介绍
项目中使用到了 NATS,但是之前并没有接触过,所以特意去学习了下,网上找了些资料,相对来说,都不是很全的介绍,所以特意记录下笔记,方便自己掌握,也希望可以帮助到其他小伙伴。
重点:
本系列教程以 NATS2.2
之后的版本为例进行讲解,2.2 之后的版本加入了较多的特性,其中最大的便是 JetStream
相关的。
1、基础介绍
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的设计目标包括:
-
简单性(Simplicity): NATS 的设计注重简洁性,使其易于理解、部署和使用。开发者可以迅速上手,而不必花费过多时间在复杂的配置和设置上。
-
安全性(Security): NATS 提供多种安全性特性,包括身份验证、访问控制和加密传输,以确保通信在分布式系统中的保密性和完整性。
-
高性能(High Performance): NATS 被设计为高性能的消息传递系统,能够在低延迟的情况下处理大量的消息。这使得 NATS 在需要实时性和高吞吐量的应用场景中表现出色。
-
可扩展性(Scalability): NATS 支持多种部署模式,可以在不同的环境中进行扩展,从本地部署到云端和边缘计算,甚至是嵌入式设备。
-
异步通信(Asynchronous Communication): NATS 基于发布者-订阅者模型,支持异步通信,使得系统中的不同组件能够松耦合地进行消息交换,从而实现实时事件传递和消息广播。
-
可靠性和持久性(Reliability and Persistence): NATS 支持持久订阅和可靠消息传递,确保即使在订阅者断开连接或宕机的情况下,消息也不会丢失。
-
请求-响应模式(Request-Response Pattern): NATS 提供了请求-响应模式,允许应用程序发起请求并接收响应,从而实现简单可靠的通信流程。
-
适应不同规模(Suitable for Different Scales): NATS 适用于各种规模的应用,从小型应用到大规模分布式系统,都能够根据需要进行调整。
-
开放性和跨平台支持(Openness and Cross-Platform Support): NATS 提供了多种编程语言的客户端实现,支持跨平台操作系统,使开发者能够在不同环境中使用其功能。
1.3、NATS应用场景
以下是一些常见的NATS应用场景:
-
微服务通信: 微服务架构中的不同服务可以使用NATS来进行通信。NATS提供低延迟和高吞吐量的消息传递,有助于实现微服务之间的解耦和快速通信。
-
事件驱动架构: NATS能够支持事件驱动架构,用于处理实时事件、通知和更新。通过发布订阅模型,服务可以订阅感兴趣的事件,以便在事件发生时作出相应。
-
分布式系统协调: 在分布式系统中,NATS可以用作协调机制,帮助不同的节点之间协调操作、共享状态信息和进行通信。
-
实时数据处理: NATS可以用于实时数据流处理,例如传感器数据、日志流等。它可以将数据发送到消费者,用于实时分析、监控和警报。
-
异步通信: NATS支持异步通信模式,适用于需要将请求和响应解耦的场景。客户端可以发送请求消息,而不需要立即等待响应。
-
发布订阅系统: NATS的发布订阅模型使其非常适合构建发布订阅系统,用于向订阅者广播事件、消息或数据更新。
-
服务发现和动态配置: NATS可以用于服务发现,帮助服务在网络中找到彼此。它还可以用于动态配置管理,允许服务在运行时获取配置更新。
-
高可用性和容错: NATS支持集群模式,可以提供高可用性和容错性,确保系统的可用性和健壮性。
-
物联网(IoT)应用: NATS可以用于连接和管理物联网设备,将传感器数据传输到云端进行处理和分析。
注意:
NATS的设计注重简单性和性能,它可能不适用于所有应用场景,特别是需要复杂事务处理和持久性存储的情况。
1.4、NATS客户端介绍
NATS客户端的实现语言挺多的,基本上主流的语言都有,需要的可以直接去 nats-io 上面去找,这里有一个规律,NATS客户端的命名一般事 nats.具体的语言
,比如 nats.go、nats.py、nats.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支持基于队列的语义(相对于日志),因此没有可用的消息重播。) |