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