我们在应用程序中使用AWS的DynamoDB Session提供程序来存储会话数据。
最近我切换到一个可以监控我的应用程序的 NewRelic 环境,它开始发出关于 DynamoDB 访问的警报。然而,NewRelic 是唯一能获取这个警报的监控工具。我无法在我的应用程序日志(log4net)或 Windows 事件查看器中看到任何与此问题相关的信息。
我搜索了很多并甚至查看了提供程序的源代码,但是没有发现任何问题。
我每小时会发生3到4次1到2分钟的调用,所有的调用都会得到(400)错误请求。
我获得的堆栈跟踪不太好:
从下面的时间图中,我们可以看到大部分时间所有请求都正常(图1),但当问题发生时,发送到DynamoDB的成功请求数量变为0(图1)。同时,错误数量激增(图2)。
更新:在周末的低使用期间,我在生产服务器上运行了Fiddler,以查看来自AWS的错误信息。我收到了“条件请求失败”的错误,这似乎是因为在请求旧值时值已被更新,因此该值与预期的不一致。以下是一个完整的请求/响应示例。
最近我切换到一个可以监控我的应用程序的 NewRelic 环境,它开始发出关于 DynamoDB 访问的警报。然而,NewRelic 是唯一能获取这个警报的监控工具。我无法在我的应用程序日志(log4net)或 Windows 事件查看器中看到任何与此问题相关的信息。
我搜索了很多并甚至查看了提供程序的源代码,但是没有发现任何问题。
我每小时会发生3到4次1到2分钟的调用,所有的调用都会得到(400)错误请求。
我获得的堆栈跟踪不太好:
at System.Net.HttpWebRequest.GetResponse()
at System.Net.HttpWebRequest.GetResponse()
at Amazon.Runtime.AmazonWebServiceClient.getResponseCallback(IAsyncResult result)
有问题的 URL 是:dynamodb.us-east-1.amazonaws.com/Stream/GetResponse
从下面的时间图中,我们可以看到大部分时间所有请求都正常(图1),但当问题发生时,发送到DynamoDB的成功请求数量变为0(图1)。同时,错误数量激增(图2)。
更新:在周末的低使用期间,我在生产服务器上运行了Fiddler,以查看来自AWS的错误信息。我收到了“条件请求失败”的错误,这似乎是因为在请求旧值时值已被更新,因此该值与预期的不一致。以下是一个完整的请求/响应示例。
请求:
POST https://dynamodb.us-east-1.amazonaws.com/ HTTP/1.1
X-Amz-Target: DynamoDB_20120810.UpdateItem
Content-Type: application/x-amz-json-1.0
User-Agent: aws-sdk-dotnet-35/2.0.15.0 .NET Runtime/4.0 .NET Framework/4.0 OS/6.2.9200.0 SessionStateProvider TableSync
Host: dynamodb.us-east-1.amazonaws.com
X-Amz-Date: 20140510T153947Z
X-Amz-Content-SHA256: e7a4886acac6ccf16f0da9be962d3a68bd50e381c202277033d0d2bb3208aa8a
Authorization: AWS4-HMAC-SHA256 Credential=redacted/20140510/us-east-1/dynamodb/aws4_request, SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date;x-amz-target, Signature=redacted
Accept: application/json
X-NewRelic-ID: redacted
X-NewRelic-Transaction: redacted
Content-Length: 399
{
"TableName": "ASP.NET_SessionState",
"Key": {
"SessionId": {
"S": "redacted"
}
},
"AttributeUpdates": {
"LockId": {
"Value": {
"S": "42a9ed29-7a92-4455-8733-2f56c7d974b3"
},
"Action": "PUT"
},
"Locked": {
"Value": {
"N": "1"
},
"Action": "PUT"
},
"LockDate": {
"Value": {
"S": "2014-05-10T15:39:47.324Z"
},
"Action": "PUT"
}
},
"Expected": {
"Locked": {
"Value": {
"N": "0"
},
"Exists": true
}
},
"ReturnValues": "ALL_NEW"
}
响应:
HTTP/1.1 400 Bad Request
x-amzn-RequestId: redacted
x-amz-crc32: redacted
Content-Type: application/x-amz-json-1.0
Content-Length: 120
Date: Sat, 10 May 2014 15:33:17 GMT
{
"__type": "com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException",
"message": "The conditional request failed"
}
图1
图2
感谢您的帮助。