体育网站的制作哪里可以做软件网站模板

张小明 2025/12/31 1:55:47
体育网站的制作哪里可以做,软件网站模板,仿站网站,模板网站修改某电商平台在 “会员积分兑换商品” 业务中出现严重数据不一致问题#xff1a;用户积分成功扣减#xff08;积分服务#xff09;#xff0c;但商品库存未同步减少#xff08;库存服务#xff09;#xff0c;导致用户 “花了积分却没拿到商品”#xff0c;客服投诉量激增…某电商平台在 “会员积分兑换商品” 业务中出现严重数据不一致问题用户积分成功扣减积分服务但商品库存未同步减少库存服务导致用户 “花了积分却没拿到商品”客服投诉量激增。事后排查发现由于库存服务数据库临时宕机积分扣减后库存更新失败但积分服务已提交本地事务无法回滚最终造成跨服务数据不一致。这正是微服务架构下分布式事务的典型痛点本地事务独立提交 / 回滚、跨服务数据一致性难保障、故障后恢复机制缺失。本文将以 Seata、Saga 等框架为核心结合实际业务场景详解 “AT、TCC、Saga、TXC” 四种分布式事务模式的实现方案、适用场景与故障处理策略帮助团队在性能与一致性之间找到最佳平衡。一、分布式事务的核心痛点与一致性需求1. 微服务架构下的事务挑战在单体架构中所有业务操作都在同一数据库内可通过 ACID 事务原子性、一致性、隔离性、持久性保障数据一致性但微服务拆分后业务操作需跨多个服务如 “下单” 涉及订单、库存、支付服务和多个数据库传统本地事务机制完全失效主要痛点体现在事务边界跨服务一个业务流程如 “积分兑换商品”涉及积分服务扣减积分、库存服务减少库存、订单服务创建兑换订单每个服务有独立数据库本地事务仅能控制自身数据无法联动其他服务网络不可靠性服务间调用依赖网络传输可能出现 “调用超时”“网络中断” 等问题如积分服务调用库存服务时网络卡顿导致部分服务执行成功、部分失败数据不一致服务故障不可预测服务或数据库可能突发宕机如库存服务数据库崩溃若此时已有部分服务完成本地事务提交如积分已扣减故障恢复后无法回滚已提交的操作导致数据永久不一致性能与一致性冲突若为追求强一致性而采用 “全链路锁定” 机制如分布式锁会导致服务并发能力急剧下降如 QPS 从 1000 降至 100无法满足高并发场景如秒杀、大促需求故障恢复复杂当事务执行失败时如部分服务操作失败需手动排查每个服务的执行状态如积分是否扣减、库存是否更新再通过接口或脚本手动恢复数据耗时且易出错如漏恢复、重复恢复。支付退款业务的事务困境用户发起退款申请后退款流程需调用支付服务发起退款、订单服务更新订单状态为 “已退款”、财务服务记录退款流水。某次支付服务退款成功但订单服务因 JVM 内存溢出未更新状态导致订单显示 “未退款” 而用户已收到退款财务流水也未记录后续对账时发现大量账实不符。2. 分布式事务的一致性需求分级不同业务场景对数据一致性的要求不同盲目追求强一致性会牺牲性能需根据业务重要性分级选择强一致性Linearizability事务执行后所有服务的数据立即保持一致且所有后续访问都能看到事务执行的结果如银行转账A 账户扣款成功B 账户必须同时到账适用场景金融转账、支付对账等核心资金场景最终一致性Eventual Consistency事务执行后短期内可能存在数据不一致但通过补偿机制如重试、回滚最终所有服务的数据会达到一致状态如电商订单下单后 10 秒内库存服务与订单服务数据可能不同步但 1 分钟后会一致适用场景商品库存扣减、积分兑换、物流状态更新等非实时资金场景弱一致性Weak Consistency事务执行后数据一致性没有时间保证甚至可能永远不一致需人工干预适用场景非核心数据统计如商品浏览量计数偶尔少算 1-2 次不影响业务3. 主流分布式事务模式对比不同分布式事务模式在一致性、性能、适用场景上差异显著需根据业务需求选择事务模式核心原理一致性级别性能表现适用场景典型框架 / 工具AT 模式Automatic Transaction基于两阶段提交2PC自动生成 undo/redo 日志支持自动回滚与提交最终一致性接近强一致中有锁开销无侵入式开发、业务逻辑简单如单表增删改、Java 微服务SeataTCC 模式Try-Confirm-Cancel拆分为 Try资源检查与预留、Confirm确认执行、Cancel取消释放三阶段手动实现业务逻辑强一致性 / 最终一致性可控制高无锁纯业务逻辑业务逻辑复杂如多表操作、高并发场景如秒杀Seata、HmilySaga 模式基于状态机将长事务拆分为多个短本地事务每个事务执行后记录状态失败时调用补偿事务回滚最终一致性高无锁异步执行长事务场景如订单履约下单→支付→发货→确认收货、跨语言微服务Seata、Axon、Apache CamelTXC 模式Transaction Cross-chain基于本地消息表事务执行时先写消息表再调用下游服务失败时通过消息表重试最终一致性高异步无锁非实时依赖场景如退款通知、日志同步、高可用需求场景RocketMQ 事务消息、本地消息表S2F 模式Seata for Fescar基于 AT 模式优化支持多数据源、微服务跨库事务简化配置最终一致性中高多数据库、复杂服务依赖的 Java 微服务Seata 1.6二、Seata AT 模式实战无侵入式分布式事务Seata 是 Alibaba 开源的分布式事务框架AT 模式是其核心模式支持无侵入式开发无需修改业务代码通过 “两阶段提交 undo/redo 日志” 实现最终一致性适合大多数 Java 微服务场景。1. AT 模式核心原理Seata AT 模式将分布式事务拆分为 “全局事务” 和 “分支事务”全局事务整个分布式事务的入口如 “下单” 事务由事务协调器TC管理分支事务每个服务的本地事务如订单服务的 “创建订单”、库存服务的 “扣减库存”由资源管理器RM管理核心流程两阶段第一阶段Prepare全局事务发起者如订单服务向 TC 申请全局事务 IDXID订单服务执行本地事务创建订单RM 自动生成 undo 日志记录事务前数据状态用于回滚和 redo 日志记录事务后数据状态用于提交本地事务暂不提交订单服务调用库存服务传递 XID库存服务执行本地事务扣减库存同样生成 undo/redo 日志暂不提交所有分支事务执行完成后向 TC 汇报执行状态成功 / 失败第二阶段Commit/Rollback若所有分支事务均成功TC 通知所有 RM 提交本地事务RM 删除 undo 日志若任一分支事务失败TC 通知所有 RM 回滚本地事务RM 通过 undo 日志恢复数据到事务前状态2. 环境准备与部署2.1 组件版本选择Seata Server1.8.0稳定版微服务框架Spring Cloud Alibaba 2022.0.0.0数据库MySQL 8.0支持 InnoDB 引擎需开启事务日志注册中心Nacos 2.2.3Seata Server 与微服务需注册到同一 Nacos2.2 部署 Seata Server事务协调器 TC下载 Seata Server从 Seata 官网https://seata.io/zh-cn/blog/download.html下载 1.8.0 版本压缩包解压后进入conf目录配置 Seata Server修改application.yml配置 Nacos 注册中心、数据库存储用于存储全局事务状态server:port: 7091 # Seata Server端口spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataseata:config:type: nacos # 配置中心类型nacos:server-addr: 192.168.1.100:8848 # Nacos地址group: SEATA_GROUP # 配置分组namespace: # Nacos命名空间可选username: nacospassword: nacosregistry:type: nacos # 注册中心类型nacos:application: seata-serverserver-addr: 192.168.1.100:8848group: SEATA_GROUPnamespace:username: nacospassword: nacosstore:mode: db # 存储模式db/file/redis推荐dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.1.101:3306/seata?useUnicodetruerewriteBatchedStatementstrueuser: rootpassword: 123456min-conn: 5max-conn: 100global-table: global_table # 全局事务表branch-table: branch_table # 分支事务表lock-table: lock_table # 全局锁表distributed-lock-table: distributed_lockquery-limit: 100初始化 Seata 数据库在 MySQL 中创建seata数据库执行conf/db/schema-mysql.sql脚本创建global_table、branch_table、lock_table等核心表启动 Seata Server执行bin/seata-server.shLinux或bin/seata-server.batWindows启动后在 Nacos 控制台可看到seata-server服务已注册2.3 微服务集成 Seata AT 模式以 “订单服务” 和 “库存服务” 为例集成 Seata 实现 “下单扣库存” 的分布式事务2.3.1 数据库准备资源管理器 RM在订单服务数据库order_db和库存服务数据库inventory_db中分别创建 Seata 所需的undo_log表用于存储 undo 日志执行以下 SQLCREATE TABLE undo_log (id bigint NOT NULL AUTO_INCREMENT,branch_id bigint NOT NULL COMMENT 分支事务ID,xid varchar(100) NOT NULL COMMENT 全局事务ID,context varchar(128) NOT NULL COMMENT 上下文信息,rollback_info longblob NOT NULL COMMENT 回滚信息,log_status int NOT NULL COMMENT 日志状态0-未提交1-已提交2-已回滚,log_created datetime NOT NULL COMMENT 创建时间,log_modified datetime NOT NULL COMMENT 修改时间,PRIMARY KEY (id),UNIQUE KEY ux_undo_log (xid,branch_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENTSeata undo日志表;2.3.2 微服务依赖配置Spring Cloud Alibaba在订单服务和库存服务的pom.xml中添加 Seata 依赖Seata Spring Cloud Starter --.cloud arter-alibaba-seata/artifactId2022.0.0.0/versionclusions排除旧版本Seata引入指定版本 --/groupIdartifactIdseata-spring-boot-starter/dependencydependencyio.seataseata-spring-boot-starter .0/dependency2.3.3 微服务配置文件在application.yml中配置 Seata 相关参数订单服务与库存服务配置类似spring:application:name: order-service # 服务名需与Seata配置中的service.vgroup-mapping对应cloud:alibaba:seata:tx-service-group: order-service-group # 事务组名datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.1.101:3306/order_db?useUnicodetruecharacterEncodingutf8username: rootpassword: 123456# Seata配置seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: ${spring.cloud.alibaba.seata.tx-service-group}service:vgroup-mapping:order-service-group: default # 事务组与Seata Server集群映射default为Seata Server默认集群名grouplist:default: 192.168.1.102:8091 # Seata Server地址注意8091为Seata Server的RPC端口非7091registry:type: nacosnacos:server-addr: 192.168.1.100:8848group: SEATA_GROUPnamespace:username: nacospassword: nacos2.3.4 业务代码实现无侵入式Seata AT 模式无需修改业务代码仅需在全局事务发起者订单服务的方法上添加GlobalTransactional注解标记为全局事务入口订单服务全局事务发起者Servicepublic class OrderServiceImpl implements OrderService {Autowiredprivate OrderMapper orderMapper; // 订单DAOAutowiredprivate InventoryFeignClient inventoryFeignClient; // 库存服务Feign客户端调用库存扣减接口/*** 创建订单全局事务入口* GlobalTransactional标记为全局事务rollbackFor指定异常时回滚*/OverrideGlobalTransactional(rollbackFor Exception.class)public String createOrder(OrderDTO orderDTO) {// 1. 本地事务创建订单Order order new Order();order.setOrderNo(UUID.randomUUID().toString());order.setUserId(orderDTO.getUserId());order.setProductId(orderDTO.getProductId());order.setQuantity(orderDTO.getQuantity());order.setStatus(0); // 0-待支付orderMapper.insert(order);System.out.println(订单创建成功订单号 order.getOrderNo());// 2. 远程调用库存服务扣减库存InventoryDTO inventoryDTO new InventoryDTO();inventoryDTO.setProductId(orderDTO.getProductId());inventoryDTO.setReduceQuantity(orderDTO.getQuantity());String inventoryResult inventoryFeignClient.reduceInventory(inventoryDTO);if (!success.equals(inventoryResult)) {// 若库存扣减失败抛出异常触发全局回滚throw new RuntimeException(库存扣减失败订单创建回滚);}return 订单创建成功订单号 order.getOrderNo();}}库存服务分支事务库存服务无需添加 Seata 注解仅需实现库存扣减的本地事务逻辑Servicepublic class InventoryServiceImpl implements InventoryService {Autowiredprivate InventoryMapper inventoryMapper; // 库存DAO/*** 扣减库存本地事务Seata自动管理分支事务*/Overridepublic String reduceInventory(InventoryDTO inventoryDTO) {// 1. 检查库存是否充足Inventory inventory inventoryMapper.selectByProductId(inventoryDTO.getProductId());if (inventory null || inventory.getStock() inventoryDTO.getReduceQuantity()) {return fail库存不足;}// 2. 扣减库存本地事务int rows inventoryMapper.reduceStock(inventoryDTO.getProductId(),inventoryDTO.getReduceQuantity());if (rows 0) {System.out.println(库存扣减成功商品ID inventoryDTO.getProductId() 扣减数量 inventoryDTO.getReduceQuantity());return success;} else {return fail库存扣减失败;}}}3. 功能验证与故障测试3.1 正常场景验证所有分支事务成功调用订单服务的createOrder接口传入参数userId123productId456quantity2观察日志订单服务创建订单成功库存服务扣减库存成功检查数据库order_db.order表新增订单记录inventory_db.inventory表中商品 ID456 的库存减少 2两个数据库的undo_log表无残留记录已提交自动删除Seata 数据库的global_table中全局事务状态为 “已提交”status13.2 异常场景验证分支事务失败触发回滚模拟库存服务异常在库存服务的reduceInventory方法中手动抛出异常如throw new RuntimeException(库存服务临时故障)调用订单服务的createOrder接口观察日志订单服务创建订单成功但调用库存服务时抛出异常触发GlobalTransactional回滚检查数据库order_db.order表无新增订单记录订单服务本地事务已回滚inventory_db.inventory表库存无变化库存服务本地事务未提交或已回滚两个数据库的undo_log表记录已删除回滚完成后清理Seata 数据库的global_table中全局事务状态为 “已回滚”status23.3 故障恢复验证Seata Server 宕机后恢复启动订单服务和库存服务调用createOrder接口在库存服务执行过程中强制关闭 Seata Server观察日志订单服务和库存服务的分支事务处于 “未提交” 状态重启 Seata ServerSeata 会自动读取global_table和branch_table中的未完成事务重新发起第二阶段Commit/Rollback检查结果若宕机前所有分支事务已成功重启后 Seata 会通知所有 RM 提交事务若存在失败分支会通知回滚确保数据一致性三、TCC 模式实战高并发场景下的强一致性保障Seata AT 模式虽无侵入但依赖数据库 undo 日志和全局锁在高并发场景如秒杀下会因锁竞争导致性能下降。TCC 模式通过 “Try-Confirm-Cancel” 三阶段手动拆分业务逻辑无锁竞争性能更高适合高并发、业务逻辑复杂的场景如秒杀库存扣减、多表关联操作。1. TCC 模式核心原理TCC 模式将分布式事务拆分为三个独立的业务操作由业务代码手动实现不依赖数据库事务Try 阶段资源检查与预留如检查库存是否充足并冻结部分库存防止其他事务占用Confirm 阶段确认执行如将冻结的库存正式扣减此阶段操作必须成功无回滚机制Cancel 阶段取消释放若 Try 阶段预留资源后其他事务失败释放预留的资源如解冻冻结的库存核心特点无锁竞争Try 阶段仅预留资源不修改最终数据避免全局锁强一致性可控若所有 Try 成功Confirm 执行后数据立即一致若任一 Try 失败Cancel 执行后资源释放数据恢复初始状态业务侵入性强需手动实现 Try/Confirm/Cancel 三个方法业务代码复杂度高2. Seata TCC 模式实战秒杀库存扣减以 “秒杀商品库存扣减” 为例用 Seata TCC 模式实现高并发下的库存一致性管理2.1 数据库设计库存表拆分为支持 TCC 的 “资源预留”将库存表拆分为 “基础库存表” 和 “冻结库存表”基础库存表inventory_base存储商品总库存CREATE TABLE inventory_base (id bigint NOT NULL AUTO_INCREMENT,product_id bigint NOT NULL COMMENT 商品ID,total_stock int NOT NULL COMMENT 总库存,available_stock int NOT NULL COMMENT 可用库存total_stock - frozen_stock,create_time datetime NOT NULL,update_time datetime NOT NULL,PRIMARY KEY (id),UNIQUE KEY uk_product_id (product_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT基础库存表;冻结库存表inventory_frozen存储 Try 阶段冻结的库存关联全局事务 IDCREATE TABLE inventory_frozen (id bigint NOT NULL AUTO_INCREMENT,product_id bigint NOT NULL COMMENT 商品ID,frozen_quantity int NOT NULL COMMENT 冻结数量,xid varchar(100) NOT NULL COMMENT 全局事务ID,branch_id bigint NOT NULL COMMENT 分支事务ID,status tinyint NOT NULL COMMENT 状态0-冻结中1-已确认扣减2-已取消解冻,create_time datetime NOT NULL,update_time datetime NOT NULL,PRIMARY KEY (id),UNIQUE KEY uk_xid_branch_id (xid,branch_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT冻结库存表;2.2 业务代码实现TCC 三阶段Seata TCC 模式需通过LocalTCC注解标记 TCC 接口并手动实现 Try/Confirm/Cancel 方法2.2.1 TCC 接口定义InventoryTccService/*** 库存TCC接口* LocalTCC标记为TCC接口Seata自动识别Try/Confirm/Cancel方法*/LocalTCCpublic interface InventoryTccService {/*** Try阶段冻结库存资源检查与预留* TwoPhaseBusinessAction指定Confirm和Cancel方法名businessKey业务标识商品ID*/TwoPhaseBusinessAction(name reduceInventoryTcc,commitMethod confirm,rollbackMethod cancel,businessKey productId)String tryFreezeInventory(BusinessKeyParam(productId) Long productId,Integer quantity,Param(xid) String xid,Param(branchId) Long branchId);/*** Confirm阶段确认扣减库存Try成功后执行*/String confirm(Param(xid) String xid,Param(branchId) Long branchId,Param(productId) Long productId,Param(quantity) Integer quantity);/*** Cancel阶段取消冻结Try失败或其他事务失败后执行*/String cancel(Param(xid) String xid,Param(branchId) Long branchId,Param(productId) Long productId,Param(quantity) Integer quantity);}2.2.2 TCC 接口实现InventoryTccServiceImplServicepublic class InventoryTccServiceImpl implements InventoryTccService {Autowiredprivate InventoryBaseMapper baseMapper; // 基础库存DAOAutowiredprivate InventoryFrozenMapper frozenMapper; // 冻结库存DAO/*** Try阶段检查可用库存冻结对应数量*/Overridepublic String tryFreezeInventory(Long productId, Integer quantity, String xid, Long branchId) {// 1. 检查可用库存是否充足使用悲观锁防止并发问题InventoryBase base baseMapper.selectByProductIdForUpdate(productId);if (base null || base.getAvailableStock()return fail可用库存不足;}// 2. 冻结库存减少可用库存新增冻结记录// 2.1 更新基础库存表的可用库存int updateRows baseMapper.reduceAvailableStock(productId, quantity);if (updateRows return fail可用库存更新失败;}// 2.2 新增冻结库存记录InventoryFrozen frozen new InventoryFrozen();frozen.setProductId(productId);frozen.setFrozenQuantity(quantity);frozen.setXid(xid);frozen.setBranchId(branchId);frozen.setStatus(0); // 0-冻结中frozen.setCreateTime(new Date());frozen.setUpdateTime(new Date());frozenMapper.insert(frozen);System.out.println(Try阶段冻结库存成功商品ID productId 冻结数量 quantity XID xid);return success;}/*** Confirm阶段将冻结库存转为正式扣减删除冻结记录无需修改总库存Try阶段已减少可用库存*/Overridepublic String confirm(String xid, Long branchId, Long productId, Integer quantity) {// 1. 查询冻结记录InventoryFrozen frozen frozenMapper.selectByXidAndBranchId(xid, branchId);if (frozen null || frozen.getStatus() ! 0) {return fail冻结记录不存在或已处理;}// 2. 更新冻结记录状态为“已确认”或直接删除视业务需求frozen.setStatus(1);frozen.setUpdateTime(new Date());int updateRows frozenMapper.updateById(frozen);if (updateRows 0) {System.out.println(Confirm阶段库存扣减成功商品ID productId XID xid);return success;} else {return fail冻结记录更新失败;}}/*** Cancel阶段解冻冻结的库存恢复可用库存更新冻结记录状态*/Overridepublic String cancel(String xid, Long branchId, Long productId, Integer quantity) {// 1. 查询冻结记录InventoryFrozen frozen frozenMapper.selectByXidAndBranchId(xid, branchId);if (frozen null || frozen.getStatus() ! 0) {return fail冻结记录不存在或已处理;}// 2. 解冻库存恢复基础库存表的可用库存int updateRows baseMapper.increaseAvailableStock(productId, quantity);if (updateRowsreturn fail可用库存恢复失败;}// 3. 更新冻结记录状态为“已取消”frozen.setStatus(2);frozen.setUpdateTime(new Date());frozenMapper.updateById(frozen);System.out.println(Cancel阶段库存解冻成功商品ID productId 解冻数量 quantity XID xid);return success;}}2.2.3 全局事务发起者秒杀服务秒杀服务作为全局事务发起者调用库存服务的 TCC 接口Servicepublic class SeckillServiceImpl implements SeckillService {Autowiredprivate SeckillMapper seckillMapper; // 秒杀活动DAOAutowiredprivate InventoryTccService inventoryTccService; // 库存TCC接口本地调用若跨服务需用FeignSeata TCCAutowiredprivate GlobalTransactionContext globalTransactionContext; // Seata全局事务上下文/*** 秒杀下单全局事务入口*/OverrideGlobalTransactional(rollbackFor Exception.class)public String seckillOrder(Long seckillId, Long userId, Integer quantity) {// 1. 获取全局事务信息XID、分支IDGlobalTransaction tx globalTransactionContext.getCurrent();String xid tx.getXid();Long branchId tx.getBranchId();// 2. 检查秒杀活动是否有效Seckill seckill seckillMapper.selectById(seckillId);if (seckill null || seckill.getStatus() ! 1 || seckill.getEndTime().before(new Date())) {throw new RuntimeException(秒杀活动已结束或无效);}// 3. 调用库存TCC的Try阶段冻结库存String tryResult inventoryTccService.tryFreezeInventory(seckill.getProductId(),quantity,xid,branchId);if (!success.equals(tryResult)) {throw new RuntimeException(库存冻结失败秒杀下单回滚 tryResult);}// 4. 本地事务创建秒杀订单省略订单创建逻辑若失败会触发Cancel阶段// ...return 秒杀下单成功XID xid;}}3. TCC 模式性能优化与注意事项3.1 性能优化点减少锁竞争Try 阶段使用行锁如select ... for update而非表锁降低并发阻塞异步化处理Confirm/Cancel 阶段可异步执行如通过消息队列减少同步等待时间资源预分配秒杀场景下提前将库存加载到 RedisTry 阶段先检查 Redis 库存再同步到数据库提升并发能力3.2 注意事项幂等性设计Confirm/Cancel 阶段可能因网络重试执行多次需确保方法幂等如通过xidbranchId判断是否已处理空回滚防护若 Try 阶段未执行如网络超时Cancel 阶段可能空执行需在 Cancel 方法中判断冻结记录是否存在悬挂问题若 Try 阶段执行超时但实际已成功后续 Cancel 阶段执行后Confirm 阶段又执行导致数据不一致需通过冻结记录状态严格控制执行顺序如 Confirm 仅处理 “冻结中” 状态Cancel 后状态改为 “已取消”拒绝 Confirm四、Saga 模式实战长事务与跨语言微服务场景Saga 模式适合长事务场景如订单履约流程下单→支付→发货→确认收货每个步骤间隔可能达数小时和跨语言微服务如 Java 订单服务调用 Python 物流服务通过 “拆分短事务 补偿事务” 实现最终一致性无锁且支持异步执行。1. Saga 模式核心原理Saga 模式将分布式长事务拆分为多个独立的短本地事务Step每个 Step 执行后记录事务状态若某个 Step 失败调用对应的补偿事务Compensation回滚前面的 Step正向流程Step1下单→ Step2支付→ Step3发货→ Step4确认收货补偿流程若 Step3发货失败触发补偿流程Compensation3取消发货→ Compensation2退款→ Compensation1取消订单实现方式编排式Choreography无中心协调器每个服务通过事件通知触发下一个服务如订单服务创建订单后发送 “订单创建事件”支付服务监听事件后执行支付协同式Orchestration有中心协调器Saga Orchestrator统一管理所有 Step 的执行与补偿如订单履约协调器调用订单、支付、物流服务2. Seata Saga 模式实战订单履约流程以 “订单履约流程” 为例用 Seata Saga 模式实现协同式分布式事务协调器统一管理 “创建订单→支付→发货→确认收货” 四个 Step2.1 环境准备Seata Server1.8.0支持 Saga 模式服务列表订单服务Java、支付服务Java、物流服务Python、Saga 协调器基于 Seata Saga Orchestrator通信方式HTTP跨语言服务调用、DubboJava 服务间调用2.2 Saga 流程定义JSON 格式通过 JSON 定义
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站推广方法有哪些长春企业自助建站系统

目录已开发项目效果实现截图在这里插入图片描述核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项…

张小明 2025/12/24 15:30:41 网站建设

网站图片相册代码wordpress微型SEO商城

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 vuespringboot_pt87nuk3 框架开发的校园商店零售管理…

张小明 2025/12/24 15:29:38 网站建设

网站 板块 模块php和html5做网站

JUCE框架终极指南:从零到专业音频插件开发全流程 【免费下载链接】JUCE 项目地址: https://gitcode.com/gh_mirrors/juc/JUCE 想要快速掌握专业级音频插件开发技术?JUCE框架为你提供了一站式解决方案!🎵 作为业界领先的跨…

张小明 2025/12/29 9:09:44 网站建设

正规网站优化公司网页设计教程清华大学出版社

41 迭代三概述:大规模系统中,DDD 如何支撑架构演进? 你好,欢迎来到课程的第四大部分——架构升级。 如果说,第一部分“基础筑基”是让我们学会了 DDD 的“基本功”,第二部分“核心突破”是让我们精通了构建健壮模型的“招式”,那么从这一部分开始,我们将从“战术”层…

张小明 2025/12/24 15:26:30 网站建设

大连做网站开发的公司动漫制作专业专升本大学

别再卷本地环境了!这套平台工程思路,让团队实现“3分钟开发到上线”“在我电脑上明明是好的”,这句话我曾说过无数次,也听过无数次。它像一个幽灵,飘荡在每个技术团队的上空。我们为了驱散它,尝试了各种方法…

张小明 2025/12/24 15:24:25 网站建设

长沙企业网站建设案例优秀国内个人网站网址

YOLO模型如何输出JSON格式结果供前端调用? 在智能制造车间的监控大屏上,一张实时图像刚被传入系统不到30毫秒,页面便已高亮标出多个异常焊点——红色边框精准贴合缺陷位置,右侧列表同步刷新着置信度与类别信息。这种“秒级响应可…

张小明 2025/12/30 23:03:55 网站建设