[英]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时,您的输入应包含以下属性
我建议通过网关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.