Expand description
嵌入式 TC —— 把事务协调器当库链进你自己的进程,不需要单独部署一个服务。
这是 dtmrs 相对 DTM 的结构性差异。DTM 是 Go,c-shared 会把整个运行时拖进去,
实际没法当库用,所以必须独立部署:
DTM: 你的服务 ──HTTP──► 独立部署的 TC 进程 ──► DB
(要运维、要高可用、要监控)
dtmrs: 你的服务(TC 就在进程里)──► DB少一个组件,而且分支调用退化成一次函数调用 —— 没有网络、没有序列化。
§用法
use dtmrs_server::embedded::Embedded;
use dtmrs_core::BranchResult;
let tc = Embedded::builder("sqlite:app.db")
.handler("deduct", |_ctx| async { BranchResult::Success })
.handler("deduct_undo", |_ctx| async { BranchResult::Success })
.start()
.await?;
tc.saga("order-1001")
.step("local://deduct", "local://deduct_undo")
// 可以跟远端服务混用
.step("http://shipment/create", "http://shipment/cancel")
.submit()
.await?;§一个必须知道的约束
local:// 分支存的是名字,因为闭包没法持久化。重启后必须注册同名 handler,
否则事务推不动(会当成“结果未知“一直重试,不会误回滚)。
submit 时会检查名字是否都注册了 —— 宁可提交就报错,也别等副作用落地了才发现。