我正在利用 Azure SDK 的服务将遥测数据记录到 Azure 事件中心。我的客户端应用程序调用一个 API 端点,该端点实例化 EventHubProducerClient 以将数据记录到事件中心。我正在管理许多 api 调用,并且想知道 EventHubProducerClient 是否可以在多个调用中重用,或者我应该在每个调用中使用一个新实例。
是的。
EventHubProducerClient
在应用程序的生命周期内可以安全地缓存和使用,这是当应用程序定期或半定期发布事件时使用的最佳实践。在内部,生产者将管理其底层资源,并透明地尝试在不活动期间保持较低的资源使用率,并在较高使用期间管理其健康状况。
在应用程序关闭时调用其
CloseAsync
方法将确保正确清理网络资源和其他非托管对象。
旁注:
EventHubProducerClient
的一个常见问题是,如果可以安全地视为长寿,为什么要实施 IAsyncDisposable
。这样做的部分原因是为了在发布非常罕见且资源是应用程序关注的场景中提供便利,部分原因是为了模仿 HttpClient
的模式。
这是我使用的实现,我在所有调用中重用它。
public class MyEventHubService : IMyEventHubService, IAsyncDisposable
{
public MyEventHubService(ILogger logger, IOptions<MyConfigs> MyConfigs)
{
this.myConfigs = myConfigs?.Value;
this.logger = logger;
this.eventHubProducerClient = new EventHubProducerClient(this.myConfigs.EventHubConnection, this.myConfigs.EventHubName);
this.logger.LogInfo($"{nameof(MyEventHubService)} created EventHubProducerClient");
}
// Implementations of my interface goes here
public async ValueTask DisposeAsync()
{
// Perform async cleanup.
await DisposeAsyncCore();
// Suppress finalization.
GC.SuppressFinalize(this);
}
private async Task DisposeAsyncCore()
{
await this.eventHubProducerClient.DisposeAsync();
}
}