【问题标题】:Instrumentation C# across Rabbit MQ跨 Rabbit MQ 检测 C#
【发布时间】:2018-08-08 12:43:54
【问题描述】:

我有一个 WPF 应用程序和一个从客户端应用程序获取队列中消息的工作进程。

有几个用户可以点击多个项目,从而将多个进程发送到队列中,因此我需要为每个用户设置某种唯一 ID。

我想为此实现检测日志记录,但我发现很难为该进程拥有一个主键或 ID。我有可以用作 ID 的消息 ID,但在调用方法时会丢失,我不想将其传递给每个方法。

例如,如果过程如下:

  1. 用户点击数据检索按钮
  2. 使用消息 ID 创建消息 -> 使用消息 ID 登录检测
  3. Worker 使用 Message Id 获取消息 -> 使用相同的消息 ID 登录工具
  4. 调用的数据检索方法(无消息 ID)-> 无法记录

基本上我不想将消息 ID 传递给每个方法(例如第 4 步),因为这会变得非常混乱。

我正在使用 Castle Proxies 来处理日志记录,但我再次找不到一个只为日志提供一个通用 ID 的好方法,因此我可以一直记录一个请求以及每个部分需要多长时间。

我有一些与此非常相似的东西: Instrumentation With Interceptors

除了被调用的每个方法的 ID 之外,我还需要一个整体 ID 来将整个请求组合在一起。

【问题讨论】:

  • 您会考虑使用“上下文”吗?因此,在处理消息时,将向每个提供者注入一个“上下文”。所以所有处理的数据都将用于这个“上下文”。并将上下文与您的消息 ID 相关联。
  • 我已经将它作为队列消费者的参数,例如:Consume(ConsumeContext context),它包含消息 ID,然后问题是如何将其传播到然后被调用而不必传递它。这是你的意思吗?
  • 我明白了,你所说的“记录”真的是指“记录”吗?据我所知,有两个选择:1.我不确定您的记录器是如何实现的。您可能需要注入记录器工厂。或者,2. 如果没有并行代码,则将用户视为 ThreadStatic。或 TPL 的 CallContext.GetLogicalData。但它看起来有点乱,特别是对于 TPL,你需要维护一个上下文。
  • CallContext 完美运行,谢谢!
  • @Steven.Xi 将其作为答案,我会将其标记为已回答

标签: c# instrumentation castle-dynamicproxy


【解决方案1】:

据我所知,有两个选项: 1. 我不确定您的记录器是如何实现的。您可能需要注入记录器工厂。或者,2. 如果没有并行代码,则将用户视为 ThreadStatic。或 TPL 的 CallContext.GetLogicalData。但它看起来有点混乱,尤其是对于 TPL,您需要维护一个上下文。

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2014-05-31
    • 2021-01-23
    相关资源
    最近更新 更多