3

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

构建包装器超出了问题的范围。我正在努力的是能够动态地创建一个范围并在那里存储值。

注意 – 我使用的是“严格”模式,它不允许在节点中进行动态范围。所以需要另一种方式。注意 – 我正在使用 Promises 进行客户端-服务器调用。

4

2 回答 2

4

这是我最终解决的方法-</p>

我使用了 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 的方式(释义和简化)–</p>

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 等

于 2017-06-13T16:06:15.327 回答
1

Sequelize,最流行的 orm 之一使用模块连续本地存储来完成此操作

希望能帮到你

于 2017-06-09T20:53:49.103 回答