C# 如何限制从EventProcessorHost调用Blob存储?

C# 如何限制从EventProcessorHost调用Blob存储?,c#,azure-eventhub,C#,Azure Eventhub,我有两个Azure EventHub,每个都有32个分区。每秒大约有700个事件通过EventHub,首先通过一个,然后通过另一个。一个EventHub有3个并发读卡器/EventProcessorHost,另一个只有一个 我的问题是,C#EventProcessorHost似乎对blob存储进行了大量调用,用于租赁管理和检查点之类的事情。我们平均每秒通话800次 我们像这样注册EventProcessorHost \u eventProcessorHost=新的eventProcessorHo

我有两个Azure EventHub,每个都有32个分区。每秒大约有700个事件通过EventHub,首先通过一个,然后通过另一个。一个EventHub有3个并发读卡器/EventProcessorHost,另一个只有一个

我的问题是,C#EventProcessorHost似乎对blob存储进行了大量调用,用于租赁管理和检查点之类的事情。我们平均每秒通话800次

我们像这样注册EventProcessorHost

\u eventProcessorHost=新的eventProcessorHost(
_eventHubOptions.CurrentValue.EventHubName,
_eventHubOptions.CurrentValue.ConsumerGroupName??PartitionReceiver.DefaultConsumerGroupName,
_eventHubOptions.CurrentValue.EventHubConnectionString,
_eventHubOptions.CurrentValue.StorageConnectionString,
_eventHubOptions.CurrentValue.StorageName);
//降低存储帐户的租约续订吞吐量以节省价格
_eventProcessorHost.PartitionManagerOptions=新的PartitionManagerOptions()
{
LeaseDuration=从秒开始的时间跨度(60),
RenewanInterval=TimeSpan.FromSeconds(50)
};
var eventProcessorOptions=新的eventProcessorOptions
{
InitialOffsetProvider=分区ID=>
EventPosition.FromEnd(),
EnableReceiverRuntimeMetric=true,
MaxBatchSize=400,
预取计数=400,
};
wait _eventProcessorHost.RegisterEventProcessorFactoryAsync(_eventProcessorFactory,eventProcessorOptions);
我们希望限制对存储的呼叫数量。正如您在上面看到的,我们还将租赁期限从默认的30秒延长到了最大的60秒

我们已经实现了它,所以检查点每2000条消息发生一次,这意味着,每个分区平均每15秒发生一次检查点


这是协调EventProcessorHosts的正常存储调用量吗?是否有其他我可以打开的拨号盘或旋钮,例如调整分区以限制存储呼叫的数量?

鉴于您已经优化了处理器主机和分区管理器选项,我只能推荐以下几点:

  • 减少分区的数量。单个分区最多可以处理1MB/秒或1K事件/秒。当然,除非消费者在处理事件期间进行大量计算

  • 如果主机空闲运行,则减少主机数量。这将有助于减少源于每个主机的存储I/O开销


  • 总共有多少台主机在运行?请注意,每台主机都会增加存储I/O开销。@SerkantKaraca一台EventHub上有3台主机,另一台主机上有一台主机。我可以确认,在每个eventhub上以相同的吞吐量/代码将请求从500/秒降低到1.5/秒。当您缩小分区时,存储I/O的下降是预期的。考虑到您正在处理的工作量,我认为没有理由扩展到32个分区。请注意,每个分区最多可支持1MB/秒或1K事件/秒。我们希望在全面运行时以32个分区的速度运行,并且由于我们不希望存储I/O的扩展足以花费大量资金,因此我们认为没有任何理由不让32个分区保持打开状态。