【发布时间】: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