线上的分布式事务是什么样的?以python的saga为例
SegmentFault
共 5440字,需浏览 11分钟
·
2021-08-16 10:51
作者:叶东富
来源:SegmentFault 思否社区
银行跨行转账业务是一个典型分布式事务场景,假设A需要跨行转账给B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的ACID,只能够通过分布式事务来解决。
分布式事务
分布式事务在分布式环境下,为了满足可用性、性能与降级服务的需要,降低一致性与隔离性的要求,一方面遵循 BASE 理论:
基本业务可用性(Basic Availability)
柔性状态(Soft state)
最终一致性(Eventual consistency)
原子性:严格遵循
一致性:事务完成后的一致性严格遵循;事务中的一致性可适当放宽
隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽
持久性:严格遵循
SAGA
AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支
RM/资源管理器,负责分支事务各项资源的管理
TM/事务管理器,负责协调全局事务的正确执行,包括SAGA正向/逆向操作的执行
SAGA实践
CREATE TABLE dtm_busi.`user_account` (
`id` int(11) AUTO_INCREMENT PRIMARY KEY,
`user_id` int(11) not NULL UNIQUE ,
`balance` decimal(10,2) NOT NULL DEFAULT '0.00',
`create_time` datetime DEFAULT now(),
`update_time` datetime DEFAULT now()
);
def saga_adjust_balance(cursor, uid, amount):
affected = utils.sqlexec(cursor, "update dtm_busi.user_account set balance=balance+%d where user_id=%d and balance >= -%d" %(amount, uid, amount))
if affected == 0:
raise Exception("update error, balance not enough")
@app.post("/api/TransOutSaga")
def trans_out_saga():
saga_adjust_balance(c, out_uid, -30)
return {"dtm_result": "SUCCESS"}
@app.post("/api/TransOutCompensate")
def trans_out_compensate():
saga_adjust_balance(c, out_uid, 30)
return {"dtm_result": "SUCCESS"}
@app.post("/api/TransInSaga")
def trans_in_saga():
saga_adjust_balance(c, in_uid, 30)
return {"dtm_result": "SUCCESS"}
@app.post("/api/TransInCompensate")
def trans_in_compensate():
saga_adjust_balance(c, in_uid, -30)
return {"dtm_result": "SUCCESS"}
# 这是dtm服务地址
dtm = "http://localhost:8080/api/dtmsvr"
# 这是业务微服务地址
svc = "http://localhost:5000/api"
req = {"amount": 30}
s = saga.Saga(dtm, utils.gen_gid(dtm))
s.add(req, svc + "/TransOutSaga", svc + "/TransOutCompensate")
s.add(req, svc + "/TransInSaga", svc + "/TransInCompensate")
s.submit()
# 部署启动dtm
# 需要docker版本18以上
git clone https://github.com/yedf/dtm
cd dtm
docker-compose up
# 另起一个命令行
git clone https://github.com/yedf/dtmcli-py-sample
cd dtmcli-py-sample
pip3 install flask dtmcli requests
flask run
# 另起一个命令行
curl localhost:5000/api/fireSaga
处理网络异常
@app.post("/api/TransOutSaga")
def trans_out_saga():
with barrier.AutoCursor(conn_new()) as cursor:
def busi_callback(c):
saga_adjust_balance(c, out_uid, -30)
barrier_from_req(request).call(cursor, busi_callback)
return {"dtm_result": "SUCCESS"}
处理回滚
@app.post("/api/TransInSaga")
def trans_in_saga():
return {"dtm_result": "FAILURE"}
@app.post("/api/TransInSaga")
def trans_in_saga():
with barrier.AutoCursor(conn_new()) as cursor:
def busi_callback(c):
saga_adjust_balance(c, in_uid, 30)
barrier_from_req(request).call(cursor, busi_callback)
return {"dtm_result": "FAILURE"}
小结
评论
你的名片是什么样的?你见过最好的名片是什么样?
大学时候班主任让我们全班人帮他设计一张名片,内容上大家都是一样的,但除了内容,其他各种乱七八糟的都有。圆的方的看的班主任哭笑不得。我也不记得最后到底用的谁的设计,只记得就设计这个过程就足够伤脑。要简洁,要有创意,还要有让人把它留下来的欲望。
可是再怎么让人耳目一新的名片,揣进口袋也可能再也找不到了,甚至连自己都忘了这张名片的存在。
我是在工作之后开始接触电子名片的,第一眼感觉就是内容多,使用方便。
微信直接搜索小程序“帮推名片”不占用手机内存,用起来十分快捷方便
这是打开名片的第一视角,姓名,手机,邮箱等传统名片应有的信息都有,并且免去了繁复的设计烦恼,海量的模板任我挑选,选择一款自己中意的就好。
名片上手机可以一键拨号,
悦目名片
0
华为、中兴的项目管理体制是什么样的?
有幸参与了其一的流程及架构设计建设及落地。
可以这么说,对于中兴华为,架构、流程、IT都是极为被重视的,其重视力度不是一般央企、国企能够对比的。比如说2012年双方启动的LTC变革,前后的成本投入(包括人员、咨询、软件、二次开发)都上亿规模。为什么会这么舍得花钱?因为作为中国真正的全球化ICT公司,要实现全球的同步管理,唯一出路只有流程和IT系统。这方面的投入,实际上是收益可观的,他们在这方面尝到了甜头才会舍得如此的投入。
对于大规模企业、超大规模企业,大多数的工作任务必须通过跨部门合作完成,这就是项目管理的背景和必要性。实际上,中兴华为的项目管理是非常细化和具体的,早就达到大部分的日常工作都以项目为横轴进行推进。研发有研发项目
南獣
0