rabbitMq(持久化、集群、高可用、内存与磁盘管理)
RabbitMq
Rabbitmq如果有消费者集群的话,不会重复发送消息给消费者。
BasicQos 给集群中每台消费者推送消息的数量,提前预处理推送的机制,有助于提高处理效率,但是避免堆积大量的数据给消费者(10000条)
流程:
生产者 → →→
connection (很多channel)→→→
rabbitmq 里的虚拟主机(可以定义多个虚拟主机)中的交换机exchange(四种:fanout(全部分发)、direct(bindkey精确匹配)、topic(bindkey模糊匹配)、headers(通过设置指定属性匹配))→→→
Queue消息队列→→→
消费者
交换机:
不指定的话为默认交换机,默认交换机是通过指定queue来匹配的
Fanout 绑定的全部队列都分发
Direct 可以设置bindkey (决定什么样的数据可以分发到队列中)bindKey和消息里面的ruteKey来匹配(精确匹配)
Topic 通过设置的bindkey和rutekey模糊匹配(模糊匹配 .order.)
Headers 通过设置header头匹配
Rabbit集群:(网络互通,cookie文件相同)
消息发送过来集群之间进行元数据消息的同步,实现高可用的方式→可以通过镜像队列模式同步消息(有不同的策略默认为all,all为全部同步或者exactly为同步部分机器或者nodes为指定节点)
Feaderation/shouvr(主动拉取) 解决集群中网络延迟或者rabbitmq版本不一致的问题,可以消息同步
镜像队列模式与feaderation对比 有一致性的区别
持久化:写入内存(加快处理速度)与磁盘
队列持久化:在队列定义的时候定义是否持久化,通过定义durable为true实现
代码实现:
channel.queueDeclare(“queue1”,true,false,false,null)
消息持久化:通过发送的消息属性deliveryMode设置,发送消息时通过basicPublish的参数传入
代码实现:
channel.basicPublis(“”,”queue1”,MessageProperties.PERSISTENNT_TEXT_PLAIN,presistent_test_messsage”.getBytes())
交换器持久化:通过设置durable为true实现
代码实现:
Exchange.DeclarOk excchaneDeclare(String exchane,String type,boolean durable)trhows Exception;
内存与磁盘管理:.
内存:
内存阈值(默认0.4,不建议超过0.7):当内存使用超过40%的时候会产生警告并阻塞所有生产者链接,
临时调整可通过命令调整 ,重启后会失效,可以通过改配置文件生效,但是需要重启才能生效,有相对值与绝对值两种配置方式
命令:
rabbitmqctl set_vm_memory_high_watermark absolute
最大内存:内存不够用会阻塞
内存换页阈值(默认50%大于1的话可禁用):目前内存中的消息放入磁盘中,已经放入磁盘的持久化消息不会再次放入
磁盘:
剩余空间低于阈值的时候会阻塞生产者,默认阈值是50M,一般是将磁盘阈值设置为与操作系统所显示内存大小一致
可以通过命令调整磁盘阈值大小(等同内存)