Amazon web services 使用JMeter加载/测试AmazonSQS-并非所有消息都能通过
我正在尝试加载消息并测试我的AWS部署的应用程序,它通过SQS接收消息,我一直在尝试让JMeter这样做,但是我无法让JMeter与SQS正确通信 首先,我已将SQS设置为匿名访问,因此我根本不必担心凭据:Amazon web services 使用JMeter加载/测试AmazonSQS-并非所有消息都能通过,amazon-web-services,jmeter,amazon-sqs,Amazon Web Services,Jmeter,Amazon Sqs,我正在尝试加载消息并测试我的AWS部署的应用程序,它通过SQS接收消息,我一直在尝试让JMeter这样做,但是我无法让JMeter与SQS正确通信 首先,我已将SQS设置为匿名访问,因此我根本不必担心凭据: { "Version": "2012-10-17", "Id": "arn:aws:sqs:us-east-1:843348267853:testQueue/SQSDefaultPolicy", "Statement": [ { "Sid": "Sid1445
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:us-east-1:843348267853:testQueue/SQSDefaultPolicy",
"Statement": [
{
"Sid": "Sid1445050222773",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:843348267853:testQueue"
}
]
}
简单来说,我在Ubuntu机器上使用JMeterGUI,创建了一个线程组、一个HTTP默认值和一个HTTP请求
我的默认设置具有以下属性:
服务器名称:sqs.us-east-1.amazonaws.com
端口号:80
参数:Action=SendMessage
版本=2011-10-01
路径:/843348267853/testQueue
然后,我的HTTP请求具有以下属性:
方法:邮寄
参数:
MessageBody={发件人:发件人,事件:已启动,时间:20150623T214256Z,版本:1.0
}
注意:我没有检查编码?框中的任何参数
我的期望是,它将把缺省值中的参数与请求中的参数组合在一起,但是按照上面的格式,它会抛出
org.apache.http.conn.ConnectTimeoutException:连接到sqs.us-east-1.amazonaws.com:80超时
如果我将JSON消息用单引号括起来,它会抛出:
java.net.SocketTimeoutException:读取超时
我已经更改了“将多部分/表单数据用于POST和浏览器兼容的标题”设置,当我检查“查看结果”树中的“请求”选项卡时,它显示为:
职位
发布数据:
MessageBody=%7B%22发件人%22%3A%22发件人%22%2C%22事件%22%3A%22已开始%22%2C%22时间%22%3A%2220150623T214256Z%22%2C%22版本%22%3A%221.0%22%7D&Action=sendmages&Version=2011-10-01
[没有饼干]
请求标头:
连接:保持活力
内容类型:application/x-www-form-urlencoded
我假设SQS不喜欢URL编码
我尝试过设置各种内容类型的标题、转义引号等,但都不起作用
我假设这与SQS需要key=value格式有关,而我的应用程序Logstash和Elasticsearch都配置为使用JSON,因此JSON需要嵌入其中
我已经看过了,没有具体的信息可供使用。我还希望不必编写自己的应用程序并扩展JMeter
有人知道我如何使用JMeterGUI来实现这一点吗
编辑1
在我试图让JMeter正确地向Amazon SQS发送消息的过程中,Logstash对Amazon SQS进行了轮询,Logstash将消息发送给Elasticsearch。我停止检查Elasticsearch以查看消息是否到达,原因很简单,因为JMeter报告了一个故障,消息最初没有被接收到
我只是再次检查了它,发现了我当前的JMeter配置,而在JMeter中报告失败,似乎实际上是将消息发送到SQS。新的问题是,并不是所有的信息都能通过。如果JMeter报告它尝试了1000次,看起来有100次通过了
HTTP请求默认值
-相同的参数、路径、服务器名称
-实现:HttpClient 4
-协议:http
HTTP请求采样器
-消息体的参数,格式正确的JSON不被任何附加字符包围,且不转义。
-方法:邮寄
所以,我的新问题是,为什么不是所有的信息都能通过呢?也许它为了自身的利益而移动得太快了,而且它实际上并没有传递它所说的所有信息
我已经将线程组设置为5个线程,但是我选择它应该延迟线程创建,直到需要时为止。也许是因为内部种族问题
为了验证这一理论,我插入了一个常量计时器来增加1秒的延迟,并且在每个请求之间再加上2秒的延迟应该足够长的时间,让它运行143条消息。在这143条信息中,只有7条通过了
然后,我在表中的视图结果中注意到,除少数消息外,所有消息的字节数均为2152,连接时间为0,而每几条消息的字节数均为2583,连接时间为11ms或12ms。与所有其他邮件不同的邮件数是成功通过的邮件数
JMeter报告通过的消息的响应代码/消息,如下所示:
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
鉴于其报告了所有其他未通过的邮件的以下内容:
Response code: Non HTTP response code: org.apache.http.conn.ConnectTimeoutException
Response message: Non HTTP response message: Connect to sqs.us-east-1.amazonaws.com:80 timed out
JMeter非常支持测试消息传递系统的JMS接口。您可以使用获取SQS JMS接口。您能否提供有关哪些不起作用的更多信息 -jmeter.log -你得到的回应 从您显示的内容来看,您似乎没有发送**请求签名**: 要进行此签名,可以使用JSR223准备
Processor+Groovy+JavaAPI。我希望不必编写自己的应用程序。GUI可以使用Java编写的自定义采样器类吗?使用JMeter不必编写自己的应用程序。由于JMeter已经支持JMS,因此可以使用AWS SDK中提供的JMS接口创建性能测试。您只需要定义测试应该如何运行。我的理解是,根据我当前的访问策略,它应该允许匿名访问,即不需要签名。无论如何,我在另一个问题上有了另一个发现,我正在相应地更新我的问题。