消息可靠性

本文详细探讨了消息传递的可靠性,包括持久性、事务和签收三个方面。持久性确保消息在服务器宕机后仍能保留,事务则保证消息在正确提交后才被消费,签收控制消息确认的方式。点对点模型基于队列,强调消息的异步传输和可靠性,非持久订阅可能导致消息丢失,而持久订阅能恢复未签收的消息。此外,还介绍了主题订阅发布模型,用于消息的广播式传递。
摘要由CSDN通过智能技术生成

一.消息可靠性的三个方面

1.PERSISTENT:持久性

(1)参数设置说明

(1.1)非持久化:当服务器宕机,消息不存在。
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
(1.2)持久化:当服务器宕机,消息依然存在。
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); 
(1.3)默认策略【持久】

持久化消息,这是队列的默认传送模式,次模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。

可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。

(2)持久的Queue

(2.1)队列的默认持久化

持久化消息,这是队列的默认传送模式,次模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。

可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。

图片

(3)持久的Topic

(3.1)消费者类

图片

(3.2)消息发布类

图片

(3.3)验证消息订阅者状态

图片

(3.4)主题的持久化总结

1.一定要先运行一次消费者,等于向MQ注册,类似我订阅了这个主题。

2.然后再运行生产者发送消息。

3.此时无论消费者是否在线,都会接收到。不在线的话,下次连接的时候,会把没有收到的消息都接收下来。

2.transaction:事务

(1)事务的值

(1-1)true

先执行send再执行commit,消息才被真正的提交到队列中。

消息需要批量发送,需要缓冲区处理

(1-2)false

只要执行send,就进入到队列中。

关闭事务,那第2个签收参数的设置需要有效。

(2)事务的演示

(2-1)消息生产者类

图片

(2-2)消息生产类的业务逻辑写法
try{
  //ok
  session.commit();
}catch(Exception e){
  //error
  session.rollback();
}finally{
  session.close();
}
(2-3)消息消费类

图片

(2-4)消息消费类的业务逻辑写法
 try{
  //ok
  session.commit();
}catch(Exception e){
  //error
  session.rollback();
}finally{
  session.close();
}
(2-5)事务的注意事项

消息生产者类和消费者类都需要开启事务时设置事务提交和事务回滚。

其中消息消费者类必须要设置事务提交,不然消息会重复消费。

3.Acknowledge:签收

(1)非事务

(1-1)自动签收(默认)【常用】
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

图片

(1-2)手动签收【常用】

第一步:Session.CLIENT_ACKNOWLEDGE(需要在消费者类手动,需要在发布者类自动)

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);    //手动提交

图片

第二步:客户端(消费者类)调用acknowledge方法手动签收

//6.2 手动签收
textMessage.acknowledge();
(1-3)允许重复消息
Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);  //允许重复消息

图片

(2)事务

(2-1)自动签收(默认)【常用】

图片

图片

(2-2)手动签收【常用】

图片

图片

(2-3)允许重复消息

图片

(2-4)总结

事务的管理级别大于签收,所以如果手动签收textMessage.acknowledge();,但没有事务提交,一样会产生重复消费消息。

不管是自动签收还是手动签收,只要事务提交则自动签收。

4.签收和事务的使用方式

事务偏生产者,签收偏消费者。

5.签收和事务的关系

(1)在事务性会话中,当一个事务被成功提交则消息被自动签收。如果事务回滚,则消息会被再次传送。

(2)非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)

二.点对点模型的总结

点对点模型是基于队列的,生产者发消息到队列,消费者从队列接受消息,队列的存在使得消息的异步传输成为可能。

1.如果在Session关闭时有部分消息已被收到但还没有被签收(acknowledged),那当消费者下次连接到相同的队列时,这些消息还会被再次接收。

2.队列可以长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。

三.订阅发布模型的总结【主题】

1.作用

JMS Pub/Sub模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作topic。

主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。

主题使得消息订阅者和消息发布者保持相互独立,不需要解除即可保证消息的传送。

2.非持久化订阅

非持久订阅只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。

如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到。

一句话:先要订阅注册才能接受到发布,只给订阅者发布消息。

3.持久订阅

客户端首先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户再次连接到MQ时会根据消费者的ID得到所有当自己处于离线时发送到主题的消息。

非持久订阅状态下,不能恢复或重新派送一个未签收的消息。

持久订阅才能恢复或重新派送一个未签收的消息。

4.用哪个

当全部消息必须被接收,则用持久订阅。当丢失消息能够被容忍,则用非持久订阅。

四.源码

demo02.rar

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值