包含来自消费者

时间:2017-04-19 11:31:52

标签: c# rabbitmq easynetq

我正在研究一些POC project并尝试解决以下问题。

我有一个Publisher正在向队列发送消息:

bus.PublishAsync<IBaseScenario>(new TestScenario())
            .ContinueWith(task =>
            {
                if (task.IsCompleted && !task.IsFaulted)
                    Console.WriteLine("TestScenario queued with success.");
                else
                    Console.WriteLine(task.Exception.Message);
            });

正在消费消息的一些Consumers

bus.SubscribeAsync<IBaseScenario>("test_1_consumer",
            message => Task.Factory.StartNew(() =>
            {
                var testScenario = message as TestScenario;
                var anotherTestScenario = message as AnotherTestScenario;

                ResolveScenario(testScenario);
                ResolveScenario(anotherTestScenario);

            }).ContinueWith(task =>
            {
                if (task.IsCompleted && !task.IsFaulted)
                    Console.WriteLine("Task ended up with success.");
                else
                    Console.WriteLine(task.Exception.Message);
            }));

此时一切正常,但这是我想要实现的目标。

我的Message是某种包含步骤的场景,每个场景都会发送到队列,然后由消费者维护。

  1. 我希望每次在Consumer网站上完成每个步骤时,都会从Consumer发送给Publisher的某种ACK信息(例如,如果它最终成功了。< / p>

  2. 我想了解一下消费者收到消息的信息。

  3. 每条消息(场景)都应该被视为原子操作,因此不应该对不同的消费者采取措施,如果某些步骤没有成功结束,那么整个场景应该被视为失败。

    使用以下架构是否可以解决这两个要求,还是需要使用更多内容?

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用EasyNetQ的请求响应模型https://github.com/EasyNetQ/EasyNetQ/wiki/Request-Response

在响应中,您可以放置​​处理邮件的使用者的身份以及该方案的最终状态。如果在一个消息中发送一个方案,并且该方案包含所有必需的步骤,则所有步骤将由单个消费者处理。

也就是说,消息重复始终是一个问题,因为要么发送消息两次,要么消费者在消费者失败后重新排队。如果场景永远不会被多次处理至关重要,那么您将需要实现消息重复数据删除或使每个场景具有幂等性。使用RabbitMQ时,这是生活中的一般事实。

相关问题