用 erlang 描述 tcc
Transaction 视为一个 Actor.
start_transaction(Order) ->
p1 = spawn(start_order(self, Order.subOrder1)) # 酒店
p2 = spawn(start_order(self, Order.subOrder2)) # 航空公司
p3 = spawn(start_order(self, Order.subOrder3)) # 汽车公司
wait_try_success(Order, [p1, p2, p3])
wait_try_success(Order, Actors) ->
receive
try_success ->
if all_tried
Actors.forEach(actor => actor ! confirm)
wait_confirm_success(Order, Actors)
try_failed ->
Actors.forEach(actor => actor ! cancel)
timeout ->
Actors.forEach(actor => actor ! cancel)
wait_confirm_success(Order, Actors) ->
receive
confirm_success ->
if all_confirmed
done
confirm_failed ->
Actors.forEach(actor => actor ! cancel)
timeout ->
Actors.forEach(actor => actor ! cancel)
每个任务视为一个 actor,
start_order(Transaction, Order) ->
try()
Transaction ! try_success
wait_confirm(Transaction, Order)
wait_confirm() ->
receive
confirm ->
confirm()
Transaction ! confirm_success
timeout ->
cancel()
Transaction ! failed
cancel ->
cancel()
发起人启动 Transaction, 该 Transaction 启动 order actor, 并进入 try.
order actor 收到订单时, 执行 try, 等待 confirm.
Transaction 收集满所有相关 actor 的 try_success 后, 通知 confirm.
收集齐所有 confirm_success 后, 事务完成.
- 如收到 confirm_failed 后 try_failed, 则群发 cancel.
- 如超时, 亦群发 cancel.
order actor 在 wait_confirm 状态, 如超时或收到 cancel 均回滚.
当然, TCC 也无法解决 confirm 成功的 actor 再也联系不上的问题. 联系不上只能通过可靠送达的 MQ 来解决, 如节点 confirm 后再也不开机了也就无可奈何了.
用 erlang 描述 tcc的更多相关文章
- [Erlang 0129] Erlang 杂记 VI
把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM P23 简单介绍了Erlang C ...
- [Erlang 0126] 我们读过的Erlang论文
我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...
- [Erlang 0124] Erlang Unicode 两三事 - 补遗
最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...
- [Erlang 0120] Know a little Core Erlang
Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam: Eshell V6.0 ...
- [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2
声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...
- [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1
Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...
- [Erlang 0112] Elixir Protocols
Why Elixir 为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由? Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初 ...
- [Erlang 0110] Erlang Abstract Format , Part 1
Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...
- 在Windows用Rebar来构建,编译,测试,发布Erlang项目
rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...
- 基于Erlang VM的函数式编程语言Elixir
Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...
随机推荐
- ServiceMesh 2:控制面和数据面的职责(图文总结)
★ ServiceMesh系列 1 Service Mesh介绍 之前的章节我们详细介绍了ServiceMesh的基础知识. ServiceMesh 是最新一代的微服务架构,作为一个基础设施层,能够与 ...
- 2024年9月中国数据库排行榜:openGauss系多点开花,根社区优势明显
在墨天轮发布的9月中国数据库流行度排行榜中,中国数据库产业格局进一步聚集刷新,呈现出3大显著特征: 开源势力力争上游显优势领先潮流: openGauss 开源根社区优势明显: 阿里华为两极鼎立云上云下 ...
- js有效括号匹配
// 定义一个括号映射 const bracketMap = [ { left: '[', right: ']' }, { left: '<', right: '>' }, { left: ...
- MYSQL存储过程-练习2 while 循环
MYSQL存储过程-练习2 while 循环 1 #WHILE循环 2 DELIMITER $$ 3 4 CREATE PROCEDURE `sp_while`() 5 BEGIN 6 DECLARE ...
- 在 Ubuntu 22.04 上安装 KubeSphere 实战教程
作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ans ...
- python项目实战——一元线性回归预测模型
文章目录 1.一元线性回归简介 2.环境准备 3.数据准备 4.可视化数据 5.构建线性回归模型 在数据科学领域,预测分析是一项核心技能.一元线性回归作为预测分析的基石,能够帮助我们理解一个自变量如何 ...
- 【分享】用typescript结合react编写代码,引入第三方库模块报错的解决办法
1.前提 我用 npx create-react-app my-react-ts-app --template typescript 创建了一个应用,加了typescript到项目中; 问题来了, ...
- 解决mysql的语句中group_concat长度限制问题
在mysql中,有个函数叫"group_concat",平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了.其实MYSQL内部对这个是有设置的,默认不设置的长度是10 ...
- 4.6 Linux解压.gz格式的文件(gunzip命令)
gunzip 是一个使用广泛的解压缩命令,它用于解压被 gzip 压缩过的文件(扩展名为 .gz). 对于解压被 gzip 压缩过的文件,还可以使用 gzip 自己,即 gzip -d 压缩包. gu ...
- ABP使用基于JWT标准的的Token访问API
这里就不详细介绍JWT了,JWT的详细介绍可以查看简书的这篇文章,写得非常详细:http://www.jianshu.com/p/576dbf44b2ae 1.申请Token ABP内部已经为我们实现 ...