imjoey / blog

My Blog based on Github Issues.
286 stars 44 forks source link

分布式消息系统调研-NATS #8

Open imjoey opened 7 years ago

imjoey commented 7 years ago

前言

NATS(Go版)是一款高性能、简单、易于扩展的分布式消息系统,它非常适用于云计算和微服务平台。本文介绍NATS的特点,为未来消息系统选型做准备。

调研的要点

一个消息系统,需要考量以下点:

功能

NATS只提供消息投递的Pub-Sub模型,但基于此模型,NATS提供了三种使用方式。

Pub-Sub

此模式下,NATS可实现one-to-many消息投递。由于NATS采用了fire-and-forget机制,在publisher发布消息时,任何非active的subscriber均不能收到该消息(NATS不支持消息的持久化)。

NATS Pub-Sub

Request-Reply

此模式下,NATS可实现point-to-point和one-to-many通信模式。Point-to-point是让所有subcriber拼快,第一个响应返回的就是Reply;而One-to-many是Publisher可配置要收到Subcriber响应的数量。

NATS Request-Reply

Queueing

此模式下,NATS可实现Subcribers之间的负载均衡。每个Subcriber可注册queue名字,凡是注册相同名字queue的subcribers就组成了一个queuegroup。Publisher向对应subject发布的消息会随机(而且只)发给一个subcriber。

NATS Queueing

高可用

NATS支持集群化部署方式,NATS集群可组成一个具有高容量、高弹性、高可用的分布式消息系统。

注:NATS各节点间的消息转发hop最多只有一次。

NATS集群中每个节点在启动gnastd服务时需指定配置文件,配置文件中设置了本节点可route消息的节点列表。本节点只能将发布给自己的消息转发给在列表中的节点,而且转发给自己的消息不可再次转发

消息持久化

NATS不支持消息持久化(消息的堆积)。

Fault Tolerance

由于NATS不支持消息的持久化,所以重启后消息会丢失。

消息顺序

NATS可以保证对于每一个Publisher的消息的顺序,但不保证多Publisher之间的消息顺序。

消息投递策略

由于NATS采用了fire-and-forget机制,而且不支持消息持久化,所以NATS只支持at-most-once投递策略,

其他特点

另外,NATS支持自动断开问题subcribers:

注:Subcriber的重试机制由客户端自行实现。

性能

由于NATS不支持消息持久化和消息事务,所以它的性能非常好,发送/接收的吞吐量是其他MQ的若干倍,详见 官方介绍