NATS简介
消息系统很多,像很多搞Java的人熟知的RocketMQ,Kafka等,包括Go语言中的NSQ。NATS这个消息系统可能在Go语言生态中运用得多,因为Go语言环境中很多人会选中用NSQ而不会选择Kafka,很明显的一个原因是Kafka等其他消息队列需要安装Jvm虚拟机,带来不必要的性能消耗以及真的没必要用jvm。
NATS也是用Go写的一个开源项目,今年来很多流行以及重要的开源项目都是用go写的,如Docker,NSQ,K8S,包括区块链行业的Ethereum、IPFS等重量级项目。
用Go写的一大原因就是高性能,NATS也一样,是一个轻量级的,高性能的,被称为cloud-native的消息系统。NATS的设计旨在原生的支持现代云计算架构模式。
据NATS官网的介绍,像西门子、HTC、百度、VMware等公司都在用NATS。
NATS的设计目标
从NATS的官网可以看出,NATS设计的核心是性能、可伸缩性以及可用性。当然每个消息系统这点都做得都不差,NATS围绕以下核心功能设计:
高性能
永远在线随时可用
极其轻量
支持多种服务特性(如保证至少一次交付)
支持各种消息模型和用列,也即是可伸缩性高。
NATS的消息传递模型
NATS支持的消息传递模型包括:
发布订阅模型
请求响应模型
队列模型
NATS的特性
纯发布订阅模型
从不假设有消息接收者;
总是在线可用。
集群模式服务器
NATS服务可用做集群;
分布式的消息队列可以跨集群;
集群发现的客户端。
订阅者的自动精简
为了支持伸缩,NATS提供客户端连接的自动精简;
如果一个客户端消费消息很慢,那么NATS将断开这个客户端;
如果一个客户端在ping-pong期间内没有响应,那么服务器会将其关闭;
客户端实现了重新尝试连接的逻辑。
基于文本的协议
对于新手来说很容易上手;
不影响服务器性能;
可以直接用Telnet连接到服务器并发送消息。
支持多种服务特性
最多一次交付(TCP级别的可靠性),NATS会立即向合适的订阅者发送消息,但不会保留消息;
至少一次交互(通过NATS流),消息一直存在,直到被订阅者确认,或者超时过气或者存储空间被占满。
持久性的订阅(通过NATS流)
维持订阅的交互状态,以便订阅可以在中断处继续。
事件驱动型数据流服务(通过NATS流)
消息可以持久化到内存、文件、或者其他第三方存储空间中。
缓存上次/初始值
对于一个订阅者来说,可以从最近发布的消息开始发送。
领取专属 10元无门槛券
私享最新 技术干货