1jetstream理论篇
NATS JetStream的设计目标
-
The system must be easy to configure and operate and be observable.
系统必须容易配置,易于操作,易于被发现或者被观察。
-
The system must be secure and operate well with NATS 2.0 security models.
系统必须是安全的,并且基于NATS2.0的安全模型能够良好的运行。
-
The system must be scale horizontally and be applicable to a high ingestion rate.
系统必须支持水平扩展,支持高吞吐。
-
The system must support multiple use cases.
系统必须支持多种用户场景。
-
The system must self-heal and always be available.
系统必须能自我修复,并且保持高可用
-
The system must have an API that is closer to core NATS.
系统必须和我们前面介绍的这个NATS部分的API保持一致。
-
The system must allow NATS messages to be part of a stream as desired. The system must display payload agnostic behavior.
系统必须能够复用Core NATS,之前的一些这个,消息,并且具备系统这种负载无关的特性。
-
The system must not have third party dependencies.
系统不能依赖第三方软件
JetStream
JetStream是NATS内置的分布式持久化存储系统(这样理解非常重要),构建在JetStream存储系统上的“core NATS”功能更多,消息可靠性更高。
+---------+ +---->{subscriber}
|publisher|-------->(exchange)--+---->{subscriber}
+---------+ | +---->{subscriber}
|
v
+------------+
+---------+ |JetStream |------->|pull |
|publisher|--pub->|(distributed|<--ack--|consumer|
| |<-ack--|persistence |
+---------+ |system) |-------->|push |-------->|subs- |
+------------+ |consumer|<--ack---|criber|
JetStream是一套分布式的存储系统,主要用来存储消息,实现发布者和消费者之间的这种解耦。
NATS在JetStream之上,构建了一套完整的消息系统,消息发布者可以直接调用JetStream的消息发布接口发布消息,同时也可以根据JetStream订阅的主题,截获NATS原有的消息进行存储。
消息的消费端,有这种拉的模式和推的模式,用了JetStream之后,我们建议还是以这种拉的模式来消费消息。
推的模式和上面的消息处理方式一样,如果有消费者在线,JetStream就会将消息推送到消费者定义的这个主题里。我们在创建消费者的时候,我们就会看到他会有个target参数会专门来负责定义这个主题的名称。 同时,我的订阅者消费成功之后,会回复ack的确认消息,这样JetStream就不会再一次推送消息。如果没有收到确认的话,服务端会再次推送。真正实现了所谓的消息必达的这种功能。
创建stream
|
|
创建Consumer
|
|
DeliverPolicy | 指定如何处理stream里的消息 |
---|---|
DeliverAll | 默认配置,consumer需要处理从开始的所有消息 |
DeliverLast | 从处理流中的最后一条消息开始 |
DeliverLastPerSubject | 第一次使用消息时,从当前流中每个主题的最后一条消息开始 |
DeliverNew | 只处理consumer创建后的新消息,历史消息就不处理了 |
DeliverByStartSequence | 从指定的sequence开始处理 |
DeliverByStartTime | 从指定的时间开始处理 |
抽象出一层Consumer主要是为了解决相同的stream,不同的consumer消费方式不一样的场景。
在实际业务中,一般情况stream是提前设计规划好的,但consumer大多数情况是由具体的服务来创建的,当然也要根据你具体的业务来决定,如果业务单一,也可以提前nats命令创建好,程序逻辑就不需要创建consumer了。
详解ack
消费端:客户端消费完消息之后,给消息系统回复一条ack的确认信息,那消息系统就不会再次推送。如果我不回复ack确认我的消费已经完成的话,它还会再次推送。
发送端:客户端往jetstream系统写入消息的时候,它也会给这个写消息的客户端回复一条ack消息,确保这条消息百分百已经进行了持久化存储。