试用消息传递平台NATS
NATS是什么?
这是基于事件驱动架构的基础,相当于消息中间件的软件。
目前,在CNCF中,它已成为孵化项目。
此外,在ThoughtWorks公司的Technology Radar中,截至第24卷,它被评为评估阶段。
信息传递的保证
在NATS中,有两种质量服务(QoS)可用:最多一次(At most once)和最少/确切一次(At-least/exactly once)。
如果要开始使用NATS,首先要安装核心NATS服务器。但只有这个是不够的,它只能保证一次性提交。而且,如果使用JetStream系统,还可以将数据持久化到外部存储中,从而实现至少一次性或者精确一次性提交。
与他的产品进行比较
作为竞争对手的软件包括Kafka和Rabbit MQ等。
产品比较表
由于是CNCF项目,因此支持Prometheus exporter和Grafana dashboard等工具。
另外,这些软件的共同点是将消息订阅者(Publisher/Producer)和消息消费者(Subscriber/Consumer)作为独立的组件进行设计,以实现异步的机制,不依赖彼此的状态,并且可以将各个组件松散耦合。
实践
我们会在公式的Docker镜像中进行实际操作。
使用Docker Compose构建集群。
以下是中文的表达选项:
端口4222用于作为客户端的群集配置。
端口6222用于群集路由端口,
每个服务器通过–cluster指定请求,并通过–routes记录连接信息。
version: "3.5"
services:
nats:
image: nats
ports:
- "8222:8222"
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --http_port 8222 "
networks: ["nats"]
nats-1:
image: nats
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --routes=nats://ruser:T0pS3cr3t@nats:6222"
networks: ["nats"]
depends_on: ["nats"]
nats-2:
image: nats
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --routes=nats://ruser:T0pS3cr3t@nats:6222"
networks: ["nats"]
depends_on: ["nats"]
networks:
nats:
name: nats
创建一个实例。
$ docker compose -f nats-cluster.yaml up
[+] Running 3/0
⠿ Container nats-nats-1 Created 0.0s
⠿ Container nats-nats-1-1 Created 0.0s
⠿ Container nats-nats-2-1 Created 0.0s
Attaching to nats-nats-1, nats-nats-1-1, nats-nats-2-1
nats-nats-1 | [1] 2022/01/23 15:03:27.133998 [INF] Starting nats-server
nats-nats-1 | [1] 2022/01/23 15:03:27.134083 [INF] Version: 2.7.0
nats-nats-1 | [1] 2022/01/23 15:03:27.134097 [INF] Git: [not set]
nats-nats-1 | [1] 2022/01/23 15:03:27.134121 [INF] Name: NDLRORYKRIS7AFKF2P3FTNR32ZVQDZ7JKM375AE6Z64UO6DJ7HZ7AZJJ
nats-nats-1 | [1] 2022/01/23 15:03:27.134140 [INF] ID: NDLRORYKRIS7AFKF2P3FTNR32ZVQDZ7JKM375AE6Z64UO6DJ7HZ7AZJJ
nats-nats-1 | [1] 2022/01/23 15:03:27.135757 [INF] Starting http monitor on 0.0.0.0:8222
nats-nats-1 | [1] 2022/01/23 15:03:27.135919 [INF] Listening for client connections on 0.0.0.0:4222
nats-nats-1 | [1] 2022/01/23 15:03:27.136514 [INF] Server is ready
nats-nats-1 | [1] 2022/01/23 15:03:27.136572 [INF] Cluster name is NATS
nats-nats-1 | [1] 2022/01/23 15:03:27.136879 [INF] Listening for route connections on 0.0.0.0:6222
nats-nats-2-1 | [1] 2022/01/23 15:03:28.014862 [INF] Starting nats-server
nats-nats-2-1 | [1] 2022/01/23 15:03:28.014934 [INF] Version: 2.7.0
nats-nats-2-1 | [1] 2022/01/23 15:03:28.014946 [INF] Git: [not set]
nats-nats-2-1 | [1] 2022/01/23 15:03:28.015124 [INF] Name: NA764AGYL3FA7VZEBN6B6MYMQB3XL3FAGACLCYPILTZBJDNLIJAAQ47A
nats-nats-2-1 | [1] 2022/01/23 15:03:28.015147 [INF] ID: NA764AGYL3FA7VZEBN6B6MYMQB3XL3FAGACLCYPILTZBJDNLIJAAQ47A
nats-nats-2-1 | [1] 2022/01/23 15:03:28.016274 [INF] Listening for client connections on 0.0.0.0:4222
nats-nats-2-1 | [1] 2022/01/23 15:03:28.016522 [INF] Server is ready
nats-nats-2-1 | [1] 2022/01/23 15:03:28.016577 [INF] Cluster name is NATS
nats-nats-2-1 | [1] 2022/01/23 15:03:28.016626 [INF] Listening for route connections on 0.0.0.0:6222
nats-nats-2-1 | [1] 2022/01/23 15:03:28.023049 [INF] 172.18.0.2:6222 - rid:4 - Route connection created
nats-nats-1 | [1] 2022/01/23 15:03:28.022990 [INF] 172.18.0.3:56610 - rid:4 - Route connection created
nats-nats-1-1 | [1] 2022/01/23 15:03:28.087152 [INF] Starting nats-server
nats-nats-1-1 | [1] 2022/01/23 15:03:28.087370 [INF] Version: 2.7.0
nats-nats-1-1 | [1] 2022/01/23 15:03:28.087383 [INF] Git: [not set]
nats-nats-1-1 | [1] 2022/01/23 15:03:28.087432 [INF] Name: NADV6SOGHIG7MRQFH5K3K5NPOJIY7Q6G5WGQ2IRY4KJDXNFED6BUMXST
nats-nats-1-1 | [1] 2022/01/23 15:03:28.087508 [INF] ID: NADV6SOGHIG7MRQFH5K3K5NPOJIY7Q6G5WGQ2IRY4KJDXNFED6BUMXST
nats-nats-1-1 | [1] 2022/01/23 15:03:28.089795 [INF] Listening for client connections on 0.0.0.0:4222
nats-nats-1-1 | [1] 2022/01/23 15:03:28.090691 [INF] Server is ready
nats-nats-1-1 | [1] 2022/01/23 15:03:28.090762 [INF] Cluster name is NATS
nats-nats-1-1 | [1] 2022/01/23 15:03:28.090994 [INF] Listening for route connections on 0.0.0.0:6222
nats-nats-1 | [1] 2022/01/23 15:03:28.094351 [INF] 172.18.0.4:41872 - rid:5 - Route connection created
nats-nats-1-1 | [1] 2022/01/23 15:03:28.094383 [INF] 172.18.0.2:6222 - rid:4 - Route connection created
nats-nats-2-1 | [1] 2022/01/23 15:03:28.096072 [INF] 172.18.0.4:6222 - rid:5 - Route connection created
nats-nats-1-1 | [1] 2022/01/23 15:03:28.096196 [INF] 172.18.0.3:57406 - rid:5 - Route connection created
发布/订阅
为pub/sub客户端执行名为nats-box的映像。
$ docker run --network nats --rm -it synadia/nats-box
_ _
_ __ __ _| |_ ___ | |__ _____ __
| '_ \ / _` | __/ __|_____| '_ \ / _ \ \/ /
| | | | (_| | |_\__ \_____| |_) | (_) > <
|_| |_|\__,_|\__|___/ |_.__/ \___/_/\_\
nats-box v0.5.0
NATS不使用常规的主题发布/订阅方式,而是使用Subject-Based Mapping机制进行数据映射。
如果您以hello方式订阅,请按照以下方式进行操作。
2028c118ec83:~# nats sub -s nats://nats:4222 hello &
2028c118ec83:~# 15:28:37 Subscribing on hello
当你使用“hello”发布时,可以正常接收到。
2028c118ec83:~# nats pub -s "nats://nats-1:4222" hello first
15:28:46 Published 5 bytes to "hello"
[#1] Received on "hello"
first
同时,世界和发布的内容在上述情况下不会被接收。
2028c118ec83:~# nats pub -s "nats://nats-1:4222" world second
15:28:54 Published 6 bytes to "world"
其他节点也在进行聚类。
2028c118ec83:~# nats pub -s "nats://nats-2:4222" hello third
15:29:03 Published 5 bytes to "hello"
[#2] Received on "hello"
third
2028c118ec83:~# nats pub -s "nats://nats-2:4222" world fourth
15:29:33 Published 6 bytes to "world"
2028c118ec83:~#
最后
最近,Kafka和Amazon MSK等工具都出现了,使得管理zookeeper也变得不再必要,变得更加易用。然而,我也发现NATS很轻量且延迟较低,非常方便使用。
我对Kafka的印象是它拥有完整的Java生态系统,
但由于NATS本身是使用Go语言开发的,似乎也有很好的支持,包括Go的客户端等,
所以我想在将来尝试一下。