{"id":19073341,"url":"https://github.com/dtm-labs/dtmcli-node","last_synced_at":"2025-04-28T18:57:18.727Z","repository":{"id":45223519,"uuid":"385507224","full_name":"dtm-labs/dtmcli-node","owner":"dtm-labs","description":"a node client for distributed transaction framework dtm. ","archived":false,"fork":false,"pushed_at":"2023-03-31T08:41:08.000Z","size":184,"stargazers_count":24,"open_issues_count":1,"forks_count":4,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-04-28T18:57:10.870Z","etag":null,"topics":["distributed","distributed-transactions","node","nodejs","saga","seata","tcc","transaction"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dtm-labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-07-13T06:59:20.000Z","updated_at":"2025-01-16T01:31:17.000Z","dependencies_parsed_at":"2025-04-18T07:43:21.074Z","dependency_job_id":"dda6929a-c853-41ac-bffc-cd1a1f79447f","html_url":"https://github.com/dtm-labs/dtmcli-node","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fdtmcli-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fdtmcli-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fdtmcli-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fdtmcli-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dtm-labs","download_url":"https://codeload.github.com/dtm-labs/dtmcli-node/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251372466,"owners_count":21578964,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distributed","distributed-transactions","node","nodejs","saga","seata","tcc","transaction"],"created_at":"2024-11-09T01:46:24.626Z","updated_at":"2025-04-28T18:57:18.708Z","avatar_url":"https://github.com/dtm-labs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"a client for distributed transaction manager [dtm](https://github.com/dtm-labs/dtm)\n\n`dtmcli` 是分布式事务管理器[dtm](https://github.com/dtm-labs/dtm)的客户端sdk\n\n## dtm分布式事务管理服务\n\nDTM是一款跨语言的开源分布式事务管理器，优雅的解决了幂等、空补偿、悬挂等分布式事务难题。提供了简单易用、高性能、易水平扩展的分布式事务解决方案。\n\n## 亮点\n\n* 极易接入\n  - 支持HTTP，提供非常简单的接口，极大降低上手分布式事务的难度，新手也能快速接入\n* 使用简单\n  - 开发者不再担心悬挂、空补偿、幂等各类问题，框架层代为处理\n* 跨语言\n  - 可适合多语言栈的公司使用。方便go、python、php、nodejs、ruby各类语言使用。\n* 易部署、易扩展\n  - 仅依赖mysql，部署简单，易集群化，易水平扩展\n* 多种分布式事务协议支持\n  - TCC、SAGA、XA、事务消息\n\n## 与其他框架对比\n\n目前开源的分布式事务框架，暂未看到非Java语言有成熟的框架。而Java语言的较多，有阿里的SEATA、华为的ServiceComb-Pack，京东的shardingsphere，以及himly，tcc-transaction，ByteTCC等等，其中以seata应用最为广泛。\n\n下面是dtm和seata的主要特性对比：\n\n|  特性| DTM | SEATA |备注|\n|:-----:|:----:|:----:|:----:|\n| 支持语言 |\u003cspan style=\"color:green\"\u003eGolang、python、php及其他\u003c/span\u003e|\u003cspan style=\"color:orange\"\u003eJava\u003c/span\u003e|dtm可轻松接入一门新语言|\n|异常处理| \u003cspan style=\"color:green\"\u003e[子事务屏障自动处理](https://zhuanlan.zhihu.com/p/388444465)\u003c/span\u003e|\u003cspan style=\"color:orange\"\u003e手动处理\u003c/span\u003e |dtm解决了幂等、悬挂、空补偿|\n| TCC事务| \u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e||\n| XA事务|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e||\n|AT事务|\u003cspan style=\"color:red\"\u003e✗\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|AT与XA类似，性能更好，但有脏回滚|\n| SAGA事务 |\u003cspan style=\"color:orange\"\u003e简单模式\u003c/span\u003e |\u003cspan style=\"color:green\"\u003e状态机复杂模式\u003c/span\u003e |dtm的状态机模式在规划中|\n|事务消息|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:red\"\u003e✗\u003c/span\u003e|dtm提供类似rocketmq的事务消息|\n|通信协议|HTTP|dubbo等协议，无HTTP|dtm后续将支持grpc类协议|\n|star数量|\u003cimg src=\"https://img.shields.io/github/stars/dtm-labs/dtm.svg?style=social\" alt=\"github stars\"/\u003e|\u003cimg src=\"https://img.shields.io/github/stars/seata/seata.svg?style=social\" alt=\"github stars\"/\u003e|dtm从20210604发布0.1，发展快|\n\n从上面对比的特性来看，如果您的语言栈包含了Java之外的语言，那么dtm是您的首选。如果您的语言栈是Java，您也可以选择接入dtm，使用子事务屏障技术，简化您的业务编写。\n\n## typescript使用\n\n```ts\nimport * as dtmcli from \"dtmcli\"\n\n// 使用Msg模式需要先初始化DB model\nasync function startup() {\n  const sequelize = await getDB();\n  dtmcli.init({\n    sequelize,\n  });\n}\n\nasync function FireTcc() {\n  let dtm = \"http://localhost:8080/api/dtmsvr\"\n  let svc = \"http://localhost:4005/api/msg/testDtm\"\n  await dtmcli.tccGlobalTransaction(dtm, async (t: dtmcli.Tcc) =\u003e {\n    let req = { amount: 30 }\n    console.log(\"calling trans out\")\n    await t.callBranch(req, svc + \"/TransOutTry\", svc + \"/TransOutConfirm\", svc + \"/TransOutCancel\")\n    console.log(\"calling trans in\")\n    await t.callBranch(req, svc + \"/TransInTry\", svc + \"/TransInConfirm\", svc + \"/TransInCancel\")\n  })\n}\n\nasync function FireSaga() {\n  let dtm = \"http://localhost:36789/api/dtmsvr\" // dtm服务地址\n  let svc = \"http://localhost:4005/api\" // 本地服务前缀\n  let req = { amount: 30 } // 子事务需要的负荷\n  const saga = new dtmcli.Saga(dtm, await dtmcli.mustGenGid(dtm))\n  saga.add(svc+'/TransOut', svc+'/TransOutCompensate', req)\n  saga.add(svc+'/TransIn', svc+'/TransInCompensate', req)\n\n  await saga.submit()\n}\n\nasync function FireSagaConcurrent() {\n  let dtm = \"http://localhost:36789/api/dtmsvr\" // dtm服务地址\n  let svc = \"http://localhost:4005/api\" // 本地服务前缀\n  let req = { amount: 30 } // 子事务需要的负荷\n  const saga = new dtmcli.Saga(dtm, await dtmcli.mustGenGid(dtm))\n\n  saga.add(svc+'/TransOut', svc+'/TransOutCompensate', req)\n  saga.add(svc+'/TransOut', svc+'/TransOutCompensate', req)\n  saga.add(svc+'/TransIn', svc+'/TransInCompensate', req)\n  saga.add(svc+'/TransIn', svc+'/TransInCompensate', req)\n  saga.addBranchOrder(2, [0, 1]).addBranchOrder(3, [0, 1])\n  saga.enableConcurrent()\n\n  await saga.submit()\n}\n\nasync function FireMsg() {\n  let req = { amount: 30 } // 子事务需要的负荷\n  const gid = await dtmcli.mustGenGid(dtm)\n  const msg = new dtmcli.Msg(dtm, gid).add(`${svc }/TransOut`, req).add(`${svc }/TransIn`, req)\n  await msg.prepare(`${svc }/query`)\n  await msg.submit()\n}\n\n\nasync function FireMsgWithLocalTransaction() {\n  const req = { amount: 30 }\n  const gid = await dtmcli.mustGenGid(dtm)\n  const seuqelize = await getDB()\n  const msg = new dtmcli.Msg(dtm, gid).add(`${svc }/TransIn`, req)\n  await msg.doAndSubmitDB(`${svc }/query`, seuqelize, async (tx) =\u003e {\n    await transUserBalance(tx, transOutUid, -req.amount)\n  })\n}\n```\n\n## javascript使用\n\n```js\nconst dtmcli = require(\"dtmcli\")\n\nasync function FireTcc() {\n  let dtm = \"http://localhost:8080/api/dtmsvr\"\n  let svc = \"http://localhost:4005/api\"\n  await dtmcli.tccGlobalTransaction(dtm, async (t) =\u003e {\n    let req = { amount: 30 }\n    console.log(\"calling trans out\")\n    await t.callBranch(req, svc + \"/TransOutTry\", svc + \"/TransOutConfirm\", svc + \"/TransOutCancel\")\n    console.log(\"calling trans in\")\n    await t.callBranch(req, svc + \"/TransInTry\", svc + \"/TransInConfirm\", svc + \"/TransInCancel\")\n  })\n}\n```\n\n## 可运行的使用示例\n\n见[https://github.com/dtm-labs/dtmcli-node-sample](https://github.com/dtm-labs/dtmcli-node-sample)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtm-labs%2Fdtmcli-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdtm-labs%2Fdtmcli-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtm-labs%2Fdtmcli-node/lists"}