【问题标题】:How to ingest large amount of logs in ASP.Net Web API如何在 ASP.Net Web API 中摄取大量日志
【发布时间】:2019-02-12 13:56:33
【问题描述】:

我是 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);
            }
        }
    }

P.S:在现实世界的应用程序中,我不会有那个 for 循环。我希望我的 API 能够摄取大数据,我的 API 应该如何定义?我需要使用名为 multiform/datafile 的东西吗?请指导我。

【问题讨论】:

  • 目的是什么?您想阅读并将其发送到 s3 吗?还是你要分析?
  • 是的,我将使用 Athena 来分析它。
  • 如何在我的端点接收应用程序日志数据?你能提供一个示例吗?我的API 应该以什么格式接收数据
  • @VolodymyrBilyachat:请指导我。
  • WebApi 是处理这些数据的错误方式。文件有多大?

标签: c# .net rest asp.net-web-api asp.net-web-api2


【解决方案1】:

这是我的思考过程。当您公开用于日志记录的 API 时,您的输入应包含以下属性

  • 日志级别(信息、调试、警告、致命)
  • 日志消息(字符串)
  • 应用程序 ID
  • 应用程序实例 ID
  • 应用IP
  • 主机(记录错误的机器)
  • 用户 ID(发生错误的用户)
  • UTC 时间戳(发生错误的时间)
  • 附加数据(可自定义为 xml / json)

我建议通过网关 API 将 API 公开为 AWS lambda,因为这将有助于随着负载的增加进行扩展。

如何构建API和使用模型绑定的示例,您可以参考https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

【讨论】:

    【解决方案2】:

    我没有太多上下文,所以基本上会尝试根据我的看法提供答案。

    首先我不会将数据发送到 webapi,而是将数据直接发送到 S3。在 azure 中有共享访问令牌,因此您向您的 api 发送请求,为您提供上传文件的 url(有很多选项,但您可以按时间限制,按可以上传的 IP 限制)。所以要上传文件 1. 调用以获取上传 URL,2. PUT 到该 URL。看起来在亚马逊它叫Signed Policy

    在 S3 上传时将触发的写入 lambda 函数之后,此函数将发送事件(我再次不知道它在 AWS 中如何,但在 azure 中我将发送 Blob Queue 消息)此事件将包含 url 到文件并启动位置。

    编写第二个 Lambda,它监听事件并进行实际处理,所以在我的应用程序中,有时我知道处理 N 个项目需要 10 秒,所以我通常选择 N 不超过 10-20 秒,因为自然的部署。在您处理了 N 行但尚未完成发送相同事件但现在开始位置 = 乞讨的开始位置 + N.More info 如何读取范围

    以这种方式设计您可以处理大文件,甚至可以更聪明,因为您可以发送多个事件,您可以在其中说出 Start Line、End Line,这样您就可以在多个实例中处理您的文件。

    PS。为什么我不建议您将文件上传到 WebApi,因为这些文件将在内存中,所以假设您有 1GB 的文件从多个来源发送,在这种情况下您将在几分钟内杀死您的服务器。

    PS2。文件格式取决于,可能是 json,因为它是读取这些文件的最简单方法,但请记住,如果您有大文件,将整个文件读取到内存中会很昂贵。这是example how to read them properly。所以其他选项可能只是平面文件,然后很容易阅读,从那时起你可以阅读范围并处理它

    PS3。在天蓝色我会使用Azure Batch Jobs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-13
      • 2018-02-06
      • 2012-08-19
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多