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的更多相关文章

  1. [Erlang 0129] Erlang 杂记 VI

    把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM   P23 简单介绍了Erlang C ...

  2. [Erlang 0126] 我们读过的Erlang论文

    我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...

  3. [Erlang 0124] Erlang Unicode 两三事 - 补遗

    最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...

  4. [Erlang 0120] Know a little Core Erlang

      Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam:   Eshell V6.0 ...

  5. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2

    声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...

  6. [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...

  7. [Erlang 0112] Elixir Protocols

    Why Elixir   为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由? Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初 ...

  8. [Erlang 0110] Erlang Abstract Format , Part 1

    Erlang Abstract Format并不难懂,只是枯燥一点罢了,如果把Abstract Format的文档翻译出来,其实就是Erlang教科书中语法入门的部分. Erlang Abstract ...

  9. 在Windows用Rebar来构建,编译,测试,发布Erlang项目

    rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...

  10. 基于Erlang VM的函数式编程语言Elixir

    Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...

随机推荐

  1. 通过脚手架 npx 创建 react 项目

    npx create-react-app create-react --template typescript 使用 ts 模板

  2. CSharp的@microsoft/signalr实时通信教程 - 前端 vue

    1. 安装@microsoft/signalr pnpm install @microsoft/signalr --save signalr 是微软对 websocket技术的封装,优化了操作 :1. ...

  3. kotlin更多语言结构——>解构声明

    解构声明 有时把一个对象 解构 成很多变量会很方便,例如: val (name, age) = person 这种语法称为 解构声明 .一个解构声明同时创建多个变量.我们已经声明了两个新变量:name ...

  4. 云原生周刊: 使用 Kubectl 执行 100 个 Kubernetes 诊断命令 | 2023.10.23

    开源项目推荐 Stern Stern 是一个针对 Kubernetes 的多 pod 和容器日志跟踪工具.可以跟踪 Kubernetes 上的多个 pod 和 pod 中的多个容器.每个结果都用颜色编 ...

  5. 在 Debian 12 上安装 KubeSphere 实战入门

    老 Z,运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ansible 等. 前言 知识点 定级:入 ...

  6. python之调用高德、百度api解析经纬度地址

    调用高德 # 高德地图根据经纬度反查地址,每天只能调用5000次 def gaode_excute_single_query(coordStrings ,currentkey='你自己的api-key ...

  7. SpringBoot数据访问,配置数据源

    配置文件目录 配置数据源jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

  8. nginx关于正向代理与反向代理的概念区分

    正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理. 反向代理 反向代理中客户端对 ...

  9. Go语言基础06 _function

    Go语言基础06 _function 函数在Go语言中是一等公民 与其他主要编程语言的差别 可以有多个返回值 所有参数都是值传递:slice,map,channel 会有传引用的 错觉 函数可以作为变 ...

  10. spring下 -spring整体架构,JdbcTemplate笔记

    2,搭建Java Maven项目 我的idea是2024.1.1版本,创建普通Maven项目如下图: 用的jdk8,项目名可以自己改,Archetype选图中的第一个就行,之后点 create. 创建 ...