簡體   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