Fair dispatch
1.发送端 int prefetchCount = 1; channel.basicQos(prefetchCount);
2.接收端 收动提交确认消息且 channel.basicQos(1);接收端与MQ的确认
消息应答(消费端向MQ应答)
1、boolean autoAck = true 自动确认模式,一旦rabbitmq将消息分发给消费者,就会从内存中删除。这种情况下,如果消费者down机就会出现数据丢失的情况。
2、Boolean autoAck = false 手动确认模式,如果有一个消费者挂掉,需要将这个消息发送给另外一个消费者处理,rabbitmq支持消息应答,消费者收到消息后处理完成可以手动应答给MQ,这是MQ就会从内存中删除这个消息。
3、消息应答默认是打开的
消息持久化
boolean durable = true
1、声明队列channel.queueDeclare(TASK_QUEUE_NAME, durable , false, false, null);
2、Rabbitmq不允许重新定义(不同参数)一个已经存在的队列
订阅模式(publish/subscribe)
1、一个生产者多个消费者
2、每个消费者都有一个子集的队列
3、生产者没有将消息直接发送给队列,而是发送给exchange(交换机、转发器)
4、每个队列都需要绑定到交换机上
5、生产者发送的消息经过交换机,然后在到达队列,实现一个消息被多个消费者消费
例子:注册->发邮件、发短信
在rabbitmq中只有队列有存储能力,因为队列没有绑定到交换机,所以交换机没有绑定队列之前发送数据,数据会丢失。
Exchange(交换机或转发器)
1、一方面接收生产者的消息,另一方面向队列推送消息
匿名转发
Fanout,不处理路由键
你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
发送消息,只需要指定交换机 route key可以为空
Direct,处理路由键
路由模式
1、exchange模式为direct,接收端需要绑定路由routingKey
Topic模式
Topic Exchange 转发消息主要是根据通配符。在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符要在这种路由模式和路由键之间匹配后交换机才能转发消息。
1、路由键必须是一串字符,用英文点号.隔开,比如说agreements.us,或者agreements.us.stockholm等
2、路由模式必须包含一个星号(*),主要用于匹配路由键指定位置的一个单词。井号(#)表示匹配一个或者多个单词
Rabbitmq的消息确认机制(事物+confirm,生产端)
AMQP事物机制
txSelect txConfirm txRollback 类似数据库中的事物模式
txSelect:用于将当前channel设置成transition模式
txConfirm:用于提交事物
txRollback:回滚事物
缺点:降低了rabbitmq的吞吐量,采用了AMQP协议
Confirm模式
Channel.confirmSelect()
1、普通的方式,没发送一条消息,调用waitForConfirms() 方法确认
2、批量的
3、异步回调
Channel对象提供的confirmListener()回调方法只包含deliveryTag(当前channel发出的消息序号),我们需要自己为每一个channel维护一个unconfirm的消息序号集合,没publish一条数据,集合中元素加1,没回调一次handleAck方法,unconfirm集合删掉相应的一条(multiple=false)或多条(multiple=true)记录,从程序运行效率上看,这个unconfirm集合最好采用有序集合SortedSet存储结构。
Confirm最大的好处是异步
1、定义RabbitMQ连接工厂
2、定义template
3、MQ的管理 rabbitmq:admin
4、声明队列
5、定义交换机
6、队列监听
7、消费者
RabbitMQ使用场景举例
DIH:data import handle