你能保证事件只发布一​​次到事件中心吗?

Can you guarantee exactly once publishing of event to Event Hub?

我知道将单个事件中心消息传递给消费者至少一次,并且我可以看到大量关于此的文档。但是,如果我是事件发布者,我是否可以保证我的事件只发布一​​次到流中?

鉴于我无法收到消息发布成功与否的响应,我不得不重试。有什么可以阻止我的活动在集线器上被复制吗?

否;在 Event Hubs 生态系统中没有 exactly-once 的保证。

也就是说,如果您愿意依赖测试版,Azure.Messaging.EventHubs 在 v5.7.0-beta.x 中引入了一个新的缓冲生产者,它支持幂等重试。启用此功能后,生产者使用的隐式重试将有助于防止重复。

但是请务必注意,这是尽力而为,不会改变 at-least-once 保证。发布时不管重复,消费者应该期待和防范阅读重复事件。

要启用它,您需要将缓冲生产者配置为类似于:

var connectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";

var options = new EventHubBufferedProducerClientOptions
{
    EnableIdempotentRetries = true
};

var producer = new EventHubBufferedProducerClient(
    connectionString, 
    eventHubName, 
    options);

有关缓冲生产者的更多信息,请参阅 SDK 的 Publishing Events sample

虽然我们目前的目标是 5 月初,但我们还没有确定稳定版的发布日期。请注意,我们不建议在关键生产场景中使用测试包。