重试Azure存储表实体更新的循环(并发失败)

时间:2019-03-06 16:22:56

标签: concurrency azure-functions azure-table-storage csx

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

我在博客文章(https://blog.jeremylikness.com/build-a-serverless-link-shortener-with-analytics-faster-than-finishing-your-latte-8c094bb1df2c)中看到的URL缩短项目遇到了一些并发问题

我已经链接了.csx / C#脚本函数。由于“ keyTable”参数是Azure表中的一个条目,该问题具有分区键:“ KEY”,并且每个请求的增量ID都存在问题。当多次调用“ UrlIngest”函数时,当多个函数实例尝试将同一行插入到Azure表中时,这可能会导致失败。

我想尝试执行“重试循环”,如果发生故障,我将从存储中再次获取“ keyTable”,对其进行递增,然后重试,但是我不确定如何执行此操作。这是我添加的代码示例。它将无法正常工作,因为我无法在keyTable和'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);    

}

0 个答案:

没有答案