【问题标题】:Consume all messages using MassTransit使用 MassTransit 使用所有消息
【发布时间】:2016-03-25 07:59:03
【问题描述】:

我目前正在构建一个使用 MassTransit 和 RabbitMQ 作为我的消息传递层的系统。我试图找到一种方法来让消费者监听总线上所有类型的所有消息。这适用于我们的审计日志框架,我们希望记录通过消息总线的所有事件。

有没有办法在 MassTransit 中做到这一点?

【问题讨论】:

  • 您找到合适的方法了吗?我目前在Observer 路径上,但这似乎没有帮助。添加界面的建议可能很有趣,但我正在寻找一种更强大的方法。观察者:masstransit-project.com/MassTransit/usage/observers.html
  • 我做了界面的事情;如果您想记录整个消息(我需要这样做),我可以在上下文对象的元数据中找到它
  • 啊,谢谢!这正是我想要做的。

标签: c# masstransit


【解决方案1】:

您需要为您的消息添加某种类型的审核接口,以便出于审核目的进行订阅。例如,如果您要创建一个基本接口:

public interface IAuditable
{
    DateTime Timestamp {get;}
    string Username {get}
}

或者任何必须普遍可用于审计的属性。然后您可以订阅该界面并获取每条消息的副本。或者,您可以将其设为空接口并仅审核消息标头。但是消息需要实现它并发布它以获得副本。

这似乎是个坏主意,因为您正在到处创建消息的副本...

另一种方法是将观察者添加到消息消费中,并使用该观察者写入审计存储或将消息发送到审计队列并让异步消费者写入审计存储。

问题是,如果您正在审核每条消息,并且每条消息都在发送审核消息,请确保您没有观察您的审核使用者,否则您将无限死亡。

观察者选项是我最喜欢的,因为它不仅记录消息,还允许捕获处置(成功/错误),以及消耗消息的主机、处理持续时间等。

【讨论】:

  • 克里斯,我从您的回答中了解到接口继承会导致消息重复。他们不是也被观察者复制了吗? (通过发送“审计消息”)。顺便说一句,您会推荐哪些用例在 MassTransit 中进行接口继承?谢谢
【解决方案2】:

MassTransit 内置了对审计的支持
请参阅此链接: https://masstransit-project.com/advanced/audit.html

所以你最好使用他们的内置功能,而不是创建观察者和其他黑客

需要为每条消息保存两个主要部分以提供完整的审计:

  • 消息本身
  • 元数据

消息元数据包括:

  • 消息 ID
  • 消息类型
  • 上下文类型(发送、发布或使用)
  • 对话 ID
  • 相关 ID
  • 启动器 ID
  • 请求 ID(用于请求/响应)
  • 源地址
  • 目标地址
  • 响应地址(用于请求/响应)
  • 故障地址

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2021-12-09
    • 2023-02-26
    • 2023-03-29
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多