勇者 2025-07-11 07:16 广东
结合部分场景探讨不同方式的优缺点。
二、CAP理论与BASE理论
三、一致性失效场景及其解决方案
1、调用写RPC
2、 消息发送
3、本地消息表
四、总结
💡CAP理论指出在分布式系统中,一致性(C)、可用性(A)和分区容错性(P)最多只能同时满足两个,而BASE理论则强调在无法保证强一致性的情况下,通过基本可用性、允许短暂中间状态等机制来实现最终一致性。
📢调用写RPC时,若出现成功或失败的情况,可采用重试机制,并结合幂等处理来确保数据一致性。对于RPC接口超时问题,应配置告警或抛出特定异常。
✉️消息发送方面,同步消息配合重试机制是常用的方式。对于一致性要求高的场景,RocketMQ事务消息可以确保消息与本地事务的原子性,但实现复杂且性能较低;事务事件+同步消息则是一种更优选择,能在事务提交后发送消息,且性能损失较小。
💾本地消息表方案通过将分布式处理事件以本地消息日志存储,异步重试,确保上下游一致性。虽然实现简单且可靠性高,但在高并发场景下可能出现数据积压和延迟问题。
勇者 2025-07-11 07:16 广东
结合部分场景探讨不同方式的优缺点。
二、CAP理论与BASE理论
三、一致性失效场景及其解决方案
1、调用写RPC
2、 消息发送
3、本地消息表
四、总结
商品在仓储系统(WMS)中上架,写入仓储数据库
仓储系统通知中央库存系统(SCI)添加可用库存
仓储系统通知交易该商品可以进行售卖
整个时序逻辑拆解到事务层面执行流程如下:public void upper(upperRequest request) {
// 1. 写入仓储数据库
UpperDo upperDo = buildUpperDo(request);
wmsService.upper(upperDo);
// 2. 调用rpc添加中央库存系统库存
SciAInventoryRequest sciInventoryRequest = buildSciAInventoryRequest(request);
sciRpcService.addInventory(sciInventoryRequest)
// 3. 发送商品可以售卖的消息
TradeMessageRequest tradeMessage = buildTradeMessageRequest(request);
sendMessageToDealings(tradeMessage);
// 4. 其他处理
recordLog(buildLogRequest(request))
return;
}
1)读RPC:当前数据结构不完整,需要通过其他服务补充数据,对其他服务无影响。
2)写RPC:当前业务操作、数据变更需要通知其他服务,对其他服务有影响。
同步消息+重试机制能尽可能的保证消息成功发送,但是在这种情况下仍可能出现一致性问题:消息成功发送,在提交事务之前,依然可能出现问题(第8步出现问题),导致事务回滚,但是下游的消息是无法回滚的。为此在RocketMQ中提供了事务消息作为一种解决方案。2)RocketMQ事务消息RocketMQ 的分布式事务消息功能,在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup");
producer.setRetryTimesWhenSendFailed(3); // 设置重试次数为 3 次
producer.start();
Message msg = new Message("TopicTest", "TagA", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.send(msg); // 同步发送
if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
log.info("Send Success: " + sendResult);
} else {
log.warn("Send Failed: " + sendResult);
}
上述流程在写完DB,调用写RPC之后,发布上架完成的事件并提交事务。upperFinishEventListener订阅上架完成的事件,并发送可以售卖的消息。通过这种方式可以在事务提交之后再发送消息。通过事务事件保证事务提交,通过重试机制和confirm机制确保生产者发送消息成功。public class wmsService {
private ApplicationEventPublisher eventPublisher;
public void upper(upperRequest request) {
// 1. 写入仓储数据库
UpperDo upperDo = buildUpperDo(request);
wmsService.upper(upperDo);
// 3. 发布上架事件
UpperFinishEvent upperFinishEvent = buildUpperFinishEvent(request)
eventPublisher.publishEvent(upperFinishEvent);
return;
}
}
public class upperFinishEventListener {
public void handleUpperFinishEvent(UpperFinishEvent event) {
// 处理事件
// 1. 调用rpc添加中央库存系统库存
SciAInventoryRequest sciInventoryRequest = buildSciAInventoryRequest(event);
sciRpcService.addInventory(sciInventoryRequest)
// 2. 发送商品可以售卖的消息
TradeMessageRequest tradeMessage = buildTradeMessageRequest(event);
sendMessageToDealings(tradeMessage);
// 2. 其他处理
recordLog(buildLogRequest(event))
}
}
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑