RabbitMQ 定位:高性能异步组件
同步:即时实时的通讯方式(视频通话,一对一实时)
异步:非实时得到结果(文字聊天,一对多)
使用 mq 异步处理之前:
使用 mq 做异步处理:
举例:黑马商城余额支付
通过上述,可以发现,这种同步方式有一些缺点:
但是同步调用也有一些优势,比如时效性强,包括有些操作是必须同步调用的,比如上述的第二步,支付服务必须要等待用户服务完成工作,来判断余额扣减是否成功完成,否则如果支付失败,其他服务均无调用的必要性
异步调用基于消息通知的方式,通常三个角色:
异步调用的优势:
缺点:
MessageQueue,消息队列,即上述的 broker
Spring 官方支持:RabbitMQ
Kafka:适用于吞吐量高的系统,比如日志平台
最受欢迎:RabbitMQ
角色:
消息发送模型:
publisher 发送给 exchange,exchange 路由给 queue,通过队列被 consumer 消费
实际应用场景:
可能多个服务共用一个 mq,为了实现对不同服务对象的隔离,RabbitMQ 可以使用 virtualhost 进行隔离
需求:需求:在 RabbitMQ 的控制台完成下列操作:
hello.queue1
和hello.queue2
amq.fanout
交换机发送一条消息hello.queue1
和nello.queue2
实操步骤
第一步:安装并启动 rabbitmq
windows 安装 rabbitmq:https://blog.csdn.net/qq_41929714/article/details/146152629
第二步:使用管理员账户登录进入系统,创建两个队列:
第三步:找到交换机中的 amq.fanout,尝试使用 mq 管理平台中的测试功能发送一条消息:
报错了!消息发送,但是没有被路由!
别急别急,前边学习到,rabbitmq 的发送模式是,发送者将消息发送给交换机,交换机把消息路由到队列,也就是每一个角色之间要有关联才能成功运转,很明显刚才我们只顾着创建队列,发送消息,但是少了关联 exchange 和 queue 的步骤,导致发送的消息丢失了(见下图)!!!Damn!!!
如何绑定:
按照上边步骤把 hello.queue1 和 hello.queue2 都绑定 amq.fanout 交换机
第四步:重新发送消息,发送成功,并且消息已经进入队列
第五步:在管理平台尝试查看进入队列中的消息(并未消费),点击队列名称,查看消息
总结规律
通过上述举例,可以发现:
交换机可以配置绑定指定的队列
当绑定了队列,发送者像交换机发送一条消息,则该条消息会把这条消息路由到绑定的所有队列中
需求:在 RabbitMQ 的控制台完成下列操作:
上述已经提到 RabbitMQ 是可以通过 virtualhost 来实现数据的隔离的
实操演示
第一步:创建一个新用户(Tags 选择 Admin,赋予管理员角色):
第二步:退出并使用新建用户登录管理后台:hmall/123
新建的用户是没有访问虚拟主机的权限的,需要单独配置
此时可以重新进入队列列表,尝试查看队列中的消息,可以预期是无法查看的,因为存在有数据隔离:
此时进入 Admin/virtual hosts 创建一个新的虚拟主机来供新用户使用:
刷新页面,点击右上角的 virtual host 就可以看到新增的/hmall 虚拟主机了:
当切换为/hmall 虚拟主机,再分别查看交换机、队列、用户,可以发现交换机只展示了默认的交换机,队列为空(当前主机没有新建队列)、可以查看所有的用户