我想问一下Rebus Timeout Manager。我知道我们有内部超时管理器和外部超时管理器,我已经使用内部超时管理程序很长一段时间了。我一直在为我的所有端点共享一个超时数据库(SqlServer(。我想知道这是否正确。其次,我想知道我是否也可以为我的所有端点使用一个外部超时管理器。我的问题来自这样一个事实,即Timeouts表中包含的信息(id、due_time、headers、body(与向超时管理器发送消息的端点没有连接。
我只是想得到保证。问候
您肯定可以像当前一样使用内部超时管理器。
基于MSSSQL的超时存储可以安全地从多个实例同时使用,因为它在读取到期消息时使用了一些经过微调的锁定提示,从而防止了由于并发访问而可能发生的问题。
但是,创建一个专用的超时管理器,然后配置所有其他Rebus实例来使用它,也是一种有效的(通常也是非常明智的(方法。
您完全正确地认为,超时的发送方是不相关的。收件人是在发送超时时确定的,因此
await bus.DeferLocal(TimeSpan.FromMinutes(2), "HELLO FROM THE PAST 🙂");
将字符串发送到总线自己的输入队列,并且
await bus.Defer(TimeSpan.FromMinutes(2), "HELLO FROM THE PAST 🙂");
将字符串发送到映射为字符串所有者的队列:
.Routing(r => r.TypeBased().Map<string>("string-owner"))
在这两种情况下,消息将实际发送到超时管理器,超时管理器将读取rbs2-deferred-until
和rbs2-defer-recipient
标头,并保留消息直到到期。