我有一个带有 nservicebus 主机 4.7.5 的天蓝色工作角色。该主机通过 azure servicebus 传输发送事件并将事件发送到主题。有没有办法延迟事件的发送或设置某些属性以确保消息在主题订阅延迟后出现?主机在注意到主数据库中发生更改后发送事件。主数据写入被复制到多个辅助数据库中。接收者也是使用 nservicebus 主机并订阅主题的 azure 辅助角色。
当接收方收到消息时,由于复制滞后,辅助节点的数据可能不同步。
一个选择是使用主数据库来读取,但这是我不想采取的路线。
最佳答案
是否有可能在您的订阅端点中提前失败并让重试来处理它?您可以微调重试次数/延迟,以确保在重试消息之前更新辅助数据库。
您仍然需要找到从数据库中查找数据的最佳方法以及区分事件中的版本的方法。您可以在更新时使用版本号或上次更新日期,或者在创建时仅通过标识符进行查找。
从辅助数据库读取数据的端点可能有一个如下的事件处理程序:
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)
};
}
}
或者,您不仅可以发布事件,还可以向同一端点发送延迟消息,然后在经过一定时间后发布实际事件。
关于Nservicebus 延迟发布事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292518/