NATS是一个开源、轻量级、高性能的分布式消息中间件,实现了高可伸缩性和优雅的Publish/Subscribe模型,使用Golang语言开发。
Distributed System Concepts and Design一文中指出 A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages。即消息中间件在网络中的计算机中,系统中各个组件只通过消息中间件传递消息进行交流和调度。
消息中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋,消息通信等问题。
目前市场上热度较高的消息中间件有RabbitMQ, ActiveMQ, Kafka等,这些消息队列的使用率较高。NATS属于比较小众的一款中间件产品,基于Go语言开发,虽热度不及以上提及的消息队列,但在性能方面可以说有过之而无不及,下图为各个消息队列性能对比图。
发布订阅(Publish Subscribe)
请求回复(Request Reply)
队列订阅(Queue Subscribers )
提供的功能:
纯粹的发布订阅模型(Pure pub-sub)
服务器集群(Cluster mode server)
自动精简订阅者(Auto-pruning of subscribers)
基于文本协议(Text-based protocol)
多服务质量保证(Multiple qualities of service - QoS)
发布订阅(Publish Subscribe)
发布与的订阅
NATS为一对多通信实现发布 - 订阅消息分发模型。发布者在主题(subject)上发送消息,并且监听该主题的任何活动订阅者都会收到该消息。订阅者还可以注册对通配符主题的兴趣。这种一对多模式有时被称为扇出。
请求响应(Request Reply)
Request-Reply是现代分布式系统中的常见模式。发送一个请求,应用程序要么在响应时等待一定的超时,要么异步接收响应。
NATS通过其核心通信机制,发布和订阅支持这种模式。对具有回复主题的给定主题发布请求,并且响应者听取该主题并将回复发送给回复主题。回复主题通常是一个名为_INBOX的主题,它将被动态地定向回请求者,而不管任何一方的位置如何。
NATS允许多个响应者运行并形成动态队列组以进行透明扩展。NATS应用程序在退出之前消耗的能力允许缩小而不会丢弃请求。由于NATS基于发布 - 订阅,因此可观察性就像运行另一个可以查看请求和响应以测量延迟,注意异常,直接可伸缩性等的应用程序一样简单。
NATS的强大功能甚至允许在使用第一个响应的情况下进行多次响应,系统会有效地丢弃其他响应。这允许复杂的模式使多个响应者减少响应延迟和抖动。
NATS支持两种请求响应消息:点对点或多对多。点对点涉及最快或首先响应。在一对多的消息交换中,需要限制请求响应的限制
在Request Reply过程中,发布请求发布带有响应主题的消息,期望对该subject做出响应操作
NATS提供称为队列订阅的负载均衡功能,虽然名字为queue(队列),但是并不是我们所认为的那样。主要功能是将具有相同queue名字的subject进行负载均衡。使用队列订阅功能消息发布者不需要做任何改动,消息接受者需要具有相同的队列名
使用队列订户将平衡一组订户的消息传递,这可以用于提供应用程序容错和扩展工作负载处理。
要创建队列订阅,订户会注册队列名称。具有相同队列名称的所有订户构成队列组。这不需要配置。当发布已注册主题上的消息时,随机选择该组中的一个成员来接收该消息。尽管队列组具有多个订户,但每个消息仅由一个消息使用。
NATS的一个重要特性是队列组由应用程序及其队列订户定义,而不是在服务器配置上定义。
队列订户是扩展服务的理想选择。向上扩展就像运行另一个应用程序一样简单,向下扩展是使用一个消耗飞行中请求的信号来终止应用程序。这种灵活性和缺乏任何配置变化使NATS成为一种优秀的服务通信技术,可以与所有平台技术协同工作
NATS Streaming介绍
NATS存在不能保证消息的投递正确性和存在其他的缺点。NATS Streaming就孕育而生。它是一个由NATS提供支持的数据流系统,采用Go语言编写,NATS Streaming与核心NATS平台无缝嵌入,扩展和互操作.除了核心NATS平台的功能外,它还提供了以下功能: