AMQP协议
支持一对多和一对一的通信.IM协议只能一对一的通信.
生产者与消费者
-
生产者创建消息
信息包含两部分,有效载荷(传输的内容)和标签(确认谁接受改消息内容).
消息流
- 消费者接收消息
消费者连接到代理服务器,订阅队列queue(具名邮箱)上,每当有消息到达,rabbit将消息发送给订阅/监听的消费者.消费者只能获取到有效载荷,并不知道是谁发送给它的. -
信道(channel)
解决频繁的创建TCP连接造成的性能瓶颈问题
信道
队列
AMQP的消息路由分为:交换器,队列和绑定三部分.生产者把消息发布到交换器上,消息最终到达队列,并被消费者接受.绑定决定了消息如何从路由器路由到特定的队列.

- 两种方式从队列中获取消息
1.通过AMQP的basic.consume命令订阅.(持续消费)
2.AMQP的basic.get命令(获取单条信息) - 消费者确认消息的两种方式
1.通过AMQP的basic.ack命令
2.订阅队列的时候将auto_ack设置为true
注:如果应用程序有bug而忘记确认消息,rabbit将不会给该消费者发送更多消息. - 如何拒绝而不是确认
1.将消费者从rabbit服务器上断开
2.AMQP的basic.reject.如果将reject的requeue参数设置为true的话,rabbit会将消息分发给下一个订阅者,或者会将消息从队列中移除.
交换器和绑定
四中交换器:direct,fanout,topic,headers(基本不用了)
-
direct
如果路由键匹配的话,消息就会被投递到对应的队列.
direct交换器信息流
-
fanout
将消息投递到所有附加在此交换器的队列上
fanout交换器消息流
-
topic
不同源头的消息到达同一个源头
topic交换器消息流
多租户模式:虚拟主机和隔离
- 好处
既能将众多用户隔离开来,又可以避免队列和交换器的命名冲突,便于迁移. - 创建
通过RabbitMQ安装路径下的./sbin/目录中的rabbitmqctl工具创建.
rabbitmqctl add_vhost[vhost_name] -- 创建vhost
rabbitmqctl delete_vhost[vhost_name] -- 删除vhost
rabbitmqctl list_vhosts -- 查询运行的vhost
持久化
默认情况下,重启rabbit服务器队列和交换器都消息.将默认属性durable改为true就不需要重新创建队列和交换器了.
消息持久化条件:
- 投递模式选项置为2(持久)
- 发送到持久化的交换器
- 到达持久化的队列
这样就可以写入到磁盘上的一个持久化日志文件.当一条消息消费了,RabbitMQ会把这条日志标志为待垃圾回收. - 权衡取舍
持久化会影响消息的处理量.如果要单台RabbitMQ每秒处理100000条信息并持久化,就需要选用其他的方式来处理.
事务
填补消息提交到磁盘最后的差距.
- 问题
降低2-10倍的消息吞吐量,而且会使生产者程序产生同步.
confirm模式
所有的信道发布的消息都会指派唯一的ID号(从1开始).

网友评论