消息队列客户端开发向导(基于 Spring 的 amqp 实现)
上篇文章 RabbitMQ 入门 通过 4个基本实例展示了 RabbitMQ 的基本用法。下面,继续介绍相关的 API
1.声明交换器
几个常见交换器都是实现的 Exchange,该接口有几个重要属性
//交换器名称 String name; //交换器类型 String type; //是否可持久化(将交换器存盘) boolean durable; //自动删除(绑定后再解绑会自动删除) boolean autoDelete; //开启延迟队列(需要 broker 插件) boolean delayed; //内置交换器,只用于交换器到交换器的绑定 boolean internal;
2.声明队列
队列的实现类为 Queue,相关属性如下
//队列名称 String name; //持久化 boolean durable; //排它队列 boolean exclusive; //自动删除(消费者全部解绑后) boolean autoDelete;
注:排它性队列
1.只对首次声明它的连接(Connection)可见
2.会在其连接断开的时候自动删除。
3.队列(交换器)绑定
交换器之间绑定
BindingBuilder.bind(topicExchange1).to(topicExchange2).with("routingKey");
队列与交换器绑定
BindingBuilder.bind(topicQueue1).to(topicExchange).with("*.important.*")
4.发送消息
convertAndSend(String exchange, String routingKey, final Object object)
5.消费消息
公式:传输时间/处理时间 = 预取数 (104ms/4ms = 26)
结论:当预取数变大,一直在本地缓存的BlockingQueue里呆太久,这样消息在客户端的延迟就大大增加;而对于多个consumer的情况,则会分配不均匀,导致有些consumer一直在忙,有些则非常空闲。
如果预取数变小,可能会在处理完一条消息后,BlockingQueue为空,因为新的消息还未来得及到达,造成客户端空闲。
举个例子:
原料厂有一批钻石原材料,需要送到加工厂进行加工。原料厂送货到加工厂的时间为 10天,在加工厂待1天,返回原厂 9天。总共一个来回是 20天。假设加工厂加工一颗钻石需要一天,20天可以加工20颗钻石。
如果原料厂一次运送 20颗钻石,则加工厂一直在工作,效率是 100%;如果一次只运送 19 颗钻石,则加工厂有一天是空闲的,效率是 95%。如果一次运送 30 颗钻石,则加工厂每次会有 10颗左右的库存,这样的话,库存里的钻石必须等待很久才能被加工。
PS:配置 concurreny/max-concurreny/prefetch 并观察消费者的利用率是否达到 100%
233
https://www.jianshu.com/p/4d043d3045ca
https://www.jianshu.com/p/71505eb2e4b1