【问题标题】:UseInMemoryOutbox in Masstransit State Machine, Preserve Order of Publish MessagesMasstransit状态机中的UseInMemoryOutbox,保留发布消息的顺序
【发布时间】:2017-07-24 14:46:13
【问题描述】:

我有一个配置了 UseInMemoryOutbox() 的 MT 状态机,因此作为事件处理一部分的任何消息将仅在管道中的最后一步成功完成后发布,在我的情况下,状态持久性是沙发床。

        Initially(When(A).
                    ThenAsync(async context =>
                    {   
                        context.Instance.IsAutoApprove = context.Data.IsAutoApprove;
                        IList<Task> publishTasks = context.Data.SomeList.Select(item =>
                        {
                            MessageA message = new MessageA
                            {
                                Content = "contentA"
                            };
                            return context.Publish(message);
                        }).ToList();

                        await Task.WhenAll(publishTasks);
                    }).TransitionTo(B));

        WhenEnter(B, f => f.If(c => c.Instance.IsAutoApprove,
            callback =>
            callback.TransitionTo(C)
            ));

        WhenEnter(C, c => c.Publish<SagaState, MessageC>(context =>
                     new MessageC
                     {
                         Content = "contentC"
                     }));

我注意到发布消息最终会以不一致的顺序发布。

例如 - 假设第一个事件中的“SomeList”中有两个项目,因此消息有时会按此顺序发布:

MessageC
MessageA
MessageA

有时

MessageA
MessageA
MessageC

等等。 不保留逻辑流的顺序。

你能帮我解决这个问题吗?

我正在使用

大众运输 3.5.2

MassTransit.Automatonymous 3.5.2

MassTransit.RabbitMQ 3.5.2

自动 3.5.11

GreenPipes 1.0.9

谢谢,

【问题讨论】:

  • 老实说,我从不期望消息按特定顺序出现。 RabbitMQ 不提供这样的保证,依赖它是不明智的。

标签: masstransit saga automatonymous


【解决方案1】:

这是出于性能原因而做的事情,但实际上并没有什么意义,所以我提交了一个问题并关闭了它。

https://github.com/MassTransit/MassTransit/issues/945

在 v4 中,动作将按顺序执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2015-09-06
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多