azure-eventhub - 事件中心 将事件发送到随机分区但恰好是一个分区
问题描述
我有事件中心发布者,但它在随机分区中多次复制消息。我想要大量消息的并行消息,这些消息应该随机进入,但恰好在消费者应该从中获取数据的一个分区中。
我怎么做 。这导致消息被重复。
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);
解决方案
您的代码示例正在将您的批次发布到事件中心网关,在该网关中事件将被路由到一个分区。对于成功的发布操作,每个事件将仅发送到一个分区。
“成功”是这句话的关键。您将重试策略配置TryTimeout
为 5 秒并允许重试 30 次。您看到的重复很可能是由于您的发布请求因时间间隔很短而超时,服务已成功接收,但服务无法确认成功。这将导致客户端认为操作失败并重试。
默认情况下,TryTimeout
时间间隔为 60 秒。我不确定您为什么选择将超时限制在这么小的值,但我强烈建议您考虑更改。尊敬的,除非您已经完成分析和测量以证明您需要进行更改,否则我建议您使用默认值进行全部重试。
推荐阅读
- html - 在这种情况下,元素 arcticle 不允许作为元素 main 的子元素
- javascript - 仅在找到 4 个特定单词时匹配的正则表达式
- typescript - 是否可以定义实现接口而不实现的类?
- javascript - javascript中有toBool函数吗?
- unity3d - 为什么我的着色器调用 UnityObjectToClipPos() 导致我的 *other* 着色器不可见?
- ios - UICollectionView 消耗垂直平移手势
- postgresql - 在 PostgreSQL 中克隆表
- linux - 如何引用 xargs {} 中保存的对象/字符串的基本名称
- vuejs3 - Vue JS 3 类绑定不适用
- python - 将任务添加到运行循环并运行直到完成