蓝因子 JMS 消息确认和事务

2025-02-25ASPCMS社区 - fjmyhfvclm

保证消息传送

保证消息传送有 3 个主要部分:消息自主性,存储并转发以及底层消息确认,下面具体看一下这些概念;

1. 消息自主性

消息是自包含的自主性实体,在设计分布式消息应用程序时,要将此作为头条法则;当 JMS 客户端发送一条消息时,它就完成了它的所有工作,一旦该数据被传送出去,它就被认为是” 安全的”,

而且不在受该客户端的控制,类似 JDBC 客户端和数据库直接的约定;

2. 保存并转发消息传送

可以将消息标记为持久化的,这样 JMS 服务器负责保存消息,以确保在提供者发生故障或消费客户端发生故障的情况下,消息可以恢复正常;消息可以集中存储或本地存储;

3. 消息确认

JMS 规定了多种确认模式,这些确认是保证消息传送的关键部分;服务器确认从 JMS 生产者接受消息,而 JMS 消费者确认从服务器接受消息;确认协议允许 JMS 提供者监测一条消息的整个过程,

以便了解是否成功的生产和消费了该消息;

消息确认

消息确认协议是保证消息传送的关键所在,JMS 主要定义了三种确认模式:auto_acknowledge,dups_ok_acknowledge 以及 client_acknowledge;

1.auto_acknowledge

auto_acknowledge 是 JMS 提供的自动确认模式,下面分别从生产者和消费者角度来分析,以下使用 ActiveMQ 来作为消息服务器;

1.1 生产者和消息服务器

生产者调用 send () 或者 publish () 方法发送消息,同时进行阻塞,直到从消息服务器接收到一个确认为止;底层确认对客户端编程模型来说是不可见的,如果在操作期间发生故障,就会抛出一个异常,同时认为该消息没有被传送;消息服务器接收到消息,如果是持久性消息就会持久化到磁盘,如果是非持久性消息就会存入内存,然后再通知生产者已经接收到消息;

上图中可能出现的异常

1.1.1. 发送消息失败

可能由于网络原因导致发送消息失败,服务器没有感知,需要生产者做好异常检测或者重发机制;

1.1.2. 持久化失败

生产者成功发送消息给服务器,服务器在持久化时失败,服务器会在通知的时候,把错误信息返回给生产者,需要生产者做好异常检测;

1.1.3. 服务器通知生产者失败

成功接收消息和持久化,在通知生产者时,出现网络异常导致失败,服务器会将此消息删除,生产者会从阻塞中返回并抛出异常;

1.2 消息服务器和消费者

消费者获取到消息之后,需要向服务器发送确认信息,如果服务器没有接收到确认信息,会认为该消息未被传送,会试图重新传送;如果接收到确认消息,此消息将会从持久化存储器中删除;

上图中可能出现的异常

1.2.1. 接收消息失败

对于 Queue 模型来说,是主动拉取消息,在没有成功拉取数据的情况下,服务器自然不会删除数据;对于 Topic 模型来说,消息服务器会推送给每个消费者一个消息的副本,如果是持久订阅者,一直到消息服务器接收到所有消息预定接收者的确认时,才会认为完成传送;如果是非持久订阅,就不会关心某一个接收者是否接收到消息;

1.2.2. 消费者通知服务器失败

消费者成功接收到消息,但是在处理完之后,通知服务器失败,导致服务器没有被删除,消息会被重发,消费者要做好幂等性处理;

1.2.3. 删除持久化失败

消费者成功接收到消息,服务器成功接收通知信息,在删除持久化数据时失败,导致数据没有被删除,消息会再次被消费,消费者要做好幂等性处理;

全部评论