2015-10-18 75 views
0

我試圖加載(帶消息)並測試我的AWS部署的應用程序,它通過SQS接收消息,我一直試圖讓JMeter去做但是,我無法讓JMeter與SQS正確溝通。使用JMeter加載/測試Amazon SQS - 並非所有消息都通過

首先,我已經設置SQS是匿名訪問,所以我不擔心憑據都:

{ 
    "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" 
    } 
    ] 
} 

從簡單開始,我使用的是JMeter的GUI我的Ubuntu機器上創建了1個線程組,一個HTTP默認和1個HTTP請求。

我的默認值具有以下屬性:

服務器名稱:sqs.us-east-1.amazonaws.com
端口號:80個
參數:行動= SendMessage函數
版本= 2011-10- 01 路徑:/ 843348267853/testQueue

然後我的HTTP請求具有以下屬性:
方法:POST
參數:
消息體= { 「發件人」: 「發件人」, 「事件」: 「開始」, 「時間」: 「20150623T214256Z」, 「版本」: 「1.0」 }

注:我沒有檢查「編碼?」框的任何參數。

我的期望是,它會在與請求中的參數的缺省值與然而上述格式組合的參數,它引發

org.apache.http.conn.ConnectTimeoutException:連接到SQS頁面沒有自動跳轉 - 東 - 1.amazonaws.com:80超時

如果我用單引號包圍JSON消息時,它拋出:

java.net.SocketTimeoutException:讀超時

我已經改變了「使用的multipart/form-data的POST爲」和「瀏覽器兼容的頭」設置,當我檢查「查看結果樹」請求選項卡,它顯示了:

POST http://sqs.us-east-1.amazonaws.com/843348267853/testQueue

POST數據: 消息體=%7B%22sender%22%3A%22Sender%22%2C%22event%22%3A%22started%22%2C%22time%22% 3A%2220150623T214256Z%22%2C%22version%22%3A%221.0%22%7D & Action = SendMessage & Version = 2011-10-01

[無餅乾]

請求報頭:
連接:保持活躍
內容類型:應用程序/ x-WWW窗體-urlencoded

我假設SQS沒有按」不喜歡urlencoding?

我試着設置各種內容類型標頭,轉義引號等,並沒有一個工作。我假設這與SQS需要key = value格式的事實有關,而我的應用程序(Logstash和Elasticsearch)全部配置爲採用JSON,因此需要將JSON嵌入到其中。

我看了看How to use (if possible) JMeter to load a AWS SQS queue with messages?並沒有具體的信息可供使用。我也寧願不必寫我自己的應用程序和擴展JMeter ...

有誰知道我可以如何使用JMeter GUI來做到這一點?

編輯1 在我嘗試一些點來獲得JMeter的正確發送郵件到Amazon SQS(其中得到由Logstash調查這將消息發送給Elasticsearch),我停下檢查Elasticsearch來看看郵件到達時,只是因爲JMeter報告了一個失敗,並且最初沒有收到消息。

我只是再次檢查它,發現我當前的JMeter配置,而JMeter中的報告失敗似乎實際上將消息發送到SQS。新的問題是,並非所有的信息都通過了。如果JMeter的報告它試圖1000倍,它看起來像100打通......

HTTP請求默認值
- (相同的參數,路徑,服務器名稱) - 實施:HttpClient的4 - 協議:HTTP

HTTP請求取樣
- 消息體的參數,以正確地形成JSON(不被任何附加的字符和沒有逃脫包圍)。 - 方法:POST

所以,我的新問題是,有沒有一個原因,爲什麼並非所有的消息將通過?也許它爲了自己的利益而移動得太快,它實際上並沒有傳輸它說的所有消息?

我有線程組設置爲5個線程,但我選擇它應該「延遲線程創建,直到需要」。也許它遇到了一些內部種族問題?

爲了測試這個理論,我插入了一個常量計時器,在每個請求之間添加1秒的延遲(並且延遲2秒),並且讓它運行143條消息。在這143條消息中,只有7條消息通過......。

然後,我在「查看錶中的結果」中注意到,除少數消息之外的所有消息都是相同的字節數(2152)有一個「連接時間」爲0,而每幾個消息將是一個2583字節的連接時間爲11毫秒或12毫秒。與所有其他消息不同的消息數是成功通過的消息數。

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 

回答

0

JMeter對測試郵件系統的JMS接口有很好的支持。您可以使用AWS Java SDK來獲取SQS JMS接口。

+0

我希望不必編寫自己的應用程序。 GUI可以使用用Java編寫的自定義採樣器類嗎? – Brooks

+0

您不必編寫自己的應用程序來使用JMeter。由於JMeter已經支持JMS,因此可以使用AWS SDK中提供的JMS接口來創建性能測試。你只需要定義測試應該如何運行。 –

0

你能提供什麼是不工作的更多信息: - jmeter.log - 響應你

從大家展示一下,看來你不發送**要求籤名**:

爲此簽名,您可以使用JSR223預處理器+的Groovy + Java的API。

+0

我的理解是,根據我目前的訪問策略,它應該允許匿名訪問(即不需要簽名)。無論如何,我又發現了另一個問題,我相應地更新了我的問題。 – Brooks