Как использовать большое количество журналов в ASP.Net Web API - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в разработке API и хочу создать конечную точку Web API, которая будет получать большой объем данных журнала.И я хочу отправить эти данные в Amazon s3 bucket через Amazon Kinesis поток доставки .Ниже приведен пример приложения, которое работает FINE, , но у меня нет НИКАКОГО КЛЮЧЕВОГО ПОЛУЧЕНИЯ большого ввода данных и в каком формате мой 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: В реальном приложении у меня не будет этого цикла.Я хочу, чтобы мой API принимал большие данные. Каким должно быть определение моего API?Нужно ли использовать что-то под названием multiform / data , file ?Пожалуйста, ведите меня.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

У меня нет особого контекста, поэтому в основном я попытаюсь дать ответ, исходя из того, как я его вижу.

Во-первых, вместо отправки данных в webapi, я бы отправлял данные непосредственно на S3.В Azure есть токен общего доступа, поэтому вы отправляете запрос в api, чтобы указать URL-адрес для загрузки файла (есть много вариантов, но вы можете ограничить по времени, ограничить по IP, который может загружать).Таким образом, чтобы загрузить файл 1. Звоните, чтобы получить URL-адрес загрузки, 2. положить на этот URL-адрес.Похоже, в Amazon это называется Signed Policy .

После этой функции записи лямбда, которая будет запускаться при загрузке S3, эта функция будет отправлять событие (Опять же, я не знаю, как это происходит в AWS, нов Azure я отправлю сообщение Blob Queue) это событие будет содержать URL-адрес файла и начальную позицию.

Напишите вторую лямбду, которая слушает события и фактически выполняет обработку, поэтому в моих приложениях иногда я знаю, что обрабатывать N элементовэто занимает 10 секунд, поэтому я обычно выбираю N, чтобы он был не длиннее 10-20 секунд из-за характера развертываний.После того, как вы обработали N строк и еще не закончили, отправьте то же событие, но теперь Начальная позиция = Начальная позиция в начале + N. Дополнительная информация Как читать диапазон

Разработав этот способ, вы можете обрабатывать большиефайлы, тем более вы можете быть умнее, потому что вы можете отправлять несколько событий, где вы можете сказать Начальная строка, Конечная строка, чтобы вы могли обрабатывать ваш файл в нескольких случаях.

PS.Почему я не рекомендую вам загружать файлы в WebApi, потому что эти файлы будут в памяти, поэтому предположим, что у вас есть файлы размером 1 ГБ, отправляемые из нескольких источников, в этом случае вы убьете свои серверы за считанные минуты.

PS2.Формат файла зависит, может быть JSON, так как это самый простой способ чтения этих файлов, но имейте в виду, что если у вас большие файлы, будет дорого читать весь файл в память.Вот пример того, как правильно их читать .Таким образом, другой вариант может быть простым файлом, тогда его будет легко прочитать, так как тогда вы можете прочитать диапазон и обработать его

PS3.В Azure я бы использовал Пакетные задания Azure

0 голосов
/ 12 февраля 2019

Вот мой мыслительный процесс.Поскольку вы предоставляете API для ведения журнала, ваш ввод должен содержать следующие атрибуты

  • Уровень журнала (информация, отладка, предупреждение, фатальный)
  • Сообщение журнала (строка)
  • Идентификатор приложения
  • Идентификатор экземпляра приложения
  • IP-адрес приложения
  • Хост (компьютер, на котором была зарегистрирована ошибка)
  • Идентификатор пользователя (для которогопроизошла ошибка)
  • Метка времени в Utc (время, когда произошла ошибка)
  • Дополнительные данные (настраиваемые как xml / json)

Я предлагаю выставитьAPI как AWS лямбда через Gateway API, так как это поможет в масштабировании при увеличении нагрузки.

Чтобы взять пример того, как построить API и использовать привязку модели, вы можете обратиться https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

...