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