首页 > 解决方案 > 事件中心 将事件发送到随机分区但恰好是一个分区

问题描述

我有事件中心发布者,但它在随机分区中多次复制消息。我想要大量消息的并行消息,这些消息应该随机进入,但恰好在消费者应该从中获取数据的一个分区中。

我怎么做 。这导致消息被重复。

EventHubProducerClientOptions producerClientOptions = new EventHubProducerClientOptions
{
    RetryOptions = new EventHubsRetryOptions
    {
        Mode = EventHubsRetryMode.Exponential,
        MaximumRetries = 30,
        TryTimeout = TimeSpan.FromSeconds(5),
        Delay = TimeSpan.FromSeconds(10),
        MaximumDelay = TimeSpan.FromSeconds(15),
    }
};
using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

// Add events to the batch. An event is a represented by a collection of bytes and metadata.
eventBatch.TryAdd(eventMessage);

string logInfo = $"[PUBLISHED - [{EventId}]] =======> {message}";
logger.LogInformation(logInfo);

// Use the producer client to send the batch of events to the event hub
await producerClient.SendAsync(eventBatch);

标签: azure-eventhub

解决方案


您的代码示例正在将您的批次发布到事件中心网关,在该网关中事件将被路由到一个分区。对于成功的发布操作,每个事件将仅发送到一个分区。

“成功”是这句话的关键。您将重试策略配置TryTimeout为 5 秒并允许重试 30 次。您看到的重复很可能是由于您的发布请求因时间间隔很短而超时,服务已成功接收,但服务无法确认成功。这将导致客户端认为操作失败并重试。

默认情况下,TryTimeout时间间隔为 60 秒。我不确定您为什么选择将超时限制在这么小的值,但我强烈建议您考虑更改。尊敬的,除非您已经完成分析和测量以证明您需要进行更改,否则我建议您使用默认值进行全部重试。


推荐阅读