Несколько приложений-функций Azure, указывающих на один контейнер BLOB-объектов (триггер) - PullRequest
0 голосов
/ 18 декабря 2018

В нашей среде разработки у нас есть несколько сред, работающих с одним и тем же приложением функций, но все среды указывают на одну и ту же учетную запись хранилища / контейнер больших двоичных объектов.

Я заметил, что при вставке большого двоичного объекта BLOB запускается, в нескольких средах, могут забрать один и тот же BLOB-объект одновременно.Я уверен, что очевидно, как это будет проблемой с этого момента.

Есть ли способ предотвратить это ??Предложение относительно лучшего триггера для использования в этой ситуации?

Я бы ожидал, что квитанция будет глобальной для BLOB-объекта, а не для конкретной среды.

1 Ответ

0 голосов
/ 18 декабря 2018

Среда выполнения функций / хосты (в каждой локальной среде), в которых выполняются функции Azure, изолированы друг от друга, поэтому они оба сканируют входящие большие двоичные объекты и хранят квитанции отдельно.

Внутренне каждый хост создает свою собственную очередьсообщения (информация о поступающем блобе) для триггера Blob.Я предлагаю работать с централизованной очередью.

  1. Отправлять сообщения (имя BLOB-объекта) в очередь, когда BLOB-объекты вставляются с использованием кода.Если мы вручную загружаем большие двоичные объекты с помощью портала или обозревателя хранилища, я предлагаю создать триггер Blob с привязкой вывода очереди для отправки сообщений, обратите внимание, что этот триггер должен работать только на одном хосте.Использование триггера BLOB здесь плохое решение, так как мы на самом деле получаем BLOB-объекты дважды, но это единственный способ, который я могу предоставить для ручной загрузки.

    // v2 C# Blob Trigger sample for manual upload
    public static void Run([BlobTrigger("mycontainer/{name}")]Stream myBlob, 
        [Queue("myqueue")]out string message,
        string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}");
        message = name;
    }
    
  2. Использование триггера очереди для получения сообщений от этогоочереди, затем получите блоб, используя привязку ввода Blob.Таким образом, мы можем гарантировать, что BLOB-объекты будут извлечены один раз среди всех хостов.

    // v2 C# sample
    public static void Run([QueueTrigger("myqueue")]string blobName, ILogger log,
        [Blob("mycontainer/{queuetrigger}",FileAccess.Read)]Stream myBlob)
    {
        log.LogInformation($"C# Queue trigger function processed: {blobName}");
        log.LogInformation($"\n Size: {myBlob.Length} Bytes");
    }
    

Если вы используете функцию v1, есть другое простое решение для локального разработчика.С этими настройками Blob Trigger на всех хостах совместно используют одни и те же внутренние очереди и поступления BLOB-объектов.

  1. В local.settings.json убедитесь, что каждый проект Function имеет одинаковое значение для AzureWebJobsStorage (где поступления BLOB-объектов,внутреннюю очередь и т. д. найти).
  2. В host.json добавьте одинаковые id (используйте для создания имени квитанций и внутренней очереди BLOB-объектов) для каждого хоста, например "id":"localhost-1300897049".
...