Синхронная обработка нескольких файлов одновременно с помощью функций Azure - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть функция Azure, которая извлекает имена и URL-адреса файлов из контейнера больших двоичных объектов, а затем отправляет эту информацию в другую функцию для обработки этих файлов (распаковывает их и сохраняет их в Datalake)

Для извлечения больших двоичных объектов:

string storageConnectionString = @"myconnstring";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("Container");

IEnumerable<IListBlobItem> blobs = new IListBlobItem[0];

foreach (IListBlobItem blobItem in container.ListBlobs())
     {                
        if (blobItem is CloudBlobDirectory)
           {
              CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
              blobs = directory.ListBlobs(true);                    
           }

      }

 await ProcessBlobs(blobs); 

и функция для обработки болтов:

public static async Task ProcessBlobs(IEnumerable<IListBlobItem> blobs)
    {

        var tasks = blobs.Select(currentblob =>
        {
            string FileUrl = currentblob.Uri.ToString();
            string FileName = currentblob.Uri.Segments.Last();
            //string content = "{ \"fileUri\": \""+ currentblob.Uri.ToString()+ "\" , \"fileName\": \""+ currentblob.Uri.Segments.Last()+"\"}";

            var values = new Dictionary<string, string>
                {
                    { "fileUri", currentblob.Uri.ToString() },
                    { "fileName", currentblob.Uri.Segments.Last() }
                };
            var content = new FormUrlEncodedContent(values);
            string baseURL = @"https://<afu>.azurewebsites.net/api/process_zip_files_by_http_trigger?code=45"; ;
            //string urlToInvoke = string.Format("{0}&name={1}", baseURL, FileUrl, FileName);


            return RunAsync(baseURL, content);
        });
        await Task.WhenAll(tasks);
    }

    public static async Task RunAsync(string i_URL, FormUrlEncodedContent content)
    {
        var response = await client.PostAsync(i_URL, content);
        var responseString = await response.Content.ReadAsStringAsync();
        log.info(responseString);
    }

функция RunAsync обрабатывает файлы асинхронно.

Мой вопрос сейчас: это вообщеможно обрабатывать капли параллельно, но синхронно? У вас есть идея получше и проще для реализации моей цели?

1 Ответ

1 голос
/ 07 ноября 2019

Это один из лучших вариантов использования для Durable Functions . В частности, Fan-Out / Fan-In Pattern .

Всего вам потребуется 4 функции

  1. GetBlobList Функция Activity
    Здесь вы можете получить список больших двоичных объектов для обработки. Вместо этого вы получите список BLOB-объектов вместо реальных BLOB-объектов.

  2. ProcessBlob Функция Activity
    Эта функция принимает BLOB-объектpath, выбирает большой двоичный объект и обрабатывает его.

  3. Функция оркестратора
    Эта функция, вызывающая функцию GetBlobList, циклически повторяетсяВозвращается список путей к BLOB-объектам и вызывает функцию ProcessBlob для каждого пути BLOB-объектов.

  4. Функция запуска ( Клиентская функция )
    ThisФункция просто запускает оркестровку. Обычно это запускаемая по HTTP функция.

Если вы новичок в Durable Functions, лучше всего пройтись по quickstart doc , чтобы понять различные типы требуемых функций.

...