簡體   English   中英

Azure 事件中心 - 如何在 .Net Core WebAPI 中實現使用者?

[英]Azure Event Hubs - How to implement a consumer in .Net Core WebAPI?

因此,我需要在 WebAPI(.Net core 3.1)應用程序中實現一個消費者,並閱讀 Microsoft 文檔並觀看有關它的幾個視頻,我得到了這個解決方案。

這是 IServiceCollection 的擴展方法,我從 Startup.cs 調用它來實例化我的消費者(連接字符串和容器名稱僅用於測試):

    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 中的依賴注入來實現它?

我找不到任何人在 WebApi 中實現的例子,有什么原因嗎?

正如 Jesse Squire 所提到的,WebAPI 不一定是正確的實現方法,但它主要取決於您的目標是什么。

如果您制作的 API 還包括事件中心偵聽器,則應在IHostedService 接口下實現它。 您現有的AddPropostaEventHub()方法進入接口的StartAsync(CancellationToken cancellationToken) ,這是 .NET Core 用於啟動后台任務的方法。 然后,在 Startup.cs 中,將處理程序注冊為services.AddHostedService<EventHubService>(); . 這可確保正確處理長時間運行的偵聽器,而不會阻止傳入的 HTTP 請求。

如果您還沒有涉及 API 或能夠完全拆分流程,那么您應該考慮將其創建為控制台應用程序而不是托管服務,這進一步分離了 API 和事件偵聽器的角色。

你沒有提到你在哪里部署它,但如果你碰巧部署到 Azure 應用服務,你確實有幾個選項可以將接收器從你的 API 中分離出來,在這種情況下,我肯定會建議這樣做。 在應用服務內部,有一個稱為WebJobs的功能,它專門用於處理此類事情,而無需將其作為 API 的一部分。 一個不錯的選擇是Functions 在這種情況下,您根本不必擔心為事件中心設置 DI,主機進程會為您處理這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM