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

网站建设公司发展方向及趋势落实二十条优化措施

网站建设公司发展方向及趋势,落实二十条优化措施,wordpress分类显示图片,平面设计作品集如何制作前言 传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。 但是在微服务架构下,将一个应用拆分成了…

前言

传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。

但是在微服务架构下,将一个应用拆分成了多个独立的服务,每个服务都能有自己的数据库,服务间通信都是通过远程调用实现,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。

解决分布式事务的问题,一劳永逸的方式就是直接使用 Seata,Seata 是一个开源的分布式事务解决方案,用于解决分布式系统中的数据一致性问题。但是,引入 Seata 实在是太重了,在实际工作中接触过的系统,并没有那么多的业务需要使用到分布式事务,为了解决那么一两个业务的问题却要为整个系统引入分布式事务服务,代价实在是太大了。而且,相关的业务实际上只需要保证数据的最终一致性,不用保证强一致性,所以在实践可以使用本地消息表的方案来解决分布式事务问题。

本地消息表方案

如果系统中只有少数服务需要用到分布式事务,那么直接在该服务下创建一张本地消息表,结合消息队列,就能够实现数据的最终一致性了。

表设计

本地消息表的设计如下

字段类型注释
idlongid
msg_typevarchar消息类型
biz_idvarchar业务唯一标志
contenttext消息体
statevarchar状态(待发送,已消费)
create_timedatetime创建时间
update_timedatetime更新时间

时序图

plantuml

@startuml
'https://plantuml.com/sequence-diagramautonumberparticipant Scheduled_Task
database DB_A
participant Service_A
queue Queue
participant Service_B
database DB_Bgroup Service_A本地事务DB_A <- Service_A: 写本地业务数据DB_A <- Service_A: 写本地消息数据
endService_A -> Queue: 发送消息
note left
发送消息放到事务外
防止由于网络延迟出现
Service_A认为发送失败导致事务回滚
而实际上MQ收到了消息
Service_B也消费了消息
从而出现数据不一致的情况
end noteQueue -> Service_B: 消费消息Service_B -> Service_B: 幂等判断
note right
防止重复消费消息
end notegroup Service_B本地事务Service_B -> DB_B: 写本地业务数据
endgroup 更新本地消息表状态Scheduled_Task <- Service_B: 更新本地消息表状态Scheduled_Task -> DB_A: 更新本地消息表状态
end
note right
这里即使失败了也无所谓
两个服务的数据已经一致了
没有更新消息状态,定时任务会重新投递
Service_B做好幂等处理
等下次消费再去修改消息状态即可
end noteloop 定时任务Scheduled_Task -> DB_A: 查询未成功投递的消息Scheduled_Task -> Queue: 重新投递
end@enduml

消息服务方案

本地消息表只只用系统中只有少量业务需要实现分布式事务的情况,如果系统中的绝大多数服务都存在分布式事务的业务场景,为每个服务都创建一张本地消息表显然很麻烦,难以维护。

用到的地方多,实际上就可以考虑上 Seata 了,专业的事要交给专业的服务来做。不过这里也可以改进一下本地消息表的方案,增加一个专门处理分布式事务消息的消息服务和消息库。

表设计

表设计同上面一样,消息服务只不过将所有本地消息表合并成一张表了

只不过 state 字段需要多一个状态来区分

在本地消息表方案中,由于写Service_A业务和创建消息是在同一个事务中,它们要么同时成功,要么同时失败,所以两个状态(待发送,已消费)就能表示整个消息的生命周期。

  1. 待发送状态,则表示Service_A业务和消息同时写入库成功,等待Service_B消费消息
  2. 已消费状态,则表示Service_B已经成功消费了消息

在消息服务方案中,写业务和创建消息不在同一个事务中,所以需要再加一个状态(发送中)

  1. 待发送状态,则表示刚创建消息,此时Service_A还没有写库
  2. 发送中状态:则表示Service_A已经写库成功,等待Service_B消费消息
  3. 已消费状态,则表示Service_B已经成功消费了消息

时序图

plantuml

@startuml
'https://plantuml.com/sequence-diagramautonumberdatabase DB_A
participant Service_A
participant Service_Msg
database DB_Msg
queue Queue
participant Service_B
database DB_Bgroup 创建消息Service_A -> Service_Msg: 创建消息note left: 生成业务idService_Msg -> DB_Msg: 创建消息note left: 消息状态:待发送Service_A <- Service_Msg: 返回消息ID
endgroup Service_A本地事务DB_A <- Service_A: 写本地业务数据
endService_A -> Service_Msg: 发送消息
note left: 携带消息ID
Service_Msg -> DB_Msg: 更新消息状态
note right: 消息状态:发送中
Service_Msg -> Queue: 发送消息
Queue -> Service_B: 消费消息Service_B -> Service_B: 幂等判断group Service_B本地事务Service_B -> DB_B: 写本地业务数据
endgroup 更新消息状态Service_Msg <- Service_B: 更新消息状态Service_Msg -> DB_Msg: 更新消息状态note right: 消息状态:已消费
endloop 定时任务Service_Msg -> DB_Msg: 查询状态为发送中的消息Service_Msg -> Queue: 重新投递
end@enduml
http://www.yayakq.cn/news/796093/

相关文章:

  • 国外h5网站模板投票网站定制
  • 爱站网seo二级建造师怎么查询注册信息
  • 肯德基网站是哪家公司做的东莞市企业名录
  • 自做网站的步骤建设网站域名备案查询
  • 刘素云网站脱孝怎样做wordpress在线版本
  • 怎么自己做单页网站深圳罗湖企业网站建设报价
  • 设立网站建筑门户网站
  • 罗庄建设局网站深圳全网站建设公司
  • 怎么查网站流量源代码怎么做网站
  • 本地网站做哪方面吸引人wordpress 酷狗
  • 描述网站开发的流程展示网站模板下载
  • 陕西建设银行官网站企业内部系统网站制作
  • 设计网站p站公司黄页是指什么意思
  • 免费下载app软件正版做网站优化有必要
  • 网站开发是做啥的南京做电商网站的公司
  • 网站做代码图像显示不出来手机网站开发公司哪家好
  • 德阳移动网站建设导购网站建设需求模版
  • 有哪些做网站的网站网站建设万首先金手指14
  • 免费的做微博的网站模板工程公司的经营范围
  • 建设网站只能是公司吗四川省营山县西城建筑公司网站
  • 做英文网站费用建设银行网站改手机号
  • 菏泽公司网站建设建筑工程网上培训平台
  • 大连外贸网站建设清河网站建设设计费用
  • 网站建设与运营总结公司怎么建立网站吗
  • 网站注册信息自己做同城购物网站
  • 网站开发环境与工具wordpress背景图片
  • 汕头建设企业网站商城模板
  • 怎样做销售水蜜桃网站邯郸学做网站学校
  • 做电商讲师课程的网站合肥网站关键词优化公司
  • 企业做网站域名需要自己申请吗10月上海娱乐场所又要关门了