为什么要用MQ?
解耦:在项目启动之初是很难预测未来会遇到什么困难的,消息中间件在处理过程中插入了一个隐含的,基于数据的接口层,两边都实现这个接口,这样就允许独立的修改或者扩展两边的处理过程,只要两边遵守相同的接口约束即可。
冗余(存储):在某些情况下处理数据的过程中会失败,消息中间件允许把数据持久化直到它们完全被处理。扩展性:消息中间件解耦了应用的过程,所以提供消息入队和处理的效率是很容易的,只需要增加处理流程就可以了。
削峰:在访问量剧增的情况下,但是应用仍然需要发挥作用,但是这样的突发流量并不常见。而使用消息中间件采用队列的形式可以减少突发访问压力,不会因为突发的超时负荷要求而崩溃。
可恢复性:当系统一部分组件失效时,不会影响到整个系统。消息中间件降低了进程间的耦合性,当一个处理消息的进程挂掉后,加入消息中间件的消息仍然可以在系统恢复后重新处理。
顺序保证:在大多数场景下,处理数据的顺序也很重要,大部分消息中间件支持一定的顺序性。
缓冲:消息中间件提供一定能力的缓冲数据作用,主要是用以消息的发布和订阅异步的进行通行,其运用了持久化于中间件中,对消息进行缓冲作用。
异步通信:通过把消息发送给消息中间件,消息中间件并不立即处理。
根据官网的解释
AMQP 0-9-1(Advanced Message Queuing Protocol)是一种消息传递协议且可编程,它支持符合标准的客户端请求程序与符合标准的消息中间件代理进行通信。AMQP的实体和路由规则都是自定义的,只是规定了queues、exchanges、两者之间的bindings关系以及订阅此queues等,所以这样的方式就会很自由的去发挥AMQP中的这些特性。
以下是AMQP的整体流程图:
- 启动RabbitMQ服务,并且启动Client与之建立Connection连接。
- 连接建立之后会根据每个Consumer建立Channel通道,用以Publisher和Consumer传送消息。
- 消息发布者Publisher将message发布至Exchange 。
- Exchange通过bindings的规则分别Routes至不同的Queue。
- AMQP的broker传递消息给与Queue关联的Consumers、或者Consumers可以根据不同需求主动去Exchange中拉取消息。