MQ理论
- 队列,是一种FIFO 先进先出的数据结构。消息:在不同应用程序之间传递的数据。将消息以队列的形式存储起来,并且在不同的应用程序之间进行传递,这就成了MessageQueue。
- MQ通常三大作用: 异步、解耦、限流
Spring的事件发布机制有类似的功能、如创建监听ApplicationEvent的监听器、容器启动过程中、会发布多个ApplicationEvent, 监听器探测到后处理,具体模型如下:
AppContext为Producer, Event为Message、 Listener为consumer;Producer和Consumer他们的运行状况互不干涉,没有Consumer,Producer一样正常运行,反过来也一样。也就是说,推送Producer和Consumer正常工作的,只有发布的这些事件。这种方式就称为事件驱动
SpringBoot会将自己应用过程中发生的每一个重要的运行步骤都通过事件发送出来,全都在一个内部服务进程内;
若是想搭建监控中心、监控多个SpringBoot应用的运行信息, 因为跨服务、无法通过SpringBoot事件机制完成、所以需要一个中间服务、负责转发接收和转发这些SpringBoot的应用信息;
需要满足:
- 应用AppContext和监控服务是全解耦、即应用或者监控挂了,都不影响对方;
- 应用AppContext与监控服务解耦、即应用只需发消息给消息服务;
- 消息服务要协调控制流量、起限流作用;即应用可能一瞬间发海量消息、也可能不发消息、消息服务要控制这些消息、不会同一时刻发给监控服务(海量消息内存爆了);因此消息服务需要存储这些消息、让监控服务按照自己能力慢慢消费、起削峰限流作用;
引入消息服务衍生问题
- 分布式、微服务下是不允许存在单点故障的,需要保证消息服务高可用(搭建集群)
- 系统复杂度变更;
- 消息安全性问题;海量数据如何保存;如何不丢失;如何避免重复消息都等;
常见消息中间件有:RabbitMQ、RocketMQ、 Kafka;