rabbitmq安装:很扯淡,erlang与rabbitmq的版本一定要对应。
https://www.jianshu.com/p/2f733ec8b117 安装按照这个来,我的erlang版本选择的是20.0这个
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-generic-unix-3.6.9.tar.xz
启动服务:rabbitmq-server -detached【 /usr/local/rabbitmq/sbin/rabbitmq-server -detached 】
重启服务:rabbitmq-server restart
关闭服务:rabbitmqctl stop
查看状态:rabbitmqctl status
列出角色:rabbitmqctl list_users
开启某个插件:rabbitmq-pluginsenable xxx
关闭某个插件:rabbitmq-pluginsdisablexxx
注意:重启服务器后生效。
现在用的springboot是2.0.3版本,如果使用的是2.3.0版本,下面回调函数配置:spring.rabbitmq.publisher-confirms-true 已过期。需要换成spring.rabbitmq.publisher-confirm-type=correlated
效果实验了一下,是一样的效果
rabbitmq的深入教学:
(1)Direct直连型的:就是一个队列对应一个交换机,没有匹配类型,队列要注入bean,交换机是Direct开头的,也要注入bean,绑定binding也要注入bean。
Direct开头的,就是直连型的。routing绑定键现在还不是关键。
注意事项:接收消息地方需要监听器,监听器上面是队列名称,一个监听器只能监听一个队列的消息。
(2)topic主题的:几个队列对应一个交换机,每个队列需要注入bean,交换机是Topic开头的,也要注入bean,每个队列都要绑定交换机,就等于有多少个队列,就要注入绑定多少次。
注意:这里就是一对多的情况,routing绑定键起作用了,因为队列都在一个交换机里面,所以根据routing绑定键可以实现一条消息被多个队列接收。
top.# top开头的routing,都会被该绑定键绑定的队列接收
当一个队列的绑定键为 "#"(井号) 的时候,这个队列将会无视消息的路由键,接收所有的消息。
当 * (星号) 和 # (井号) 这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为。
* (星号) 用来表示一个单词 (必须出现的)
# (井号) 用来表示任意数量(零个或多个)单词
(3)fanout扇形:同样道理,有几个队列就需要注入多少,交换机就是Fanout开头的,也要注入bean,每个队列绑定交换机也需要注入bean。
这种情况,就是生产者推送一条信息,只要绑定在扇形交换机上面的队列,都可以接收到。
(4)header交换机:取消routingkey绑定键,使用header里面的key-value形式匹配队列。
消息确认以及消息回调:这次是重点
生产者添加配置文件:
#确认消息已发送到交换机(Exchange)
spring.rabbitmq.publisher-confirms=true
#确认消息已发送到队列(Queue)
spring.rabbitmq.publisher-returns=true
配置好了之后,需要写回调函数:详情看代码,没啥难理解的
①消息推送到server,但是在server里找不到交换机 只会返回交换机的back
②消息推送到server,找到交换机了,但是没找到队列 两个都会返回
③消息推送到sever,交换机和队列啥都没找到 只会返回交换机的back
④消息推送成功 只会返回交换机的back
上面这种是自动,还有一种手动,后期在搞,只要保持略懂
rabbitmq的好处:
1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
如何保证RabbitMQ消息的顺序性?
答:单线程消费保证消息的顺序性;对消息进行编号,消费者处理消息是根据编号处理消息;
RabbitMQ 概念里的 channel、exchange 和 queue 是逻辑概念,还是对应着进程实体?分别起什么作用?
queue 具有自己的 erlang 进程;
exchange 内部实现为保存 binding 关系的查找表;
channel 是实际进行路由工作的实体,即负责按照 routing_key 将 message 投递给 queue 。
由 AMQP 协议描述可知,channel 是真实 TCP 连接之上的虚拟连接,所有 AMQP 命令都是通过 channel 发送的,且每一个 channel 有唯一的 ID。
一个 channel 只能被单独一个操作系统线程使用,故投递到特定 channel 上的 message 是有顺序的。但一个操作系统线程上允许使用多个 channel 。
rabbitmq的RPC回调模式:RPC模式还是要使用dubbo