消息队列客户端开发向导(基于 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

posted on 2019-12-30 21:10  Lemo_wd  阅读(368)  评论(0编辑  收藏  举报

导航