目前实际只接触过:RabbitMQ和RocketMQ两款中间件,其他的未用到不做讨论,
关于整体思路理解大抵相似,故以此记录方便后续逐渐加深理解。
一:关于这两款mq中间件的个人整体理解思路:
1.1: mq都会关联生产者和消费者,所有的故事都是生产者和消费者相互摩擦火花产生的。
而mq 可以理解为这两个人中间的邮局。就是负责送快递的。这个是个人理解的整体概念。
1.2: 如果把mq作为一个邮局,那么可以把生产者和消费者看成是两个通过邮局形成联系的
弱关系单独系统模块。之所以是弱联系意思是,即便邮局崩掉了,也不会让生产者或者消费者
完全挂掉,生产者和消费者也是同理。
1.3: 关于mq在生产者和消费者之间的作用:网上统一的结论是,削峰填谷,异步,解耦。
我觉得很有道理。这个作用就很直观,慢慢品一下。
二:mq的内部运作思路个人理解
2.1: mq这个邮局相当于是一个单独的服务,只是不同的mq服务的侧重点不同,当结构大抵相似,
这个邮局基本上会涉及到几个职能部门:
broker: 这个就想当与一个邮局的邮局名称,如果是集群,就可以有多个broker,在一个服务注册列表上
注册多个broker,做负载均衡。
一个broker 邮局里面包含了多个功能
2.1.1: Exchange交换机,相当于是一个窗口,是消费者和快递小哥对接的窗口,起到一个把消息路由到不同队列的作用
2.1.2: query 队列,就相当于快递小哥,负责保存生产者指定的事件消息,以及和消费者做关联
2.1.3: connection 相当于一个长链接,是消费者和query队列关联的TCP长连接,简单理解就是消费者和快递小哥持续联系的长连接。
2.1.4: channel 管道,是connection中又生成的多个小的管道,这个管道是真正消费者和队列进行消费消息的通道,这个通道是在Connection中 ,用完可以随时关掉。但是connection是一直连着在。这种模式网上的意思是降低网络开销,类似于多路复用把。
2.1.5: 还有就是路由key, 这个就相当于是可以指定消息让哪一个队列保存,在创建队列的时候,指定query队列保存消息,这个是在创建exchange的时候,设置好交换机的类型,是直连还是广播,如果是直连,那么从exchange到query ,就是可以设置好交换机绑定了哪几个队列,并且每一个队列接收的是哪一个路由key,这样如果生产者在生产消息的时候,可以把路由key带上,然后发送给exchange,交换机就会把消息路由到对应的队列。
2.1.6: Topics 主题,我理解和路由key类似,只是主题后面跟的是通配符,交换机根据通配符把消息路由到对应的队列。
2.1.7 : ack 相当于一个确认符号,意思是回复已读的意思,默认是自动,也可以改为回调已读。
三:项目使用理解:
mq 消费者消费消息,分为pull,push ,就是队列主动把消息推给消费者和消费者自己主动去拉去队列的消息消费,这两种都涉及到一个ack,就是消费完消息要给交换机一个确认机制,这个可以是手动的,可以是自动的。
当消费者消费消息,一般是监听交换机提前创建好的队列,如果有消息就去消费,然后实现消费者自己的逻辑,如果是pull模式,是mq回调消费者写好的逻辑,有消息直接消费,如果是push模式,则是消费者自己根据需要去消费队列消息。
目前项目中的mq使用,主要是发邮件,或者晚上的订单系统。。,在芋道开源框架里面,是采取的spring事件监听的方式,就是监听某一条消息,如果如果发送变化,消费者能够感知到,然后拉去消息消费。
关于mq的常见问题,消息持久化,重复消费,幂等性这些问题,其实都是围绕着消息的生产者到交换机,或者是交换机到队列,或者交换机到消费者,这几个方面去做补偿逻辑。进行具体的业务逻辑实施解决方案。