1消息中间件NATS基础知识
一个传统的应用:
+------+ +------+ +----+
|mobile|---1--->|api |--2-->|DB |
|phone |<--4----|server|<-3---| |
+------+ +------+ +----+
客户端发请求,然后服务端处理,处理完后,它会和数据库进行交互,比如存取数据。
返回之后呢,服务器端再直接返回给这个客户端。整个过程其实是一个同步的过程。
客户端发出请求后,它是一直在等待着,直到服务端完成处理最后返回结果。
使用消息中间件开发的应用
+----------------------------+
+------+ +------+ |message oriented middleware |<---[order svc]--->[DB]
|mobile|----->|api |--->| [ ][x][x][x] |
|phone |<-----|server|<---| [ ][x][x][x] |
+------+ +------+ | |<---[email svc]--->[SMTP Server]
+----------------------------+
有很多业务,可能后台处理逻辑是非常复杂的,客户端,不可能一直等着服务器端处理,有的时候会造成超时啊什么的。
用户的体验会变得非常的差。对这种服务端需要多重处理,或者处理时间比较长的一些服务,其实我们推荐使用这个消息中间件。
整个过程是这样的:
客户端发起请求之后,服务端收到请求处理简单的业务,然后会把一些复杂的业务通过消息中间件推到后端的服务去处理。
这个过程,其实在我把消息扔到消息中间件之后,我就认为我的业务处理是已经成功的,那我就会把结果返回给客户端。
那后端的服务呢,会从消息队列中去取相应的消息,做相应的处理。比如订单的服务,发送邮件的服务。
这样处理呢,其实还有很多的好处。比如说我发送邮件的服务,在这个邮件服务器发生异常的时候,那我这个服务的消息处理相当于失败了。其实这个消息还会放回队列里,等到下次重试,再重新去处理这个消息。
消息的基础知识
发布-订阅:
+----------+
+-msg1-->|subscriber|
+-------+ | +----------+
+---------+ | | | +----------+
|publisher|--msg1-->|Subject|---+-msg1-->|subscriber|
+---------+ | | | +----------+
+-------+ | +----------+
+-msg1-->|subscriber|
+----------+
消息队列:
+----------+
+-msg2-->|subscriber|
+-----+ | +----------+
+---------+ | | | +----------+
|publisher|--msg1,2,3-->|Queue|---+-msg1-->|subscriber|
+---------+ | | | +----------+
+-----+ | +----------+
+-msg3-->|subscriber|
+----------+
Req-Resp:
其实,也是发布和订阅的模式,通过客户端封装出来的。
发送方,发送消息到消息中间件之后,订阅者收到消息可以回复这个发送者。
+----------+
+-msg1-->|subscriber|
+-------+ | +----------+
+---------+ | | | +----------+
|publisher|--msg1-->|Subject|---+-msg1-->|subscriber|
+----+----+ | | | +----------+
^ +-------+ | +----------+
| +------+ +-msg1-->|subscriber|
| | | +-----+----+
+--------------|Reply | |
| |<------------------+
+------+
主题 (Subject/Topic)
主题就是一个字符串表示的名称,能确保发布者和订阅者可以使用该名称来查找对方。
发布者 (Publisher)
消息的发送方
订阅者 (Subscriber)
消息的接收方(消费方)
NATS集群高可用架构+LeafNode(边缘节点)架构图
+------++----------------------------------------------------------+
| || React-client |
|auth |+----------------------------------------------------------+
|server|+----------------------------------------------------------+
| ||Beijing: main-cluster |
| || [other service] [restful api service] [cluster-mgr] |
| || ^| ^| ^| |
| || |v |v |v |
| || ++----------------++------------------++ |
| || |^ |
| || v| |
| || {NATS cluster} |
+------++---------------------------+-+----------------------------+
^ |
| v
+-----------------------------------+-+----------------------------+
| NATS GATEWAY |
+--------------------------+-+-----------------------------+-+-----+
^ | ^ |
| v | v +---------+
+--------------------------+-+----++-----------------------+-+-----+ |NATS Leaf|
|Guangzhou:cluster1 {NATS cluster}||Beijing:cluster2 {NATA cluster}<-->| NODE |
| ^ || ^ | +----+----+
| |msg || |msg | |
| v || v | |
| cluster-mgr || cluster-mgr | v
+---------------------------------++-------------------------------+ [IoT Device]