【问题标题】:Carrying request context through the stack and across thrift service boundaries with Node.js使用 Node.js 通过堆栈和跨节俭服务边界携带请求上下文
【发布时间】:2016-08-03 20:56:11
【问题描述】:

我正在尝试找出一种适当的方法来通过我的堆栈携带请求 ID(来自 restify 请求标头的 x-request-id);跨节俭的服务间调用,以及rabbitmq队列消息。目标是在任何地方、任何服务中,我都可以将错误或事件关联回发起的 http 请求。是否有使用 Node 执行此操作的已知做法?我想避免在几乎每个函数调用中传递上下文。

我研究了 New Relic 处理仪器的方式,还有这个博客:https://opbeat.com/blog/posts/how-we-instrument-nodejs/;但是这些类型的检测需要挂钩到大量的节点核心库调用,并且对于在 thrift 调用中传递上下文并没有真正的帮助。

如何从请求中获取诸如“x-request-id”之类的 restify 标头 ID,并在我的堆栈中更深入地访问它(即使在异步回调中),而无需修改每个函数以传递值?

我也在寻找一种干净的方法来通过所有 thrift 调用(跨服务边界获取它)。

这适用于 TypeScript 和 Node.js 5.x

谢谢!

【问题讨论】:

    标签: node.js typescript microservices restify


    【解决方案1】:

    是否有使用 Node 执行此操作的已知做法

    在 NodeJs 中,您可以将 request 移动到您需要的任何地方请求上下文内容

    对于所有其他系统,您需要以该事物的请求系统格式携带这些东西。例如。对于事件存储,我们将其存储在事件元数据中。

    为了节省开支,我建议将其作为属性添加到每个查询中,并在每个响应中回显。

    【讨论】:

    • 那么function(a,b,c, req) { ... } 方法?我希望避免修改所有函数来传递它,尽管它是可以生存的。这似乎是一个二等公民的解决方案,因为它不会强制执行/跟上它很痛苦。开发人员必须记住构建它。修改日志签名以需要 req 甚至不起作用,因为同事可能会选择不记录而不是修改几个函数签名来访问 req。我很感激这个答案,我只是好奇是否有办法减轻到处携带该参数的痛苦。
    • 使其成为第一个参数。或第二个(如果您将err 作为第一个)。这样开发人员就不会忘记添加它。
    • 我正在研究通过类的构造函数(而不是每个函数)传递它。我们也一直在考虑引入 inversify 来进行依赖管理——所以也许一些静态路由方法可以提取上下文,并为下游依赖注入配置提供程序。这可以使它几乎透明,尽管使用 Thrift 和 Queues 我们将不得不使用附加属性和元数据属性。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多