浅谈NATS消息中间件

概述

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语言开发,虽热度不及以上提及的消息队列,但在性能方面可以说有过之而无不及,下图为各个消息队列性能对比图。

浅谈NATS消息中间件_第1张图片

NATS消息传递模型

  • 发布订阅(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)上发送消息,并且监听该主题的任何活动订阅者都会收到该消息。订阅者还可以注册对通配符主题的兴趣。这种一对多模式有时被称为扇出。

浅谈NATS消息中间件_第2张图片

请求响应(Request Reply)

Request-Reply是现代分布式系统中的常见模式。发送一个请求,应用程序要么在响应时等待一定的超时,要么异步接收响应。

NATS通过其核心通信机制,发布和订阅支持这种模式。对具有回复主题的给定主题发布请求,并且响应者听取该主题并将回复发送给回复主题。回复主题通常是一个名为_INBOX的主题,它将被动态地定向回请求者,而不管任何一方的位置如何。

NATS允许多个响应者运行并形成动态队列组以进行透明扩展。NATS应用程序在退出之前消耗的能力允许缩小而不会丢弃请求。由于NATS基于发布 - 订阅,因此可观察性就像运行另一个可以查看请求和响应以测量延迟,注意异常,直接可伸缩性等的应用程序一样简单。

NATS的强大功能甚至允许在使用第一个响应的情况下进行多次响应,系统会有效地丢弃其他响应。这允许复杂的模式使多个响应者减少响应延迟和抖动。

NATS支持两种请求响应消息:点对点或多对多。点对点涉及最快或首先响应。在一对多的消息交换中,需要限制请求响应的限制

在Request Reply过程中,发布请求发布带有响应主题的消息,期望对该subject做出响应操作

浅谈NATS消息中间件_第3张图片
队列订阅

NATS提供称为队列订阅的负载均衡功能,虽然名字为queue(队列),但是并不是我们所认为的那样。主要功能是将具有相同queue名字的subject进行负载均衡。使用队列订阅功能消息发布者不需要做任何改动,消息接受者需要具有相同的队列名

使用队列订户将平衡一组订户的消息传递,这可以用于提供应用程序容错和扩展工作负载处理。

要创建队列订阅,订户会注册队列名称。具有相同队列名称的所有订户构成队列组。这不需要配置。当发布已注册主题上的消息时,随机选择该组中的一个成员来接收该消息。尽管队列组具有多个订户,但每个消息仅由一个消息使用。

NATS的一个重要特性是队列组由应用程序及其队列订户定义,而不是在服务器配置上定义。

队列订户是扩展服务的理想选择。向上扩展就像运行另一个应用程序一样简单,向下扩展是使用一个消耗飞行中请求的信号来终止应用程序。这种灵活性和缺乏任何配置变化使NATS成为一种优秀的服务通信技术,可以与所有平台技术协同工作

浅谈NATS消息中间件_第4张图片

NATS Streaming介绍

NATS存在不能保证消息的投递正确性和存在其他的缺点。NATS Streaming就孕育而生。它是一个由NATS提供支持的数据流系统,采用Go语言编写,NATS Streaming与核心NATS平台无缝嵌入,扩展和互操作.除了核心NATS平台的功能外,它还提供了以下功能:

  • 增强消息协议(Enhanced message protocol)
  • 消息/事件持久化(Message/event persistence)
  • 至少一次数据传输(At-least-once-delivery)
  • Publisher限速(Publisher rate limiting)
  • Subscriber速率匹配(Rate matching/limiting per subscriber)
  • 按主题重发消息(Historical message replay by subject)
  • 持续订阅(Durable subscriptions)

你可能感兴趣的:(云原生)