【发布时间】:2023-03-08 17:01:01
【问题描述】:
我正在研究一些 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 是某种包含步骤的场景,每个场景都被发送到队列,然后由消费者维护。
每次在消费者网站上完成每个步骤时,我都想从消费者那里获得某种
ACK信息发送给发布者(例如,如果它最终成功与否。我还想获得有关哪个消费者收到消息的信息。
每条消息(场景)都应该被视为原子操作,因此不应该在不同的消费者上执行步骤,如果某个步骤没有成功结束,那么整个场景应该被视为失败。
是否可以使用以下架构来解决这两个要求,还是我需要使用更多的东西?
【问题讨论】:
-
基于上述要求的即用型项目已发布并可在此处获得:github.com/kownet/Station/releases/tag/0.2 如果有人感兴趣。