Повторная петля для обновления объекта таблицы хранилища Azure (ошибка параллелизма) - PullRequest
0 голосов
/ 06 марта 2019

https://github.com/JeremyLikness/serverless-url-shortener/blob/master/functionApp/UrlIngest/run.csx

Я столкнулся с несколькими проблемами параллелизма с проектом сокращения URL, который я видел в сообщении в блоге (https://blog.jeremylikness.com/build-a-serverless-link-shortener-with-analytics-faster-than-finishing-your-latte-8c094bb1df2c)

Я связал.Функция сценария csx / C #. Существуют проблемы, связанные с параметром «keyTable», который является записью в таблице Azure с ключом раздела: «KEY» и int Id, который увеличивается на единицу при каждом запросе. При наличии нескольких вызовов «UrlIngest ", это может привести к сбою, когда несколько экземпляров функции пытаются вставить одну и ту же строку в таблицу Azure.

Я хочу попробовать выполнить цикл повторных попыток, где в случае сбоя я возьму 'keyTable 'из хранилища снова, увеличьте его и попробуйте снова, но я не совсем уверен, как это сделать. Вот пример кода, который я добавил. Он не будет работать, потому что я не могу выполнить преобразование между keyTable иa 'NextId'

for (var i = 0; i < 10; i++) {

    // Retry loop
    try {
        var operation = TableOperation.Replace(keyTable);
        await tableOut.ExecuteAsync(operation);
        break;

    }
    catch (Exception e) {
        log.Info($"got exception replacing keyTable. attempt {i}.");
        var retrieve = TableOperation.Retrieve<NextId>("1", "KEY");
        keyTable = await tableOut.ExecuteAsync(retrieve);
        keyTable++;
    }
}

log.Info($"Done.");
return req.CreateResponse(HttpStatusCode.OK, result);    

}

...