如何做dynamic范围在NodeJs中实现事务跟踪?

我正在构build一个客户端和一个服务器端框架(NodeJs),我想跟踪交易。 我有能力在客户端和服务器之间传递标题(transaction_id),但是,我希望能够自动设置transaction_id。 这意味着,如果定义了头部,中间件应该能够在上下文中读取和设置事务ID,以便下游调用可以读取它。

build筑包装不在问题的范围之内。 我正在努力的是能够dynamic地创build一个范围并在那里存储值。

注 – 我使用“严格”模式,禁止在节点中进行dynamic范围设定。 所以需要另一种方式。 注 – 我正在使用Promise进行客户端 – 服务器调用。

这是我最终如何解决的 –

我使用CLS,这使我们能够跟踪dynamic范围。

通过CLS周围的所有文字阅读需要一段时间,所以这里是我所做的(外行术语)的总结,

注 – 我正在使用“严格”模式的NodeJs。 这意味着我不能使用dynamic范围。 鉴于其生产体系,我想保持严格的模式。 因此,实现dynamic范围的替代方法。

1)CLS创build一个dynamic的上下文/作用域。 这使我们可以设置/获取只有在创build的范围内才可见的键值对。

2)由于我正在使用蓝鸟的承诺,因此CLS要求我使用补丁来保持Promise中的上下文/作用域。 https://www.npmjs.com/package/cls-bluebird

3)用Promise使用CLS需要时间来弄清楚。 以下是关于不同图书馆如何使用CLS产生不同结果的大讨论。 https://github.com/TimBeyer/cls-bluebird/issues/6

4)这就是我使用CLS(释义和简化)的方式 –

var cls = require('continuation-local-storage'); var clsbluebird = require('cls-bluebird'); var namespace = cls.createNamespace('ns'); clsbluebird( namespace ); var result; namespace.run(function() { namespace.set('key', 'value'); result = abc(); // returns 'value' }); // versus doing – result = abc(); // returns undefined function abc() { return namespace.get('key'); } 

5)用例 – 这样,我实现了事务的基本跟踪。 例如。 NewRelic,Trace等

Sequelize是最stream行的orm之一,它使用模块连续本地存储

希望能帮助你

Interesting Posts