[英]How to we do dynamic-scoping to implement transaction tracing in NodeJs?
我正在建立一个客户端和服务器端框架(NodeJs),我想在其中跟踪事务。 我可以在客户端和服务器之间传递标头(transaction_id),但是,我希望能够自动设置transaction_id。 这意味着,如果定义了标头,则中间件应该能够在上下文中读取和设置事务ID,以便下游调用可以读取它。
建筑包装材料不在问题范围内。 我正在努力的是能够动态创建范围并在那里存储值。
注–我正在使用“严格”模式,该模式不允许在节点中进行动态作用域。 因此需要另一种方式。 注–我正在使用Promises进行客户端-服务器呼叫。
这是我最终解决的方式–
我使用了CLS,它使我们能够跟踪动态范围。
阅读有关CLS的所有文本都花了一段时间,所以这里是我所做的摘要(外行术语)
注意-我正在以“严格”模式使用NodeJ。 这意味着我不能使用动态作用域。 鉴于其生产系统,我想保持严格的模式。 因此是实现动态作用域的另一种方法。
1)CLS创建动态上下文/范围。 这样,我们便可以设置/获取只有在我们创建的范围内才可见的键-值对。
2)由于我使用的是Bluebird的Promises,CLS要求我使用补丁以使Promises中的上下文/范围保持可用。 https://www.npmjs.com/package/cls-bluebird
3)将CLS与Promises结合使用需要花费一些时间才能弄清楚。 这是有关不同库如何使用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,最流行的orm之一,使用模块延续本地存储来实现
希望对您有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.