【发布时间】:2020-09-02 12:55:00
【问题描述】:
因此,我需要在 WebAPI (.Net core 3.1) 应用程序中实现消费者,阅读 Microsoft 文档并观看有关它的几个视频,我得到了这个解决方案。
这是 IServiceCollection 的扩展方法,我从 Startup.cs 调用它来实例化我的 Consumer(连接字符串和容器名称仅用于测试):
private static async Task AddPropostaEventHub(this IServiceCollection services)
{
const string eventHubName = "EVENT HUB NAME";
const string ehubNamespaceConnectionString = "EVENT HUB CONNECTION STRING";
const string blobContainerName = "BLOB CONTAINER NAME";
const string blobStorageConnectionString = "BLOB CONNECTION STRING";
string consumerGroup = EventHubConsumerClient.DefaultConsumerGroupName;
BlobContainerClient storageClient = new BlobContainerClient(blobStorageConnectionString, blobContainerName);
EventProcessorClient processor = new EventProcessorClient(storageClient, consumerGroup, ehubNamespaceConnectionString, eventHubName);
processor.ProcessEventAsync += ProcessEvent.ProcessEventHandler;
processor.ProcessErrorAsync += ProcessEvent.ProcessErrorHandler;
await processor.StartProcessingAsync();
}
ProcessorEventHandler 类:
public static class ProcessEvent
{
public static async Task ProcessEventHandler(ProcessEventArgs eventArgs)
{
var result = Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray());
//DO STUFF
await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken);
}
public static Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs)
{
//DO STUFF
return Task.CompletedTask;
}
}
这段代码可以运行,但我的问题是:这样实现它可以吗?如果消费者从不停止,会有问题吗?它可以阻止我的代码中的其他任务(或请求)吗?
有没有更好的方法在 .Net Core 中使用 Dependecy Injection 来实现它?
我找不到任何人在 WebApi 中实现的示例,这是有原因的吗?
【问题讨论】:
-
您能否帮助我从业务环境中更好地理解您要解决的方案?正如您所指出的,处理器通常是您希望持续运行的东西,而不是在每个请求的瞬态容量中运行,这将使托管作为 Web 应用程序的一部分不是理想的选择。
-
@JesseSquire,场景就像你描述的那样。有人说在WebAPI中实现作为中间件消费者(比如ServiceBus可以运行),但我不知道这是否是实现它的最佳方式,或者我是否应该在我的Api之外创建一个处理器工作。
-
如果不更深入地了解应用程序上下文,就很难概括推荐。你想对这些事件做什么?它们对您的应用程序/业务意味着什么?阅读它们的时机有多敏感?
-
@JesseSquire 我需要捕获事件并将它们发送到传统的 WebService (SOAP),基本上。这个过程非常基础,但对我们的业务非常重要。由于与 StreamSets 框架的集成,我们使用 EventHub。但我认为我们可以使用 ServiceBus。
-
无论您使用的是事件中心还是服务总线,WebAPI 都绝对不是正确的主机。无论哪种情况,您都需要一个平台,您可以在该平台上持久运行并在代理公开事件/消息时处理它们,或者您可以按计划运行,检查消息,读取直到代理为空,然后回去睡觉。是否可以使用服务进程来托管或 Azure 函数?是什么让您考虑为此使用 Web 应用程序?
标签: c# azure .net-core azure-eventhub webapi