当前位置: 首页 > news >正文

阿里巴巴网站装修怎么做全屏大图WordPress下拉下一页

阿里巴巴网站装修怎么做全屏大图,WordPress下拉下一页,前端网站重构怎么做,开源多商户商城系统一、概述 1.1背景 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用#xff0c;就会产生分布式事务问题 but 关系型数据库提供的能力是基于单机事务的#xff0c;一旦遇到分布式事务场景#xff0c;就需要通过更多其他技术手段来解决问题。 全局事务#xff1a;…一、概述 1.1背景 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用就会产生分布式事务问题 but   关系型数据库提供的能力是基于单机事务的一旦遇到分布式事务场景就需要通过更多其他技术手段来解决问题。 全局事务整个分布式事务 分支事务分布式事务中包含的每个子系统的事务 最终一致思想各分支事务分别执行并提交如果有不一致的情况再想办法恢复数据 强一致思想各分支事务执行完业务不要提交等待彼此结果。而后统一提交或回滚 1.2相关概念 什么是事务 什么是事务举个生活中的例子你去小卖铺买东西“一手交钱一手交货”就是一个事务的例子交钱和交货必 须全部成功事务才算成功任一个活动失败事务将撤销所有已成功的活动。 明白上述例子再来看事务的定义 事务可以看做是一次大的活动它由不同的小活动组成这些活动要么全部成功要么全部失败。 本地事务 在计算机系统中更多的是通过关系型数据库来控制事务这是利用数据库本身的事务特性来实现的因此叫数据 库事务由于应用主要靠关系数据库来控制事务而数据库通常和应用在同一个服务器所以基于关系型数据库的 事务又被称为本地事务。 分布式事务 随着互联网的快速发展软件系统由原来的单体应用转变为分布式应用 分布式系统会把一个应用系统拆分为可独立部署的多个服务因此需要服务与服务之间远程协作才能完成事务操 作这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务例如用户注册送积分 事务、创建订单减库存事务银行转账事务等都是分布式事务。 举例 1.3分布式事务产生的场景 典型的场景就是微服务架构 微服务之间通过远程调用完成事务操作。 比如订单微服务和库存微服务下单的 同时订单微服务请求库存微服务减库存。 简言之跨JVM进程产生分布式事务。 单体系统访问多个数据库实例 当单体系统需要访问多个数据库实例时就会产生分布式事务。 比如用户信 息和订单信息分别在两个MySQL实例存储用户管理系统删除用户信息需要分别删除用户信息及用户的订单信 息由于数据分布在不同的数据实例需要通过不同的数据库链接去操作数据此时产生分布式事务。 简言之跨 数据库实例产生分布式事务。 多服务访问同一个数据库实例 比如订单微服务和库存微服务即使访问同一个数据库也会产生分布式事务原 因就是跨JVM进程两个微服务持有了不同的数据库链接进行数据库操作此时产生分布式事务。 1.4Seata介绍 解决分布式事务的方案有很多但实现起来都比较复杂因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了。 https://seata.io/zh-cn/docs/overview/what-is-seata.html 其实分布式事务产生的一个重要原因就是参与事务的多个分支事务互相无感知不知道彼此的执行状态。因此解决分布式事务的思想非常简单 就是找一个统一的事务协调者与多个分支事务通信检测每个分支事务的执行状态保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。 Seata也不例外在Seata的事务管理中有三个重要的角色 TC (Transaction Coordinator) - 事务协调者维护全局和分支事务的状态协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器管理分支事务与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回滚。 Seata的工作架构如图所示 其中TM和RM可以理解为Seata的客户端部分引入到参与事务的微服务依赖中即可。将来TM和RM就会协助微服务实现本地分支事务与TC之间交互实现事务的提交或回滚。 而TC服务则是事务协调中心是一个独立的微服务需要单独部署。 我们只需要使用一个Global Transactional注解在业务方法上 历史 1.3相关概念理解 TC (Transaction Coordinator)事务协调器 就是Seata,负责维护全局事务和分支事务的状态驱动全局事务提交或回滚。 TM (Transaction Manager)事务管理器 标注全局GlobalTransactional)启动入口动作的微服务模块比如订单模块它是事务的发起者负责定义全局事务的范围并根据TC维护的全局事务和分支事务状态做出开始事务、提交事务、回滚事务的决议 RM (Resource Manager)资源管理器 就是mysql数据库本身可以是多个RM,负责管理分支事务上的资源向TC 注册分支事务汇报分支事务状态驱动分支事务的提交或回滚 1.5安装配置 见使用 docker-compose 部署 Seata Server docker run --name seata \ -p 8091:8091 \ -p 8191:7091 \ -e SEATA_IPyouip \ -v ./seata-server/resources:/seata-server/resources \ --privilegedtrue \ -d \ seataio/seata-server:2.0.0 yml改 # Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an AS IS BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seataseata:config:type: nacosnacos:server-addr: 127.0.0.1:8848namespace:group: SEATA_GROUP #后续自己在nacos里面新建,不想新建SEATA_GROUP就写DEFAULT_GROUPusername: nacospassword: nacosregistry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUP #后续自己在nacos里面新建,不想新建SEATA_GROUP就写DEFAULT_GROUPnamespace:cluster: defaultusername: nacospassword: nacos store:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/seata?characterEncodingutf8useSSLfalseserverTimezoneGMT%2B8rewriteBatchedStatementstrueallowPublicKeyRetrievaltrueuser: rootpassword: 123456min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000# server:# service-port: 8091 #If not configured, the default is ${server.port} 1000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/** 1.6分类 Seata支持四种不同的分布式事务解决方案 XA TCC AT SAGA Seata提供了四种不同的分布式事务解决方案 XA模式强一致性分阶段事务模式牺牲了一定的可用性无业务侵入TCC模式最终一致的分阶段事务模式有业务侵入AT模式最终一致的分阶段事务模式无业务侵入也是Seata的默认模式SAGA模式长事务模式有业务侵入 二、实战演示 2.1引入依赖 !--统一配置管理--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--读取bootstrap文件--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependency!--seata--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency 2.2yml修改 seata:registry:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: group: SEATA_GROUPapplication: seata-servertx-service-group: default_tx_group # 事务组由它获得TC服务的集群名称service:vgroup-mapping: # 点击源码分析default_tx_group: default # 事务组与TC服务集群的映射关系data-source-proxy-mode: AT 进阶 在nacos上添加一个共享的seata配置命名为shared-seata.yaml 然后改造trade-service模块添加bootstrap.yaml spring:application:name: trade-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.150.101 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置- dataId: shared-seata.yaml # 共享seata配置 2.3XA模式 2PC的传统方案是在数据库层面实现的如Oracle、MySQL都支持2PC协议为了统一标准减少行业内不必要的对 接成本需要制定标准化的处理模型及接口标准国际开放标准组织Open Group定义了分布式事务处理模型 DTPDistributed Transaction Processing Reference Model。 XA 规范 是 X/Open 组织定义的分布式事务处理DTPDistributed Transaction Processing标准XA 规范 描述了全局的TM与局部的RM之间的接口几乎所有主流的数据库都对 XA 规范 提供了支持。 两阶段提交 A是规范目前主流数据库都实现了这种规范实现的原理都是基于两阶段提交。 正常情况 异常情况 一阶段 事务协调者通知每个事务参与者执行本地事务 本地事务执行完成后报告事务执行状态给事务协调者此时事务不提交继续持有数据库锁 二阶段 事务协调者基于一阶段的报告来判断下一步操作 如果一阶段都成功则通知所有事务参与者提交事务 如果一阶段任意一个参与者失败则通知所有事务参与者回滚事务 Seata的XA模型 Seata对原始的XA模式做了简单的封装和改造以适应自己的事务模型基本架构如图 RM一阶段的工作 注册分支事务到TC 执行分支业务sql但不提交 报告执行状态到TC TC二阶段的工作 TC检测各分支事务执行状态 如果都成功通知所有RM提交事务 如果有失败通知所有RM回滚事务 RM二阶段的工作 接收TC指令提交或回滚事务 实现XA模式 GlobalTransactional注解 GlobalTransactional注解是用于声明分布式全局事务的注解。 在分布式系统中一个业务操作可能会涉及多个服务之间的调用这些服务可能部署在不同的服务器上甚至使用不同的数据库。在这种情况下保证整个业务流程的数据一致性就显得尤为重要。GlobalTransactional注解就是用于标识这样一个全局事务的边界确保所有涉及到的服务要么全部成功提交要么全部回滚以保持数据的一致性。 优缺点 XA模式的优点是什么 事务的强一致性满足ACID原则 常用数据库都支持实现简单并且没有代码侵入 XA模式的缺点是什么 因为一阶段需要锁定数据库资源等待二阶段结束才释放性能较差 依赖关系型数据库实现事务 2.4AT模式 AT模式同样是分阶段提交的事务模型不过缺弥补了XA模型中资源锁定周期过长的缺陷。 Seata的AT模型 阶段一RM的工作 注册分支事务 记录undo-log数据快照 执行业务sql并提交 报告事务状态 阶段二提交时RM的工作 删除undo-log即可 阶段二回滚时RM的工作 根据undo-log恢复数据到更新前 AT与XA的区别 XA模式一阶段不提交事务锁定资源AT模式一阶段直接提交不锁定资源。 XA模式依赖数据库机制实现回滚AT模式利用数据快照实现数据回滚。 XA模式强一致AT模式最终一致 AT模式原理 优缺点 AT模式的优点 一阶段完成直接提交事务释放数据库资源性能比较好利用全局锁实现读写隔离没有代码侵入框架自动完成回滚和提交 AT模式的缺点 两阶段之间属于软状态属于最终一致框架的快照功能会影响性能但比XA模式要好很多 实现AT模式 建表 总结 本节讲解了传统2PC基于数据库XA协议和Seata实现2PC的两种2PC方案由于Seata的0侵入性并且解决了传 统2PC长期锁资源的问题所以推荐采用Seata实现2PC。 Seata实现2PC要点 1、全局事务开始使用 GlobalTransactional标识 。 2、每个本地事务方案仍然使用Transactional标识。 3、每个数据都需要创建undo_log表此表是seata保证本地事务一致性的关键。 2.5TCC模式 seata的TCC模型 优缺点 TCC的优点是什么 ·一阶段完成直接提交事务释放数据库资源性能好相比AT模型无需生成快照无需使用全局锁性能最强·不依赖数据库事务而是依赖补偿操作可以用于非事务型数据库 TCC的缺点是什么 有代码侵入需要人为编写try、Confirm和Cancel接口太麻烦软状态事务是最终一致需要考虑Confirm和Cancel的失败情况做好幂等处理 实现TCC模式 空回滚 在没有调用 TCC 资源 Try 方法的情况下调用了二阶段的 Cancel 方法Cancel 方法需要识别出这是一个空回 滚然后直接返回成功。 出现原因是当一个分支事务所在服务宕机或网络异常分支事务调用记录为失败这个时候其实是没有执行Try阶 段当故障恢复后分布式事务进行回滚则会调用二阶段的Cancel方法从而形成空回滚。 解决思路是关键就是要识别出这个空回滚。思路很简单就是需要知道一阶段是否执行如果执行了那就是正常回 滚如果没执行那就是空回滚。前面已经说过TM在发起全局事务时生成全局事务记录全局事务ID贯穿整个分 布式事务调用链条。再额外增加一张分支事务记录表其中有全局事务 ID 和分支事务 ID第一阶段 Try 方法里会 插入一条记录表示一阶段执行了。Cancel 接口里读取该记录如果该记录存在则正常回滚如果该记录不存 在则是空回滚。 幂等   TM在发起全局事务时生成全局事务记录全局事务ID贯穿整个分布式事务调用链条用来记录事务上下文 追踪和记录状态由于Confirm 和cancel失败需进行重试因此需要实现为幂等幂等性是指同一个操作无论请求 多少次其结果都相同。 通过前面介绍已经了解到为了保证TCC二阶段提交重试机制不会引发数据不一致要求 TCC 的二阶段 Try、 Confirm 和 Cancel 接口保证幂等这样不会重复使用或者释放资源。如果幂等控制没有做好很有可能导致数据 不一致等严重问题。 解决思路在上述“分支事务记录”中增加执行状态每次执行前都查询该状态。 业务悬挂 悬挂就是对于一个分布式事务其二阶段 Cancel 接口比 Try 接口先执行。 出现原因是在 RPC 调用分支事务try时先注册分支事务再执行RPC调用如果此时 RPC 调用的网络发生拥堵 通常 RPC 调用是有超时时间的RPC 超时以后TM就会通知RM回滚该分布式事务可能回滚完成后RPC 请求 才到达参与者真正执行而一个 Try 方法预留的业务资源只有该分布式事务才能使用该分布式事务第一阶段预 留的业务资源就再也没有人能够处理了对于这种情况我们就称为悬挂即业务资源预留后没法继续处理。 解决思路是如果二阶段执行完成那一阶段就不能再继续执行。在执行一阶段事务时判断在该全局事务下“分支 事务记录”表中是否已经有二阶段事务记录如果有则不执行Try。 接口声明 总结· 如果拿TCC事务的处理流程与2PC两阶段提交做比较2PC通常都是在跨库的DB层面而TCC则在应用层面的处 理需要通过业务逻辑来实现。这种分布式事务的实现方式的优势在于可以让应用自己定义数据操作的粒度使 得降低锁冲突、提高吞吐量成为可能。 而不足之处则在于对应用的侵入性非常强业务逻辑的每个分支都需要实现try、confirm、cancel三个操作。此 外其实现难度也比较大需要按照网络状态、系统故障等不同的失败原因实现不同的回滚策略。 2.6SAGA模式 Saga模式是SEATA提供的长事务解决方案。也分为两个阶段 ·一阶段直接提交本地事务二阶段成功则什么都不做失败则通过编写补偿业务来回滚 没有隔离性 优缺点 总结 2.7高可用 将事务组映射配置到nacos # 事务组映射关系 service.vgroupMapping.seata-demoSHservice.enableDegradefalse service.disableGlobalTransactionfalse # 与TC服务的通信配置 transport.typeTCP transport.serverNIO transport.heartbeattrue transport.enableClientBatchSendRequestfalse transport.threadFactory.bossThreadPrefixNettyBoss transport.threadFactory.workerThreadPrefixNettyServerNIOWorker transport.threadFactory.serverExecutorThreadPrefixNettyServerBizHandler transport.threadFactory.shareBossWorkerfalse transport.threadFactory.clientSelectorThreadPrefixNettyClientSelector transport.threadFactory.clientSelectorThreadSize1 transport.threadFactory.clientWorkerThreadPrefixNettyClientWorkerThread transport.threadFactory.bossThreadSize1 transport.threadFactory.workerThreadSizedefault transport.shutdown.wait3 # RM配置 client.rm.asyncCommitBufferLimit10000 client.rm.lock.retryInterval10 client.rm.lock.retryTimes30 client.rm.lock.retryPolicyBranchRollbackOnConflicttrue client.rm.reportRetryCount5 client.rm.tableMetaCheckEnablefalse client.rm.tableMetaCheckerInterval60000 client.rm.sqlParserTypedruid client.rm.reportSuccessEnablefalse client.rm.sagaBranchRegisterEnablefalse # TM配置 client.tm.commitRetryCount5 client.tm.rollbackRetryCount5 client.tm.defaultGlobalTransactionTimeout60000 client.tm.degradeCheckfalse client.tm.degradeCheckAllowTimes10 client.tm.degradeCheckPeriod2000# undo日志配置 client.undo.dataValidationtrue client.undo.logSerializationjackson client.undo.onlyCareUpdateColumnstrue client.undo.logTableundo_log client.undo.compress.enabletrue client.undo.compress.typezip client.undo.compress.threshold64k client.log.exceptionRate100 微服务读取nacos配置  重启微服务现在微服务到底是连接tc的SH集群还是tc的HZ集群都统一由nacos的client.properties来决定了。 三、知识扩展 3.1可靠消息最终一致性 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息事务参与方(消息消费者)一定能 够接收消息并处理事务成功此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成如下图 事务发起方消息生产方将消息发给消息中间件事务参与方从消息中间件接收消息事务发起方和消息中间件 之间事务参与方消息消费方和消息中间件之间都是通过网络通信由于网络通信的不确定性会导致分布式事 务问题。 因此可靠消息最终一致性方案要解决以下几个问题 问题产生 1.本地事务与消息发送的原子性问题 本地事务与消息发送的原子性问题即事务发起方在本地事务执行成功后消息必须发出去否则就丢弃消息。即实 现本地事务和消息发送的原子性要么都成功要么都失败。本地事务与消息发送的原子性问题是实现可靠消息最 终一致性方案的关键问题。 先来尝试下这种操作先发送消息再操作数据库 begin transaction //1.发送MQ //2.数据库操作  commit transation; 这种情况下无法保证数据库操作与发送消息的一致性因为可能发送消息成功数据库操作失败。 你立马想到第二种方案先进行数据库操作再发送消息 begin transaction //1.数据库操作 //2.发送MQ  commit transation; 这种情况下貌似没有问题如果发送MQ消息失败就会抛出异常导致数据库事务回滚。但如果是超时异常数 据库回滚但MQ其实已经正常发送了同样会导致不一致。 2、事务参与方接收消息的可靠性 事务参与方必须能够从消息队列接收到消息如果接收消息失败可以重复接收消息。 3、消息重复消费的问题 由于网络2的存在若某一个消费节点超时但是消费成功此时消息中间件会重复投递此消息就导致了消息的重 复消费。 要解决消息重复消费的问题就要实现事务参与方的方法幂等性。 解决方案 本地消息表方案 本地消息表这个方案最初是eBay提出的此方案的核心是通过本地事务保证数据业务操作和消息的一致性然后 通过定时任务将消息发送至消息中间件待确认消息发送给消费方成功再将消息删除。 下面以注册送积分为例来说明 下例共有两个微服务交互用户服务和积分服务用户服务负责添加用户积分服务负责增加积分。 交互流程如下 1、用户注册 用户服务在本地事务新增用户和增加 ”积分消息日志“。用户表和消息表通过本地事务保证一致 begin transaction //1.新增用户 //2.存储积分消息日志  commit transation; 这种情况下本地数据库操作与存储积分消息日志处于同一个事务中本地数据库操作与记录消息日志操作具备原 子性。 2、定时任务扫描日志 如何保证将消息发送给消息队列呢 经过第一步消息已经写到消息日志表中可以启动独立的线程定时对消息日志表中的消息进行扫描并发送至消息 中间件在消息中间件反馈发送成功后删除该消息日志否则等待定时任务下一周期重试。 3、消费消息 如何保证消费者一定能消费到消息呢 这里可以使用MQ的ack即消息确认机制消费者监听MQ如果消费者接收到消息并且业务处理完成后向MQ 发送ack即消息确认此时说明消费者正常消费消息完成MQ将不再向消费者推送消息否则消费者会不断重 试向消费者来发送消息。 积分服务接收到”增加积分“消息开始增加积分积分增加成功后向消息中间件回应ack否则消息中间件将重复 投递此消息。 由于消息会重复投递积分服务的”增加积分“功能需要实现幂等性。 RocketMQ事务消息方案 执行流程如下 为方便理解我们还以注册送积分的例子来描述 整个流程。 Producer 即MQ发送方本例中是用户服务负责新增用户。MQ订阅方即消息消费方本例中是积分服务负责 新增积分。 1、Producer 发送事务消息 Producer MQ发送方发送事务消息至MQ ServerMQ Server将消息状态标记为Prepared预备状态注 意此时这条消息消费者MQ订阅方是无法消费到的。 本例中Producer 发送 ”增加积分消息“ 到MQ Server。 2、MQ Server回应消息发送成功 MQ Server接收到Producer 发送给的消息则回应发送成功表示MQ已接收到消息。 3、Producer 执行本地事务 Producer 端执行业务代码逻辑通过本地数据库事务控制。 本例中Producer 执行添加用户操作。 4、消息投递 若Producer 本地事务执行成功则自动向MQServer发送commit消息MQ Server接收到commit消息后将”增加积 分消息“ 状态标记为可消费此时MQ订阅方积分服务即正常消费消息 若Producer 本地事务执行失败则自动向MQServer发送rollback消息MQ Server接收到rollback消息后 将删 除”增加积分消息“ 。 MQ订阅方积分服务消费消息消费成功则向MQ回应ack否则将重复接收消息。这里ack默认自动回应即 程序执行正常则自动回应ack。 5、事务回查 如果执行Producer端本地事务过程中执行端挂掉或者超时MQ Server将会不停的询问同组的其他 Producer 来获取事务执行状态这个过程叫事务回查。MQ Server会根据事务回查结果来决定是否投递消息。 以上主干流程已由RocketMQ实现对用户侧来说用户需要分别实现本地事务执行以及本地事务回查方法因此 只需关注本地事务的执行状态即可。 需求 小结 可靠消息最终一致性就是保证消息从生产方经过消息中间件传递到消费方的一致性本案例使用了RocketMQ作为 消息中间件RocketMQ主要解决了两个功能 1、本地事务与消息发送的原子性问题。 2、事务参与方接收消息的可靠性。 可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景。引入消息机制后同步的事务操作变为基于消 息执行的异步操作, 避免了分布式事务中的同步阻塞操作的影响并实现了两个服务的解耦。 3.2最大努力通知 什么是最大努力通知 最大努力通知也是一种解决分布式事务的方案下边是一个是充值的例子 交互流程: 1、账户系统调用充值系统接口 2、充值系统完成支付处理向账户系统发起充值结果通知 若通知失败则充值系统按策略进行重复通知 3、账户系统接收到充值结果通知修改充值状态。 4、账户系统未接收到通知会主动调用充值系统的接口查询充值结果。 通过上边的例子我们总结最大努力通知方案的目标 目标发起通知方通过一定的机制最大努力将业务处理结果通知到接收方。 具体包括 1、有一定的消息重复通知机制。 因为接收通知方可能没有接收到通知此时要有一定的机制对消息重复通知。 2、消息校对机制。 如果尽最大努力也没有通知到接收方或者接收方消费消息后要再次消费此时可由接收方主动向通知方查询消息 信息来满足需求。 最大努力通知与可靠消息一致性有什么不同 解决方案 通过对最大努力通知的理解采用MQ的ack机制就可以实现最大努力通知。 方案1 本方案是利用MQ的ack机制由MQ向接收通知方发送通知流程如下 1、发起通知方将通知发给MQ。 使用普通消息机制将通知发给MQ。 注意如果消息没有发出去可由接收通知方主动请求发起通知方查询业务执行结果。后边会讲 2、接收通知方监听 MQ。 3、接收通知方接收消息业务处理完成回应ack。 4、接收通知方若没有回应ack则MQ会重复通知。 MQ会按照间隔1min、5min、10min、30min、1h、2h、5h、10h的方式逐步拉大通知间隔 如果MQ采用 rocketMq在broker中可进行配置直到达到通知要求的时间窗口上限。 5、接收通知方可通过消息校对接口来校对消息的一致性。 方案2 本方案也是利用MQ的ack机制与方案1不同的是应用程序向接收通知方发送通知如下图 交互流程如下 1、发起通知方将通知发给MQ。 使用可靠消息一致方案中的事务消息保证本地事务与消息的原子性最终将通知先发给MQ。 2、通知程序监听 MQ接收MQ的消息。 方案1中接收通知方直接监听MQ方案2中由通知程序监听MQ。通知程序若没有回应ack则MQ会重复通知。 3、通知程序通过互联网接口协议如http、webservice调用接收通知方案接口完成通知。 通知程序调用接收通知方案接口成功就表示通知成功即消费MQ消息成功MQ将不再向通知程序投递通知消 息。 4、接收通知方可通过消息校对接口来校对消息的一致性。 小结 小结 最大努力通知方案是分布式事务中对一致性要求最低的一种,适用于一些最终一致性时间敏感度低的业务 最大努力通知方案需要实现如下功能 1、消息重复通知机制。 2、消息校对机制。 3.3总结 在学习各种分布式事务的解决方案后我们了解到各种方案的优缺点 2PC 最大的诟病是一个阻塞协议。RM在执行分支事务后需要等待TM的决定此时服务会阻塞并锁定资源。由于其 阻塞机制和最差时间复杂度高 因此这种设计不能适应随着事务涉及的服务数量增加而扩展的需要很难用于并 发较高以及子事务生命周期较长 (long-running transactions) 的分布式服务中。 如果拿TCC事务的处理流程与2PC两阶段提交做比较2PC通常都是在跨库的DB层面而TCC则在应用层面的处 理需要通过业务逻辑来实现。这种分布式事务的实现方式的优势在于可以让应用自己定义数据操作的粒度使 得降低锁冲突、提高吞吐量成为可能。而不足之处则在于对应用的侵入性非常强业务逻辑的每个分支都需要实现 try、confirm、cancel三个操作。此外其实现难度也比较大需要按照网络状态、系统故障等不同的失败原因实 现不同的回滚策略。典型的使用场景满登录送优惠券等。 可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景。引入消息机制后同步的事务操作变为基于消 息执行的异步操作, 避免了分布式事务中的同步阻塞操作的影响并实现了两个服务的解耦。典型的使用场景注 册送积分登录送优惠券等。 最大努力通知是分布式事务中要求最低的一种,适用于一些最终一致性时间敏感度低的业务允许发起通知方处理业 务失败在接收通知方收到通知后积极进行失败处理无论发起通知方如何处理结果都会不影响到接收通知方的后 续处理发起通知方需提供查询执行情况接口用于接收通知方校对结果。典型的使用场景银行通知、支付结果 通知等。 四、分布式事务概述 简述 分布式事务指事务的操作位于不同的节点上需要保证事务的 AICD 特性。 例如在下单场景下库存和订单如果不在同一个节点上就涉及分布式事务。 分布式事务的方式 在分布式系统中要实现分布式事务无外乎那几种解决方案。 4.1两阶段提交2PC 需要数据库产商的支持java组件有atomikos等。 两阶段提交Two-phase Commit2PC通过引入协调者Coordinator来协调参与者的行为并最终决定这些参与者是否要真正执行事务。 准备阶段 协调者询问参与者事务是否执行成功参与者发回事务执行结果。 提交阶段 如果事务在每个参与者上都执行成功事务协调者发送通知让参与者提交事务否则协调者发送通知让参与者回滚事务。 需要注意的是在准备阶段参与者执行了事务但是还未提交。只有在提交阶段接收到协调者发来的通知后才进行提交或者回滚。 存在的问题 同步阻塞 所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态无法进行其它操作。单点问题 协调者在 2PC 中起到非常大的作用发生故障将会造成很大影响。特别是在阶段二发生故障所有参与者会一直等待状态无法完成其它操作。数据不一致 在阶段二如果协调者只发送了部分 Commit 消息此时网络发生异常那么只有部分参与者接收到 Commit 消息也就是说只有部分参与者提交了事务使得系统数据不一致。太过保守 任意一个节点失败就会导致整个事务失败没有完善的容错机制。 4.2补偿事务TCC 严选阿里蚂蚁金服。 TCC 其实就是采用的补偿机制其核心思想是针对每个操作都要注册一个与其对应的确认和补偿撤销操作。它分为三个阶段 Try 阶段主要是对业务系统做检测及资源预留Confirm 阶段主要是对业务系统做确认提交Try阶段执行成功并开始执行 Confirm阶段时默认 - - - Confirm阶段是不会出错的。即只要Try成功Confirm一定成功。Cancel 阶段主要是在业务执行错误需要回滚的状态下执行的业务取消预留资源释放。 举个例子假入 Bob 要向 Smith 转账思路大概是 我们有一个本地方法里面依次调用 1首先在 Try 阶段要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。 2在 Confirm 阶段执行远程调用的转账的操作转账成功进行解冻。 3如果第2步执行成功那么转账成功如果第二步执行失败则调用远程冻结接口对应的解冻方法 (Cancel)。 优点 跟2PC比起来实现以及流程相对简单了一些但数据的一致性比2PC也要差一些 缺点 缺点还是比较明显的在2,3步中都有可能失败。TCC属于应用层的一种补偿方式所以需要程序员在实现的时候多写很多补偿的代码在一些场景中一些业务流程可能用TCC不太好定义及处理。 4.3本地消息表异步确保 比如支付宝、微信支付主动查询支付状态对账单的形式 本地消息表与业务数据表处于同一个数据库中这样就能利用本地事务来保证在对这两个表的操作满足事务特性并且使用了消息队列来保证最终一致性。 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息本地事务能保证这个消息一定会被写入本地消息表中。之后将本地消息表中的消息转发到 Kafka 等消息队列中如果转发成功则将消息从本地消息表中删除否则继续重新转发。在分布式事务操作的另一方从消息队列中读取一个消息并执行消息中的操作。 优点 一种非常经典的实现避免了分布式事务实现了最终一致性。 缺点 消息表会耦合到业务系统中如果没有封装好的解决方案会有很多杂活需要处理。 4.4MQ 事务消息 异步场景通用性较强拓展性较高。 有一些第三方的MQ是支持事务消息的比如RocketMQ他们支持事务消息的方式也是类似于采用的二阶段提交但是市面上一些主流的MQ都是不支持事务消息的比如 Kafka 不支持。 以阿里的 RabbitMQ 中间件为例其思路大致为 第一阶段Prepared消息会拿到消息的地址。 第二阶段执行本地事务第三阶段通过第一阶段拿到的地址去访问消息并修改状态。 也就是说在业务方法内要想消息队列提交两次请求一次发送消息和一次确认消息。如果确认消息发送失败了RabbitMQ会定期扫描消息集群中的事务消息这时候发现了Prepared消息它会向消息发送者确认所以生产方需要实现一个check接口RabbitMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。 优点 实现了最终一致性不需要依赖本地数据库事务。 缺点 实现难度大主流MQ不支持RocketMQ事务消息部分代码也未开源。
http://www.w-s-a.com/news/488777/

相关文章:

  • 深圳市龙岗区住房和建设局网站怎么给网站做404界面
  • 设计类网站网站系统 建设和软件岗位职责
  • 网站后台打开慢站长之家网址ip查询
  • 图书馆网站设计方案家具设计作品
  • 马鞍山做网站公司排名徐州网站外包
  • 十堰微网站建设电话宣传型网站建设
  • 电脑制作网站教程网络公司除了建网站
  • 360制作网站搜网站网
  • 门户网站标题居中加大网站底部的制作
  • 网站建设项目费用报价ai软件下载
  • 面料 做网站重庆网站seo费用
  • 中国沈阳网站在哪里下载中国移动营销策略分析
  • 建设银行 钓鱼网站360免费建站教程
  • wordpress全站cdn网站运营年度推广方案
  • 成都网站开发培训机构网站开发 实习报告
  • 廊坊网站建设佛山厂商wordpress神主题
  • 成县建设局网站中国建筑有几个工程局
  • 网站打不开被拦截怎么办单页面网站制作
  • 关于协会网站建设的建议设计公司名字参考
  • 怎样申请做p2p融资网站页面设计时最好使用一种颜色
  • 一般做网站上传的图片大小网站软件设计
  • 用来网站备案注册什么公司好wordpress怎么搜索中文主题
  • 网站开发 打标签深圳软件公司排名
  • 邯郸的网站建设电子网站怎么做的
  • 中国企业信用网四川游戏seo整站优化
  • 下载站推广wordpress扩展字段
  • 网站建设这个工作怎么样免费电子版个人简历模板
  • 移动网站设计与制作网站开发接私活
  • 视频制作素材网站wordpress mysql 被删
  • 静态网站 模板公司一般都用什么邮箱