携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
最近刚进组,都是在熟悉组内这个系统的大致功能,用到的技术,组长发了几个资料在看。昨天还开了个会,给我大致过了一下,其中重点谈到了 Rabbit MQ,恰好之前自己并不是很了解,趁机熟悉一下。
什么是 Rabbit MQ?
Rabbit MQ 是一个由 erlang 开发的 AMQP(Advanced Message Queue,高级消息队列协议)的开源实现。它是一个消息代理,接受和转发消息,能够实现异步消息处理。可以将它想象成一个邮局,寄件人把要寄送的东西放到邮局内,邮局会想办法将物品寄到收件人手里。
消息和消息队列
消息(Message),是指在应用间传送的数据。它可能像只包含文本字符串这样,很简单;也可能像包含嵌入对象这样,比较复杂。
消息队列(Message Queue),是一种应用之间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只需把消息发布到 MQ 中,不用管谁来取;消息的消费者只管从 MQ 中取消息,不用管是谁发布的。
Rabbit MQ 的优点
- 异步处理消息;
- 业务解耦:如果下单操作包含扣减库存、生成订单、发红包、发短信,那么就会将其中 扣减库存、生成订单 作为主流程,然后通过 MQ 消息队列完成通知、发红包、发短信等。
- 错峰流控:通知量、消息量、订单量大等情况采用 MQ 消息队列机制;
- 灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息。对于典型的路由功能,Rabbit MQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange。
Exchange 的几种类型(用到的)
Fanout(订阅模式/广播模式)
Fanout 交换机会把发送到该交换机的 所有 消息路由到 所有 与该交换机绑定的消息队列中。订阅模式与 Binding Key、Routing Key无关,交换机将接收到的消息发布给 有绑定关系 的 所有 消息队列(不考虑 Binding Key 和 Routing Key)。类似子网广播,子网内的每台主机都获得了一份复制的消息。Fanout 交换机转发消息是最快的。
Direct(路由模式)
Direct 交换机需要消息的 Routing Key 跟 Exchange 与 Queue 之间的 Binding Key 完全匹配,如果匹配成功,将消息分发到该 Queue。只有当 Routing Key 和 Binding Key 完全匹配 的时候,消息队列才可以获取消息。路由模式是 Exchange 的默认模式。Rabbit MQ 默认提供了一个 Exchange,名字是空字符串,类型是 Direct,绑定到所有的 Queue(每一个 Queue 和这个无名 Exchange 之间的 Binding Key 是 Binding Key 是 Queue 的名字)。有时候我们感觉不需要交换机也可以发送和接收消息,其实是使用了 Rabbit MQ 默认提供的 Exchange。
Topic(通配符模式)
Topic 交换机按照正则表达式模糊匹配:用消息的 Routing Key 跟 Exchange 与 Queue 之间的 Binding Key 进行模糊匹配,如果匹配成功,将消息分发到该 Queue。Routing Key 是一个由句点符 "." 分隔的字符串(我们将被句点符 "." 分隔开的每一段独立的字符串称为一个单词)。Binding Key 与 Routing Key 一样也是句点符 "." 分隔的字符串。Binding Key 中可以存在两种特殊字符 "" 和 "#",用于做模糊匹配。其中 "" 用于匹配一个单词,"#" 用于匹配多个单词(也可以是零个或一个)。
如下面这个场景,就是 Topic 交换机:
大致总结了一下 Rabbit MQ 相关内容,都是“现学现卖”,做一个汇总帮助自己理解。
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!