Skip to main content

Module embedded

Module embedded 

Source
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 时会检查名字是否都注册了 —— 宁可提交就报错,也别等副作用落地了才发现。

Structs§

Embedded
EmbeddedBuilder
SagaBuilder