一、Rabbit作用
- 程序解耦,如一时间需要重复写入大量的数据时
- 当RabbitMQ的负载增加时,由于它的消息是循环给消费者处理的有一定的负载均衡的作用
二、发后即忘模型
消息通信领域主要适用的模型之一发后即忘模型是。我们只需关心这些任务将会完成,而不需关心是否实时完成。
1、发送警告
2、批处理: 上传图片会有多个业务,如记录日志,增加积分等可以通过famous 交换器:会将消息匹配到所有附加在此交换器上的队列 来广播你成功上传的任务从而触发后面的任务。
三、集群
RabbitMq会始终记录以下四种类型的内部元数据
- 队列元数据:队列名称和它们的属性(是否可持久化,是否自动删除?)
- 交换器元数据:交换器名称、类型和属性(可持久化)
- 绑定元数据 :一张简单的表格展示了如何将消息路由到队列
- vhost元数据:为vhost内的队列、交换器和绑定提供明湖曾空间和安全属性
1、集群中的队列
集群中单节点Rabbit的队列保存有自己的队列信息和队列绑定关系,而其他节点只有该队列的元数据(即队例的名称和属性),不会保存队列的内容和绑定关系。原因同步复制开销太大^_^。
注意:
问题一、当Rabbit重启其队列的绑定关系也会销毁,消息被销毁
解决方式:在开始时设置队列持久化。
2、集群中的交换器
交换器只是逻辑上存在的,起到路由的用相当于一张记录了队列信息的查询表,获得信道的消息后再这张表中通过不同方式进行匹配绑定。
注意:
问题一、在路由绑定之前发生了消息丢失怎么办勒?
解决:1、使用AMQP事务。 2、返回确认消息,来记录连接中断时尚未被确认的信息。 这两种方法来确认消息无法路由的到目标队列的情况。当在集群中完全复制结合,保证路由成功性从而不会丢失一条信息。
3、是内存节点还是磁盘节点
每个RabbitMQ节点,不管是单一节点系统或者是集群,要么是内存节点,要么是磁盘节点。
- 内存节点将所有的队列、交换器、绑定、用户、权限和vhost元数据都仅存储在内存中
- 磁盘节店则将元数据存储在磁盘中
单节点系统只允许磁盘类型的节点,否则每次你重启所有的配置信息都会丢失。在集群中也可以选择配置部分节点为内存节点,使得消息流动的性能更好
说明:集群中要设置内存节点的原因,在集群中声明交换器、队列或绑定的时候所有集群节点都要同步其元数据。对于磁盘来说就是大量的磁盘操作,对于内存来就是变更写入内存。通常来说集群中至少有一个节点是写入磁盘的方式其他节点宕机导致元数据不能恢复。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。