У меня есть веб-джоб, который получает события щелчка на сайте от концентратора событий Azure, а затем загружает эти события в ADX.
public static async Task Run([EventHubTrigger] EventData[] events, ILogger logger)
{
// Process events
try
{
var ingestResult = await _adxIngester.IngestAsync(events);
if (!ingestResult)
{
AppInsightLogError();
logger.LogError();
}
}
catch(Exception ex)
{
AppInsighLogError();
logger.LogError()
}
}
Я использовал прием в очередь и отключил FlushImmediately
при входе в ADX, что позволяет использовать пакетный прием. Когда события не соответствуют принятой по умолчанию политике IngestionBatch в размере 1000 событий / 1 ГБ данных, ADX ждет 5 минут , пока не вернется Success
статус, что означает Run
также в течение этого времени.
public async Task<bool> IngestAsync(...)
{
IKustoQueuedIngestClient client = KustoIngestFactory.CreateQueuedIngestClient(kustoConnectionString);
var kustoIngestionProperties = new KustoQueuedIngestionProperties(databaseName: "myDB", tableName: "events")
{
ReportLevel = IngestionReportLevel.FailuresOnly,
ReportMethod = IngestionReportMethod.Table,
FlushImmediately = false
};
var streamIdentifier = Guid.NewGuid();
var clientResult = await client.IngestFromStreamAsync(...);
var ingestionStatus = clientResult.GetIngestionStatusBySourceId(streamIdentifier);
while (ingestionStatus.Status == Status.Pending)
{
await Task.Delay(TimeSpan.FromSeconds(15));
ingestionStatus = clientResult.GetIngestionStatusBySourceId(streamIdentifier);
}
if (ingestionStatus.Status == Status.Failed)
{
return false;
}
return true;
}
Поскольку я не хочу, чтобы моя веб-работа ждала так долго, когда не так много событий или просто QA работает, я внес следующие изменения:
- Дон't
await
on IngestAsync
, таким образом сделайте Run
синхронным методом - Добавьте параметр
Action onError
в IngestAsync
и вызовите его, если задача загрузки не удалась. Звоните AppInsightLogError()
и logger.LogError()
внутри onError
вместо возврата false
- Замените
IngestFromStreamAsync
на IngestFromStream
В принципе, я хочу убедиться, что события достигают Azure Queue и выдает исключение (если есть), прежде чем я запрашиваю статус загрузки, затем выйдите из метода Run
, и мне не придется ждать опроса статуса, если что-то не получится, то это будет журнал.
Мой вопрос:
- Является ли хорошей практикой избегать минут веб-работы? Если нет, то почему?
- Если да, достаточно ли мое решение для этой проблемы? Иначе как мне это сделать?