[TOC]
在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈。柔性事务有两个特性:基本可用和柔性状态。所谓基本可用是指分布式系统出现故障的时候允许损失一部分的可用性。柔性状态是指允许系统存在中间状态,这个中间状态不会影响系统整体的可用性,比如数据库读写分离的主从同步延迟等。柔性事务的一致性指的是最终一致性。
消息中间件在分布式系统中的核心作用就是异步通讯、应用解耦和并发缓冲(也叫作流量削峰)。在分布式环境下,需要通过网络进行通讯,就引入了数据传输的不确定性,也就是CAP理论中的分区容错性。
消息发送一致性是指产生消息的业务动作与消息发送一致,也就是说如果业务操作成功,那么由这个业务操作所产生的消息一定要发送出去,否则就丢失。
处理方式一
public void completeOrderService() {
// 处理订单
order.process();
// 发送会计原始凭证消息
pipe.sendAccountingVouchetMessage();
}
在上面的情况中,如果业务操作成功,执行的消息发送之前应用发生故障,消息发送不出去,导致消息丢失,将会产生订单系统与会计系统的数据不一致。如果消息系统或者网络异常,也会导致消息发送不出去,也会造成数据不一致。
处理方式二
public void completeOrderService() {
// 发送会计原始凭证消息
pipe.sendAccountingVouchetMessage();
// 处理订单
order.process();
}
如果将上面的两个操作调换一下顺序,这种情况就会更加不可控了,消息发出去了业务订单可能会失败,会造成订单系统与业务系统的数据不一致。那么JMS标准中的XA协议是否可以保障发送的一致性?
JMS协议标准的API中,有很多以XA开头的接口,其实就是前面讲到的支持XA协议(基于两阶段提交协议)的全局事务型接口。
XAConnection.class
XAConnectionFactory.class
XAQueueConnection.class
XAQueueConnectionFactory.class
XASession.class
XATopicConnection.class
XATopicConnectionFactory.class
XATopicSession.class
但是在上面的处理流程中,任何一个环节都有可能出现问题。
对于未确认的消息,采用按规则重新投递的方式进行处理。对于以上流程,消息重复发送会导致业务处理接口出现重复调用的问题。消息消费过程中消息重复发送的主要原因就是消费者成功接收处理完消息后,消息中间件没有及时更新投递状态导致的。如果允许消息重复发送,那么消费方应该实现业务接口的幂等性设计。
示例消息数据表:
名称 | 数据类型 | 允许空 | 默认值 | 属性 | 释义 |
---|---|---|---|---|---|
uuid | varchar(50) | No | — | unique | UUID |
version | int(11) | No | 0 | — | 版本号 |
editer | varchar(100) | Yes | NULL | — | 修改者 |
creater | varchar(100) | Yes | NULL | — | 创建者 |
edit_time | datetime | Yes | 0000-00-00 00:00:00 | — | 最后修改时间 |
create_time | datetime | No | 0000-00-00 00:00:00 | — | 创建时间 |
msg_id | varchar(50) | No | — | — | 消息ID |
msg_body | longtext | No | — | — | 消息内容 |
msg_date_type | varchar(50) | Yes | — | — | 消息数据类型 |
consumer_queue | varchar(100) | No | — | — | 消费队列 |
send_times | int(6) | No | 0 | — | 消息重发次数 |
is_dead | varchar(20) | No | — | — | 是否死亡 |
status | varchar(20) | No | — | — | 状态 |
remark | varchar(200) | Yes | — | — | 备注 |
field0 | varchar(200) | Yes | — | — | 扩展字段0 |
field1 | varchar(200) | Yes | — | — | 扩展字段1 |
field2 | varchar(200) | Yes | — | — | 扩展字段2 |
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。