我正在研究一些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是某种包含步骤的场景,每个场景都会发送到队列,然后由消费者维护。
我希望每次在Consumer网站上完成每个步骤时,都会从Consumer发送给Publisher的某种ACK
信息(例如,如果它最终成功了。< / p>
我想了解一下消费者收到消息的信息。
每条消息(场景)都应该被视为原子操作,因此不应该对不同的消费者采取措施,如果某些步骤没有成功结束,那么整个场景应该被视为失败。
使用以下架构是否可以解决这两个要求,还是需要使用更多内容?
答案 0 :(得分:0)
最简单的方法是使用EasyNetQ的请求响应模型https://github.com/EasyNetQ/EasyNetQ/wiki/Request-Response
在响应中,您可以放置处理邮件的使用者的身份以及该方案的最终状态。如果在一个消息中发送一个方案,并且该方案包含所有必需的步骤,则所有步骤将由单个消费者处理。
也就是说,消息重复始终是一个问题,因为要么发送消息两次,要么消费者在消费者失败后重新排队。如果场景永远不会被多次处理至关重要,那么您将需要实现消息重复数据删除或使每个场景具有幂等性。使用RabbitMQ时,这是生活中的一般事实。