多线程和多进程应用程序中的关联ID

时间:2018-03-17 15:02:32

标签: multithreading logging

我加入了一个遗留项目,几乎没有记录。几天前我们有一个大规模失败的产品发布,我们不知道发生了什么。这就是为什么改进伐木现在是优先考虑的原因之一。

我想介绍像"相关ID"这样的内容,但我不确定采取什么方法。谷歌搜索几乎总是带我到适合"微服务通过REST"建筑,这不是我的情况。

架构是在同一个Unix机器上运行的Spring Framework和NodeJS的混合体 - 它看起来像这样:

  1. Spring收到一个请求(第一个线程已启动)并进行次要处理。
  2. 处理从ThreadPool进入线程(第二个线程已启动)。
  3. 提到第二个线程启动一个单独的NodeJS进程,它进行一些HTML处理。
  4. 处理结束,第二个线程结束,第一个线程结束。
  5. 我想到的选项是:

    1. 生成UUID并将其作为参数传递。
    2. 生成UUID并将其存储在ThreadLocal中,在更改线程或启动进程时根据需要传递它。
    3. 其他任何想法如何才能正确完成?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。生成UUID并将其作为标头传递给请求。对于没有此标头的任何请求,添加一个检查它的过滤器并添加它。 您的过滤器将选择这样的标头,并将其放在线程本地,MDC可以从中挑选它。执行任何日志记录后,您将拥有相关ID。在调用任何其他进程/请求时,您需要确保将此id作为参数/标头传递。循环重复。

执行任务的线程应该只知道此ID。由你决定如何传递它。尝试将这些问题从您的商业逻辑(使用方面或您认为合适的任何其他方式)中分离出来,并且您可以更轻松地将它置于引擎盖下。

您可以参考此example