使用 ASP.NET 使用 Azure Tables 进行实时数据存储
Real time data storage with Azure Tables using ASP.NET
我正在使用 Lab View 应用程序来模拟测试 运行,它将 post 一个 JSON 字符串发送到我的 ASP.NET 应用程序。在 ASP.NET 应用程序中,我使用适当的分区键和行键格式化数据,然后将其发送到 Azure Table 存储。
我遇到的问题是,在一段看似随机的时间后(即 5 分钟、2 小时、5 小时),数据未能保存到 Azure。我尝试捕获 ASP.NET 应用程序中的任何异常并将错误消息发送回 Lab View 应用程序,并且 Lab View 应用程序也捕获可能遇到的任何异常,因此我可以解决问题发生的位置。
我能够捕捉到的唯一错误是 Lab View 程序中的 Timeout Error 56。我的问题是,有没有人知道我应该在哪里寻找根本原因?我不知道从哪里开始。
编辑:
我正在使用我发现 here 的 table 存储写入器来执行批处理操作并重试。
您需要检查异常是否是暂时的。正如 Peter 在他的评论中所说,Azure 存储客户端已经实施了重试策略。您还可以使用另一个重试代码(例如使用 polly)包装您的代码,或者您应该更改与 Azure 存储客户端关联的默认策略。
指数重试策略的构造函数如下:
public ExponentialRetry(TimeSpan deltaBackoff, int maxAttempts)
当您(或您使用的库)将其实例化为 RetryPolicy = new ExponentialRetry(TimeSpan.FromMilliseconds(2),100)
时,您基本上将最大尝试次数设置为 100,这意味着您最终可能要等待大约 2^100 毫秒(那里这背后还有一些数学但只是简化)对于您的每个单独的批处理请求都会在客户端失败,直到 sdk 放弃重试。
该代码的另一个问题是它按顺序和同步执行批处理请求,这会产生多种不良影响,首先,所有后续批处理请求都被当前批处理请求阻塞,其次你的核心被阻塞等待 I/O 操作,第三,它没有异常处理,因此如果其中一个批处理操作抛出异常,该方法将退出并且不会继续处理其他批处理请求。
我的建议是,不要使用那个库,批处理操作相当简单。如果您没有明确定义,则默认重试策略无论如何都是指数重试策略,它具有合理的默认参数(进行 3 次重试),因此您甚至不需要定义自己的重试对象。为了获得最佳的可伸缩性和吞吐量 运行 您的批处理操作异步(并发)。
至于失败的原因,当您编写自己的 api 时,捕获 StorageException
并检查异常本身的 http 状态代码。作为一种可能性,您可能会受到 azure 的限制,但如果不进一步调试或您向我们提供失败的批处理操作的 http 状态代码,就很难说。
我正在使用 Lab View 应用程序来模拟测试 运行,它将 post 一个 JSON 字符串发送到我的 ASP.NET 应用程序。在 ASP.NET 应用程序中,我使用适当的分区键和行键格式化数据,然后将其发送到 Azure Table 存储。
我遇到的问题是,在一段看似随机的时间后(即 5 分钟、2 小时、5 小时),数据未能保存到 Azure。我尝试捕获 ASP.NET 应用程序中的任何异常并将错误消息发送回 Lab View 应用程序,并且 Lab View 应用程序也捕获可能遇到的任何异常,因此我可以解决问题发生的位置。
我能够捕捉到的唯一错误是 Lab View 程序中的 Timeout Error 56。我的问题是,有没有人知道我应该在哪里寻找根本原因?我不知道从哪里开始。
编辑:
我正在使用我发现 here 的 table 存储写入器来执行批处理操作并重试。
您需要检查异常是否是暂时的。正如 Peter 在他的评论中所说,Azure 存储客户端已经实施了重试策略。您还可以使用另一个重试代码(例如使用 polly)包装您的代码,或者您应该更改与 Azure 存储客户端关联的默认策略。
指数重试策略的构造函数如下:
public ExponentialRetry(TimeSpan deltaBackoff, int maxAttempts)
当您(或您使用的库)将其实例化为 RetryPolicy = new ExponentialRetry(TimeSpan.FromMilliseconds(2),100)
时,您基本上将最大尝试次数设置为 100,这意味着您最终可能要等待大约 2^100 毫秒(那里这背后还有一些数学但只是简化)对于您的每个单独的批处理请求都会在客户端失败,直到 sdk 放弃重试。
该代码的另一个问题是它按顺序和同步执行批处理请求,这会产生多种不良影响,首先,所有后续批处理请求都被当前批处理请求阻塞,其次你的核心被阻塞等待 I/O 操作,第三,它没有异常处理,因此如果其中一个批处理操作抛出异常,该方法将退出并且不会继续处理其他批处理请求。
我的建议是,不要使用那个库,批处理操作相当简单。如果您没有明确定义,则默认重试策略无论如何都是指数重试策略,它具有合理的默认参数(进行 3 次重试),因此您甚至不需要定义自己的重试对象。为了获得最佳的可伸缩性和吞吐量 运行 您的批处理操作异步(并发)。
至于失败的原因,当您编写自己的 api 时,捕获 StorageException
并检查异常本身的 http 状态代码。作为一种可能性,您可能会受到 azure 的限制,但如果不进一步调试或您向我们提供失败的批处理操作的 http 状态代码,就很难说。