RabbitMq整体简介(包括工作模式、消息应答、事务机制)
一、优势与特性
RabbitMq的应用场景比较广泛,包括日志管理、应用解耦、流量削峰、异步处理。
其中都是利用了RabbitMq的异步性,响应机制等特性。
rabbitmq采用的amqp协议,该协议有spring的集成。
二、元素介绍
1、virtual host:为虚拟主机,可以理解为数据库,在定义的库中进行表的创建,进行后续操作,是基础性元素
2、channel:管道,是声明交换机、声明队列、发布消息、消息响应、交换机与队列绑定的载体
3、exchange:交换机,用于传递消息,队列可以绑定到交换机上从而获取转发的消息
4、queue:队列,消息的载体,可以持久化,可以通过不同的响应机制进行状态的标识及补偿消费
5、provider:生产者,消息的提供者,产生消息
6、consumer:消费者,消息的终端,进行消费的最后处理
三、工作模式
1、simple
简单模式,顾名思义,很简单,一个provider,一个queue,一个消费者



2、work模式
2.1 轮询模式(round)
1个provider,1个队列,多个消费者,消息是一个消费者处理一条,权重相同,你一个我一个



2.2 公平模式(fair)
根据消费者的消费能力,消费完成后,就发下一条消息,多劳多得,但是需要告知mq服务器消费完成,所以要开启消息应答,这里开启自动应答模式



3、订阅模式
订阅模式中,出现了exchange交换机,在消息由生产者发送到消费者的过程中,增加了交换机,可以理解为路由器,作用是判断哪个队列满足条件然后发到哪个队列上
3.1 fanout
只要绑定到交换机上的队列都进行发放消息,强调雨露均沾



3.2 direct
需要有rountingKey进行匹配,exchange会定义一个rountingKey,同样消费者也需要定义一个,只有二者相同,才会消费



3.3 topic
加入了通配符的rounting绑定,其中*为代替.之间的内容,#代表所有内容



四、事务机制
生产者发出消息后,需要确认mq服务器是否有收到该消息,两种方式实现
4.1 AMQP实现事务机制
txSelect:用户将当前channel设置成transation模式
txCommit:用于事务提交
txRollback:用于事务回滚
4.2 confirm模式
通过指派唯一的ID进行发送及监听回传
channel.confirmSelect()进行开启
五、消息应答
消费者应答默认为自动应答,channel.basicConsume(queue,autoBack,consumer);其中第二个参数即为是否自动应答,true为自动应答,即只要有消息调用了handleDelivery方法,即告知mq服务器正确消费,服务器将删除该条消息。
所以自动应答的问题就在于不清楚是否有正确消费该消息,容易造成消息的丢失。
所以引入手动应带模式,将上述参数设为false,然后通过channel进行应答
channel.basicAck(envelope.getDeliveryTag(),false,false); 即反馈成功,消息成功消费
channel.basicNack(envelope.getDeliveryTag(),false,false); 即反馈失败,消息失败,将重新发到其他队列