gpt4 book ai didi

multithreading - 使用 NIO 或 Netty 等事件驱动框架时如何跟踪请求过程

转载 作者:行者123 更新时间:2023-12-03 13:19:12 35 4
gpt4 key购买 nike

我们正在运行一个 Web 应用程序,它本身由几个微服务组成,对于每个请求,我们最终都需要调用一个 3rd-party 服务,这很耗时,通常需要几秒钟的时间。我们有一个要求,需要使用 跟踪每个请求的所有服务之间的所有处理日志。请求traceId .

在当前的实现中,我们使用基于线程的并发模型,每个服务中分配一个线程来处理从头到尾的请求,并在等待远程服务的响应时阻塞。很自然的把 traceId 进入 线程本地 这样我们就可以随时随地取回它。

但是基于线程的并发模型扩展性不好,我们倾向于改成 NIO/Event-driven 模型,尝试了 Netty,性能提升非常大。但是每个请求处理的不同阶段可能由 Netty 的不同线程处理,使得日志的跟踪非常棘手。

我们目前的考虑包括:

  • traceId 作为方法参数,无论如何它已经在请求中,但是如果深度嵌套的方法需要它,那就很不方便了。
  • 设置 traceId 进入 线程本地 在每个回调的开头。但我个人认为这种方法容易出错,并且可能会引入难以发现的竞争条件错误。

  • 那么在 NIO/事件驱动模型中解决这种跟踪问题的复杂/优雅的方法是什么?

    最佳答案

    我的 2 美分:如果您在 NIO/事件驱动模型中,那么您可能必须将“请求 id”从调用者传递给被调用者,然后返回给调用者(异步/偶数驱动方法)。这与线程或 channel ID 无关(一个 channel 可以重复用于各种查询,这样您就不必一次又一次地支付“连接”费用)。

    然后在调用方,您可以使用一个映射(甚至是通过任何持久性工具实现的映射)来恢复上下文并执行您需要做的事情。

    关于multithreading - 使用 NIO 或 Netty 等事件驱动框架时如何跟踪请求过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41507423/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com