簡體   English   中英

如何在ASP.Net Web API中攝取大量日志

[英]How to ingest large amount of logs in ASP.Net Web API

我是API開發的新手,我想創建一個Web API端點,它將接收大量的日志數據。 我想通過Amazon Kinesis交付流將該數據發送到Amazon s3存儲桶 下面是一個可以正常運行的示例應用程序, 但是我不知道如何獲取大量數據,API應該以哪種格式接收數據 我的API端點應該是什么樣子。

 [HttpPost]
 public async void Post() // HOW to allow it to receive large chunk of data?
 {
        await WriteToStream();
 }

    private async Task WriteToStream()
    {
        const string myStreamName = "test";
        Console.Error.WriteLine("Putting records in stream : " + myStreamName);
        // Write 10 UTF-8 encoded records to the stream.
        for (int j = 0; j < 10000; ++j)
        {
        // I AM HARDCODING DATA HERE FROM THE LOOP COUNTER!!! 
            byte[] dataAsBytes = Encoding.UTF8.GetBytes("testdata-" + j);
            using (MemoryStream memoryStream = new MemoryStream(dataAsBytes))
            {
                    PutRecordRequest putRecord = new PutRecordRequest();
                    putRecord.DeliveryStreamName = myStreamName;
                    Record record = new Record();
                    record.Data = memoryStream;
                    putRecord.Record = record;
                    await kinesisClient.PutRecordAsync(putRecord);
            }
        }
    }

PS:在實際應用中,我不會使用for循環。 我希望我的API吸收大數據,我的API的定義應該是什么? 我需要使用一種稱為multiform / data的 文件嗎? 請指導我。

這是我的思考過程。 在公開用於記錄的API時,您的輸入應包含以下屬性

  • 日志級別(信息,調試,警告,致命)
  • 日志消息(字符串)
  • 申請編號
  • 應用程序實例ID
  • 應用IP
  • 主機(記錄錯誤的計算機)
  • 用戶ID(發生錯誤的用戶)
  • Utc中的時間戳(發生錯誤的時間)
  • 附加數據(可定制為xml / json)

我建議通過網關API將API公開為AWS lambda,因為它將有助於隨着負載的增加而擴展。

要獲取有關如何構建API和使用模型綁定的示例,請參閱https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/formats-and-model-binding/model-validation-在-ASPNET-Web的API

我沒有太多背景信息,因此基本上會嘗試從我的看法中提供答案。

首先,不是將數據發送到webapi,而是將數據直接發送到S3。 在蔚藍中,存在共享訪問令牌,因此您向api發送請求以向您提供url上載文件的位置(有很多選項,但您可以限制時間,可以限制可以上傳IP的IP)。 因此,要上傳文件1.進行調用以獲取上傳網址,2.放入該網址。 看起來在Amazon中它稱為“ 簽名策略”

寫完lambda函數(將在S3上傳時觸發)之后,該函數將發送事件(同樣,我不知道其在AWS中的運行方式,但天藍色將發送Blob Queue消息),該事件將包含指向文件的URL和起始位置。

編寫第二個Lambda來偵聽事件並進行實際處理,因此在我的應用程序中有時我知道處理N個項目需要10秒鍾,因此由於部署的性質,我通常選擇N為不超過10-20秒的時間。 在處理了N行並且尚未完成之后,發送相同的事件,但是現在開始位置=乞求時的開始位置+N。 更多信息如何讀取范圍

通過這種方式設計,您可以處理大文件,甚至可以變得更聰明,因為您可以發送多個事件,在其中可以說出“開始行”,“結束行”,這樣便可以在多個實例中處理文件。

PS。 為什么我不建議您將文件上傳到WebApi,因為這些文件將存儲在內存中,所以可以說您有多個源發送1GB的文件,在這種情況下,您將在幾分鍾之內殺死服務器。

PS2。 文件格式取決於,因為它是讀取這些文件的最簡單方法,所以它可能是json,但請記住,如果您有大文件,則將整個文件讀取到內存中會很昂貴。 這是如何正確閱讀它們的示例 因此,其他選項可能只是平面文件,因此易於閱讀,因為這樣您就可以讀取范圍並進行處理

PS3。 天藍色,我將使用Azure批處理作業

暫無
暫無

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

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