一.RabbitMQ简介
开发语言:Erlang – 面向并发的编程语言。
1、AMQP:
AMQP是消息队列的一个协议。
2、MQ的其他产品:
3、安装文档
二.搭建RabbitMQ环境
版本:推荐使用3.4.1版本。
1、安装
注意事项:
(1)推荐使用默认的安装路径;
(2)系统用户名必须是英文;
(3)计算机名必须是英文:
(4)系统的用户必须是管理员
如果安装失败的同学应该如何解决:
1.重装系统 -- 不推荐
(5)将RabbitMQ安装到linux虚拟机中:推荐
(6)使用别人安装好的RabbitMQ服务
a) 只要给你开通一个账户即可。
b) 使用公用的RabbitMQ服务,在192.168.0.47。
c) 推荐。
错误:
2、安装完成后操作
系统服务中有RabbitMQ服务,停止、启动、重启。
打开命令行工具:
如果找不到命令行工具:
启用管理插件:
查看管理页面:
通过默认账户 guest/guest 登录。如果能够登录,说明安装成功。
添加taotao用户:
管理界面中的功能:
三.5种队列
1、简单队列
图示:
P:消息的生产者
C:消息的消费者
红色:队列
生产者将消息发送到队列,消费者从队列中获取消息。
管理工具中查看消息
点击上面的队列名称,查询具体的队列中的信息:
消费者从队列中获取消息。
2、Work模式
图示:
一个生产者、2个消费者。
一个消息只能被一个消费者获取。
生产者:
向队列中发送50条消息。
测试:
测试结果:
1.消费者1和消费者2获取到的消息内容是不同的,同一个消息只能被一个消费者获取。
2.消费者1和消费者2获取到的消息的数量是相同的,一个是奇数一个是偶数。
其实,这样是不合理的,应该是消费者1要比消费者2获取到的消息多才对。
Work模式的“能者多劳”
测试:
消费者1比消费者2获取的消息更多。
消息的确认模式
消费者从队列中获取消息,服务端如何知道消息已经被消费呢?
模式1:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。
模式2:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。
手动模式:
自动模式:
3、订阅模式
图示:
解读:
(1)1个生产者,多个消费者;
(2)每一个消费者都有自己的一个队列;
(3)生产者没有将消息直接发送到队列,而是发送到了交换机;
(4)每个队列都要绑定到交换机;
(5)生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的;
消息的生产者
注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。
消费者1
消费者2
测试
测试结果:
同一个消息被多个消费者获取。
在管理工具中查看队列和交换机的绑定关系:
使用订阅模式能否实现商品数据的同步?
答案:可以的。
后台系统就是消息的生产者。
前台系统和搜索系统是消息的消费者。
后台系统将消息发送到交换机中,前台系统和搜索系统都创建自己的队列,然后将队列绑定到交换机,即可实现。
消息,新增商品、修改商品、删除商品。
前台系统:修改商品、删除商品。
搜索系统:新增商品、修改商品、删除商品。
所以使用订阅模式实现商品数据的同步并不合理。
4、路由模式
图示:
生产者
5、通配符模式
图示:
生产者。
四.持久化交换机和队列
持久化:将交换机或队列的数据保存到磁盘,服务器宕机或重启之后依然存在。
非持久化:将交换机或队列的数据保存到内存,服务器宕机或重启之后将不存在。
非持久化的性能高于持久化。
如何选择持久化?非持久化? -- 看需求。
1、队列和交换机的绑定关系
实现:
1.在配置文件中将队列和交换机完成绑定
2.可以在管理界面中完成绑定
a) 绑定关系如果发生变化,需要修改配置文件,并且服务需要重启
b) 管理更加灵活
c) 更容易对绑定关系的权限管理,流程管理
2、消息内容
方案:
1.将Item对象做json序列化发送
a) 数据大
b) 有些数据其他人是可能用不到的
2.发送商品的id、操作类型