【问题标题】:Rebus: Multiple sagas handling same message -OR- best practice for request/reply in sagaRebus:多个 sagas 处理相同的消息 - 或者 - saga 中请求/回复的最佳实践
【发布时间】:2021-05-18 03:37:11
【问题描述】:

我有一个场景,我在 Saga 中处理一条消息,可能需要更多信息,因此发送一条我希望得到回复的请求消息。

问题是回复没有当前 saga 独有的信息 - 它有一个我想使用的 ID,但多个 saga 可能同时请求此 ID,因此 Rebus 不允许它(例外:@ 987654321@).

如果没有办法让多个 saga 处理单个消息,那么我的替代方法是能够将回复与请求的 saga 相匹配。据我所知,曾经有对此的支持,但在以后的版本中被删除了。

我已经尝试使用 rbs2-corr-id 标头来实现它,并且它在我的测试中有效,但感觉就像一个 hack。

有没有更好的方法呢?不修改消息?

我考虑过使用另一个 saga 作为一种代理,方法是关联可能共享的 ID 并拥有原始 saga 的相关 ID 列表。但是我担心可能存在并发问题导致原始 saga 等待代理 saga。

以下代码应该会显示问题:

public class Message
{
    public Guid Id { get; set; }
    public int OtherId { get; set; }
}

public class Request
{
    public int OtherId { get; set; }
}

public class Response
{
    public int OtherId { get; set; }
    public string MissingInfo { get; set; }
}

public class SagaData : ISagaData
{
    public Guid Id { get; set; }
    public int Revision { get; set; }

    public Guid MessageId { get; set; }
    public int OtherId { get; set; }
}

public class MySaga : Saga<SagaData>, IAmInitiatedBy<Message>, IHandleMessages<Response>
{
    IBus _bus;

    public MySaga(IBus bus)
    {
        _bus = bus;
    }

    public async Task Handle(Message message)
    {
        Data.OtherId = message.OtherId;

        // Send Request expecting someone to .Reply(new Response { OtherId = ,... })
        await _bus.Send(new Request { OtherId = message.OtherId });
    }

    public async Task Handle(Response message)
    {
        // Do something with message.MissingInfo
    }

    protected override void CorrelateMessages(ICorrelationConfig<SagaData> config)
    {
        config.Correlate((Message m) => m.Id, s => s.MessageId);

        // This works as long as only one saga has this ID
        config.Correlate((Response m) => m.OtherId, s => s.OtherId);
    }
}

【问题讨论】:

    标签: rebus


    【解决方案1】:

    我已经尝试使用 rbs2-corr-id 标头来实现它,并且它在我的测试中有效,但是感觉就像是 hack。

    嗯...这是一个聪明的技巧。 ? 我认为这实际上是你能做的最好的:利用请求的关联 ID 在你的控制之下,回复将带回相同的关联 ID。

    当您收到回复时,如何将关联 ID 设置为您希望再次看到的 ID?

    然后你将你的回复与类似的东西关联起来

    protected override void CorrelateMessages(ICorrelationConfig<InviteToTeamByEmail> config)
    {
        config.CorrelateHeader<YourReply>(Headers.CorrelationId, d => d.Bla);
    }
    
    

    (假设关联属性的名称实际上是Bla...?)

    【讨论】:

    • 这是我的确切解决方案 - 除了实际的属性名称;)
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2023-03-09
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多