繁体   English   中英

我们如何进行动态范围分析以在NodeJ中实现事务跟踪?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM