MassTransit 3.2.1 - 验证

MassTransit 3.2.1 - Validation

我想验证传入的消息,在我的例子中使用 FluentValidation,如果失败,它应该立即 return。我调查了 http://docs.masstransit-project.com/en/latest/usage/observers.html,就我而言,我喜欢

的想法

public class ConsumeObserver : IConsumeObserver
    {
    Task IConsumeObserver.PreConsume<T>(ConsumeContext<T> context)
    {
        //1.Validate here
        //2. If success go on to consumer
        //3. If fails exit with the result of validation and don't go through consumer.
    }

    Task IConsumeObserver.PostConsume<T>(ConsumeContext<T> context)
    {

    }

    Task IConsumeObserver.ConsumeFault<T>(ConsumeContext<T> context, Exception exception)
    {

    }
}

因为我得到的消息已经反序列化,所以很容易使用验证器。问题是我不知道如何在不通过消费者的情况下 return,同时保持验证错误。

谢谢。

观察者通常是观察而不是采取行动,这就是 MassTransit 中观察者的方法。虽然您可以从 PreConsume 方法中抛出异常,这会导致消息重试或发送到错误队列,但对于开发人员来说,这不是最明显的行为,他们可能不明白为什么消息是失败。

另一种方法是创建可以验证消息的中间件组件,如果它无效,则对消息执行特定操作(例如将其移动到无效队列,或将其转储到日志,或者随便)以便从队列中删除消息。了解这可能如何影响消息生成器很重要。

例如,如果它是一条请求消息,而发送方正在等待响应,则丢弃该消息意味着不会收到任何响应。引发异常的消费者的默认行为是将错误传播回请求者,完成循环,因此请记住这一点。

另一种选择是使用注入的验证接口或在消费者本身内将验证行为添加到消费者。这样,消息的处理就接近于消费者,这提高了代码的内聚性,并且可以很容易地看到正在发生的事情。

理想情况下,在消息生产者处进行验证是最好的选择,以避免队列中充斥着无效消息。所以这是另一种选择。

因此,有多种选择,您的要求将决定哪种选择最有意义。