Согласно привязкам хранилища BLOB-объектов Azure для документации по функциям Azure , при настройке триггера BLOB-объектов можно использовать сопоставление с шаблоном для имени BLOB-объекта, чтобы отобразить части пути к переменным в функции, например.
[FunctionName("BlobTriggered")]
public static void BlobTriggered(
[BlobTrigger("myContainer/{name}.{extension}")] Stream myBlob,
string name,
string extension,
TraceWriter log)
{
// Given the blob path "myContainer/myBlob.png":
// name == "myBlob"
// extension == "png"
}
Я проверил это, и оно отлично работает для моего случая использования, однако из-за больших задержек при запуске BlobTrigger
(часто более 5 минут) это нереальный вариант.В результате я хочу сделать этот триггер таблицы событий вместо этого в соответствии с предложением из Шкала функций Azure и документация хостинга :
Когда вы используетеТриггер BLOB-объекта в плане потребления может задерживать обработку новых BLOB-объектов до 10 минут.Эта задержка происходит, когда приложение-функция бездействует.После запуска приложения функции капли обрабатываются немедленно.Чтобы избежать этой задержки холодного запуска, используйте план службы приложений с включенным Always On или используйте триггер Event Grid.
Есть ли способ получить такое же поведение сопоставления с образцом из привязки ввода вместотриггера?
В моей конкретной ситуации я настроил подписку EventGrid
для создания BLOB-объектов, которая запускает функцию оркестратора, вызывающую функцию Activity для чтения и анализа BLOB-объектов:
[FunctionName("NewBlobCreated")]
public static async Task NewBlobCreated(
[EventGridTrigger]EventGridEvent eventGridEvent,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
// Start our orchestrator function to read the file
string instanceId = await starter.StartNewAsync(
"OrchestrateBlobReader",
eventGridEvent);
}
// Orchestrator function
[FunctionName("OrchestrateBlobReader")]
public static async Task OrchestrateBlobReader(
[OrchestrationTrigger] DurableOrchestrationContext context,
ILogger log)
{
var eventGridEvent = context.GetInput<EventGridEvent>();
var parsedBlob = await context.CallActivityAsync<string>("ReadBlob", eventGridEvent.Data);
...
}
[FunctionName("ReadBlob")]
public static async Task<string> ReadBlob(
[ActivityTrigger] JObject eventData,
[Blob("{data.url}", FileAccess.Read)]CloudBlockBlob blob,
ILogger log)
{
using (var blobStream = await blob.OpenReadAsync())
{
// Blob is able to be read from blobStream here
...
}
}
В идеале я бынапример, чтобы моя ReadBlob
функция вела себя так же, как и функция BlobTriggered
из первого примера выше, чтобы сделать что-то вроде следующего:
[FunctionName("ReadBlob")]
public static async Task<string> ReadBlob(
[ActivityTrigger] JObject eventData,
[Blob("{data.url}", FileAccess.Read)]CloudBlockBlob blob,
string extension,
ILogger log)
{
if (extension.Equals("txt", StringComparison.OrdinalIgnoreCase))
{ ... }
else if (extension.Equals("png", StringComparison.OrdinalIgnoreCase)
{ ... }
else
{ ... }
}
Проблема в том, что я не вижу ничегоспособ привязки параметра extension
к входной привязке Blob
, как я делал для BlobTrigger
- особенно с помощью пути, привязанного к URL-адресу, предоставленному EventGridEvent
в форме eventData
JObject
.
Можно ли добиться такой же функциональности сопоставления с образцом в этом случае?Или мне придется самому анализировать строку пути для извлечения соответствующей информации?