我有一个nurevicebus主机4.7.5的天蓝色工作者角色。该主机在azure servicebus传输和主题上发送事件。有没有办法延迟发送事件或设置一些属性,以确保在主题订阅延迟后出现消息?主机在注意到主数据库发生更改后发送事件。有几个辅助数据库,主要数据写入被复制到其中。接收器也是使用nservicebus主机并订阅主题的azure worker角色。
当接收方收到消息时,由于复制滞后,辅助节点可能会出现不同步数据。
一个选项是使用主数据库来读取,但这是我不想采取的路线。
答案 0 :(得分:3)
是否有可能在订阅终端中提前失败并让重试处理它?您可以微调重试次数/延迟,以确保在重试消息之前更新辅助数据库。
您仍然需要找到从数据库中查找数据的最佳方法,以及区分事件版本的方法。您可以在更新时使用版本号或上次更新日期,或者只在创建时使用标识符进行查找。
从辅助数据库读取数据的端点可能有一个这样的事件处理程序:
public class CustomerCreationHandler : IHandlesMessage<CustomerCreated>
{
public void Handle(CustomerCreated @event)
{
var customer = Database.Load(@event.CustomerId);
if(customer == null)
{
throw new CustomerNotFoundException("Customer was not found.");
}
//Your business logic goes here
}
}
您可以控制事件处理程序重试的次数以及每次尝试之间的延迟时间。在这种情况下,将通过第一级重试重试该消息,然后将其移交给下面配置的第二级重试。
class ProvideConfiguration :
IProvideConfiguration<SecondLevelRetriesConfig>
{
public SecondLevelRetriesConfig GetConfiguration()
{
return new SecondLevelRetriesConfig
{
Enabled = true,
NumberOfRetries = 2,
TimeIncrease = TimeSpan.FromSeconds(10)
};
}
}
或者,您可以将延迟消息发送到同一端点,然后在经过一定时间后发布实际事件,而不是仅发布事件。