WebSocketおよびパフォーマンステスト
6977 ワード
原文引用:https://www.cnblogs.com/jingmoxukong/p/7755643.html
目次
概要 WebSocketクライアント WebSocketサービス側 WebSocketエージェント FAQ 完全な例 資料
概要
WebSocketって何?
WebSocketはネットワーク通信プロトコルです.RFC 6455は、その通信規格を定義する.
WebSocketは、HTML 5が提供し始めた単一のTCP接続上でフルデュプレクス通信を行うプロトコルである.
なぜWebSocketが必要なの?
コンピュータネットワークプロトコルを知っている人は、HTTPプロトコルが無状態、無接続、一方向のアプリケーション層プロトコルであることを知っているはずです.リクエスト/レスポンスモデルを採用しています.通信要求はクライアントからのみ開始され,サービス側は要求に対して応答処理を行う.
この通信モデルには、HTTPプロトコルでは、サーバがクライアントに積極的にメッセージを送信することができないという弊害がある.
このような一方向要求の特徴は,サーバが連続的に状態が変化すると,クライアントが知るのは非常に面倒であることに決まっている.ほとんどのWebアプリケーションでは、頻繁な非同期JavaScriptとXML(AJAX)リクエストによって長いポーリングが実現されます.ポーリングの効率が低く、リソースが非常に浪費されます(接続を停止しないか、HTTP接続を常に開く必要があるため).
そのため、エンジニアたちはもっと良い方法があるかどうかを考えています.WebSocketはこのように発明された.WebSocket接続を使用すると、クライアントとサーバの間でフルデュプレクス通信が可能になり、どちらも確立された接続によってデータを他端にプッシュできます.WebSocketは1回の接続を確立するだけで、接続状態を維持することができます.これは、ポーリング方式による接続の継続的な確立に比べて、明らかに効率が大幅に向上します.
WebSocketはどのように働いていますか?
Webブラウザとサーバは、接続の確立と維持のためにWebSocketsプロトコルを実装する必要があります.WebSockets接続は長期にわたって存在するため、典型的なHTTP接続とは異なり、サーバに重要な影響を及ぼす.
マルチスレッドまたはマルチプロセスベースのサーバは、接続を開き、要求をできるだけ迅速に処理し、接続を閉じることを目的としているため、WebSocketsには適用できません.実際のWebSocketsサーバ側の実装には、非同期サーバが必要です.
WebSocketクライアント
クライアントでは、WebSockets用にJavaScriptライブラリを使用する必要はありません.WebSocketsを実装するWebブラウザは、WebSocketsオブジェクトを介して必要なすべてのクライアント機能を公開します(主にHtml 5をサポートするブラウザを指します).
クライアントAPI
次のAPIは、WebSocketオブジェクトを作成するために使用されます.
上記のコードの最初のパラメータurlは、接続するURLを指定します.2番目のパラメータprotocolはオプションで、許容可能なサブプロトコルを指定します.
WebSocketプロパティ
WebSocketオブジェクトのプロパティを以下に示します.上記のコードを使用してSocketオブジェクトを作成したとします.
ツールバーの
説明
Socket.readyState
読み取り専用プロパティreadyStateは接続ステータスを表し、0-接続が確立されていないことを示します.1-接続が確立され、通信可能であることを示します.2-接続が閉じられていることを示します.3-接続が閉じているか、接続が開かないことを示します.
Socket.bufferedAmount
読み取り専用プロパティbufferedAmountはsend()によってキューに入れられて転送を待っていますが、まだ発行されていないUTF-8テキストバイト数です.
WebSocketイベント
以下はWebSocketオブジェクトに関するイベントです.上記のコードを使用してSocketオブジェクトを作成したとします.
≪イベント|Events|ldap≫
イベントハンドラ
説明
open
Socket.onopen
接続確立時にトリガー
message
Socket.onmessage
クライアントがサービス側データを受信するとトリガーされます
error
Socket.onerror
通信エラー発生時にトリガー
close
Socket.onclose
接続クローズ時にトリガー
WebSocketメソッド
WebSocketオブジェクトに関するメソッドを以下に示します.上記のコードを使用してSocketオブジェクトを作成したとします.
方法
説明
Socket.send()
接続を使用したデータの送信
Socket.close()
接続を閉じる
例
WebSocketサービス
WebSocketはサービス側での実現が非常に豊富です.Node.js、Java、C++、Pythonなど多くの言語に独自のソリューションがあります.
以下では、WebSocketの学習中に接触したWebSocketサービス・エンド・ソリューションについて説明します.
Node.js
一般的なノード実装には以下の3つがある. µWebSockets Socket.IO WebSocket-Node
Java
Javaのwebは一般的にservletコンテナに依存している.
私が使ったservlet容器は、Tomcat、Jetty、Resinです.このうち、Tomcat 7、Jetty 7およびそれ以上のバージョンではWebSocketがサポートされ始めています(バージョンが変更されるにつれてWebSocketのサポートが変更される可能性があるため、新しいバージョンを推奨します).
また、SpringフレームワークはWebSocketにもサポートされています.
ただし,以上のアプリケーションはWebSocketに対してそれぞれ実装されている.しかし、それらはいずれもRFC 6455の通信規格に従い、Java APIはJSR 356−JavaTM API for WebSocket規格に統一的に従う.したがって,実際の符号化ではAPIの差は大きくない.
Spring
SpringのWebSocketのサポートは、次のjarパッケージに基づいています.
SpringでWebSocketサーバを実装するには、次の手順に従います.
WebSocketプロセッサの作成
Websocketインタフェースのパフォーマンステストのシーン1:大量のリンクの作成と閉じる--大量のユーザーがWebsocketリンクの作成、閉じる過程を絶えずシミュレートする.
シーン2:長い間多くの接続を維持する-多くのリンクを作成し、長い間リンクを維持します.
シーン3:大量プッシュメッセージ:少量のリンクを長時間保持し、メッセージプッシュを絶えずトリガーすることができる
テスト方法及びテストツールJMeterダウンロードプラグイン及び依存パッケージプラグインアドレス:https://github.com/maciejzaleski/JMeter-WebSocketSampler
必要な依存パッケージ(プラグインwiki参照)
jetty-http-9.1.1.v20140108.jar jetty-io-9.1.1.v20140108.jar jetty-util-9.1.1.v20140108.jar websocket-api-9.1.1.v20140108.jar websocket-client-9.1.1.v20140108.jar websocket-common-9.1.1.v20140108.JAr以上の依存パケットはhttp://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.1.1.v20140108/ダウンロードしたり、自分でネットで検索したりします.(依存パッケージのmavenアドレスを整理した人がいます:https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/12)
ダウンロードしたプラグインパッケージ、依存パッケージはすべてJMeterのlibextディレクトリの下に置いて、それからJMeterを再起動すればOKです
WebSocket Samplerプラグインを追加および編集した後、JMeterを起動してテスト計画を作成すると、WebSocket Samplerを追加できます.次のようなページがあります.
WebSocket Samplerを追加して、次の情報を設定します.
Web Server
Server Name or IP:WebSocketサーバのドメイン名またはIPを測定する
Port Number:WebSocketサーバのポート番号を測定します.
Timeout
Connection:リンク確立の最大タイムアウト時間、単位ミリ秒.タイムアウト時間設定に達してもリンクが確立されていない場合、samplerは失敗します.
Response:応答メッセージの最大待ち時間、ミリ秒単位.設定時間になるとWebSocketリンクが閉じます.
WebSocket Request
Implementation:RFC 6455のみ対応(v 13)
Protocol:ws-通常のWebSocketリンク、またはwss-安全なWebSocketリンク(WebSocket Secure connection)
Path、要求とともにパラメータを送信、Request Data:httpサンプラと同様に、被測定インタフェースに関連してドキュメントを説明して構成します.
自分で書いたhtmlページはテストシーン#3に対して、大量のWebsocket接続を確立する必要がないため、私たちは自分で簡単なHTMLページを書いてテストと統計を便利にしました.同時にJMeterをメッセージプッシュのtriggerとして大量プッシュメッセージの送信をトリガし,我々のシーンではhttp要求書き込み情報トリガメッセージプッシュであり,データベースを書くなど他の方法でメッセージプッシュをトリガすることもできる.
ここでは、受信したプッシュメッセージの数を直接計算して表示し、圧測終了後の結果統計を容易にします.受信したメッセージをページに印刷すれば、Websocketインタフェースの機能テストに使えます.引用:原文:https://blog.csdn.net/minmintju/article/details/74941445
目次
概要 WebSocketクライアント WebSocketサービス側 WebSocketエージェント FAQ 完全な例 資料
概要
WebSocketって何?
WebSocketはネットワーク通信プロトコルです.RFC 6455は、その通信規格を定義する.
WebSocketは、HTML 5が提供し始めた単一のTCP接続上でフルデュプレクス通信を行うプロトコルである.
なぜWebSocketが必要なの?
コンピュータネットワークプロトコルを知っている人は、HTTPプロトコルが無状態、無接続、一方向のアプリケーション層プロトコルであることを知っているはずです.リクエスト/レスポンスモデルを採用しています.通信要求はクライアントからのみ開始され,サービス側は要求に対して応答処理を行う.
この通信モデルには、HTTPプロトコルでは、サーバがクライアントに積極的にメッセージを送信することができないという弊害がある.
このような一方向要求の特徴は,サーバが連続的に状態が変化すると,クライアントが知るのは非常に面倒であることに決まっている.ほとんどのWebアプリケーションでは、頻繁な非同期JavaScriptとXML(AJAX)リクエストによって長いポーリングが実現されます.ポーリングの効率が低く、リソースが非常に浪費されます(接続を停止しないか、HTTP接続を常に開く必要があるため).
そのため、エンジニアたちはもっと良い方法があるかどうかを考えています.WebSocketはこのように発明された.WebSocket接続を使用すると、クライアントとサーバの間でフルデュプレクス通信が可能になり、どちらも確立された接続によってデータを他端にプッシュできます.WebSocketは1回の接続を確立するだけで、接続状態を維持することができます.これは、ポーリング方式による接続の継続的な確立に比べて、明らかに効率が大幅に向上します.
WebSocketはどのように働いていますか?
Webブラウザとサーバは、接続の確立と維持のためにWebSocketsプロトコルを実装する必要があります.WebSockets接続は長期にわたって存在するため、典型的なHTTP接続とは異なり、サーバに重要な影響を及ぼす.
マルチスレッドまたはマルチプロセスベースのサーバは、接続を開き、要求をできるだけ迅速に処理し、接続を閉じることを目的としているため、WebSocketsには適用できません.実際のWebSocketsサーバ側の実装には、非同期サーバが必要です.
WebSocketクライアント
クライアントでは、WebSockets用にJavaScriptライブラリを使用する必要はありません.WebSocketsを実装するWebブラウザは、WebSocketsオブジェクトを介して必要なすべてのクライアント機能を公開します(主にHtml 5をサポートするブラウザを指します).
クライアントAPI
次のAPIは、WebSocketオブジェクトを作成するために使用されます.
var Socket = new WebSocket(url, [protocol] );
上記のコードの最初のパラメータurlは、接続するURLを指定します.2番目のパラメータprotocolはオプションで、許容可能なサブプロトコルを指定します.
WebSocketプロパティ
WebSocketオブジェクトのプロパティを以下に示します.上記のコードを使用してSocketオブジェクトを作成したとします.
ツールバーの
説明
Socket.readyState
読み取り専用プロパティreadyStateは接続ステータスを表し、0-接続が確立されていないことを示します.1-接続が確立され、通信可能であることを示します.2-接続が閉じられていることを示します.3-接続が閉じているか、接続が開かないことを示します.
Socket.bufferedAmount
読み取り専用プロパティbufferedAmountはsend()によってキューに入れられて転送を待っていますが、まだ発行されていないUTF-8テキストバイト数です.
WebSocketイベント
以下はWebSocketオブジェクトに関するイベントです.上記のコードを使用してSocketオブジェクトを作成したとします.
≪イベント|Events|ldap≫
イベントハンドラ
説明
open
Socket.onopen
接続確立時にトリガー
message
Socket.onmessage
クライアントがサービス側データを受信するとトリガーされます
error
Socket.onerror
通信エラー発生時にトリガー
close
Socket.onclose
接続クローズ時にトリガー
WebSocketメソッド
WebSocketオブジェクトに関するメソッドを以下に示します.上記のコードを使用してSocketオブジェクトを作成したとします.
方法
説明
Socket.send()
接続を使用したデータの送信
Socket.close()
接続を閉じる
例
// WebSocket
var ws = new WebSocket("ws://localhost:9998/echo");
// web socket
ws.onopen = function () {
// send()
ws.send(" ");
alert(" ...");
};
//
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert(" ...");
};
// web socket
ws.onclose = function () {
alert(" ...");
};
WebSocketサービス
WebSocketはサービス側での実現が非常に豊富です.Node.js、Java、C++、Pythonなど多くの言語に独自のソリューションがあります.
以下では、WebSocketの学習中に接触したWebSocketサービス・エンド・ソリューションについて説明します.
Node.js
一般的なノード実装には以下の3つがある.
Java
Javaのwebは一般的にservletコンテナに依存している.
私が使ったservlet容器は、Tomcat、Jetty、Resinです.このうち、Tomcat 7、Jetty 7およびそれ以上のバージョンではWebSocketがサポートされ始めています(バージョンが変更されるにつれてWebSocketのサポートが変更される可能性があるため、新しいバージョンを推奨します).
また、SpringフレームワークはWebSocketにもサポートされています.
ただし,以上のアプリケーションはWebSocketに対してそれぞれ実装されている.しかし、それらはいずれもRFC 6455の通信規格に従い、Java APIはJSR 356−JavaTM API for WebSocket規格に統一的に従う.したがって,実際の符号化ではAPIの差は大きくない.
Spring
SpringのWebSocketのサポートは、次のjarパッケージに基づいています.
org.springframework
spring-websocket
${spring.version}
SpringでWebSocketサーバを実装するには、次の手順に従います.
WebSocketプロセッサの作成
TextWebSocketHandler
またはBinaryWebSocketHandler
を拡張すると、指定した方法を上書きできます.Spring WebSocketイベントを受信すると、イベントに対応するメソッドが自動的に呼び出されます.import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.TextMessage;
public class MyHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
// ...
}
}
WebSocketHandler
のソースコードは次のとおりです.これは、プロセッサがどのWebSocketイベントを処理できるかを意味します.public interface WebSocketHandler {
/**
*
*/
void afterConnectionEstablished(WebSocketSession session) throws Exception;
/**
*
*/
void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception;
/**
*
*/
void handleTransportError(WebSocketSession session, Throwable exception) throws Exception;
/**
*
*/
void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception;
/**
*
*/
boolean supportsPartialMessages();
}
Websocketインタフェースのパフォーマンステストのシーン1:大量のリンクの作成と閉じる--大量のユーザーがWebsocketリンクの作成、閉じる過程を絶えずシミュレートする.
シーン2:長い間多くの接続を維持する-多くのリンクを作成し、長い間リンクを維持します.
シーン3:大量プッシュメッセージ:少量のリンクを長時間保持し、メッセージプッシュを絶えずトリガーすることができる
テスト方法及びテストツールJMeterダウンロードプラグイン及び依存パッケージプラグインアドレス:https://github.com/maciejzaleski/JMeter-WebSocketSampler
必要な依存パッケージ(プラグインwiki参照)
jetty-http-9.1.1.v20140108.jar jetty-io-9.1.1.v20140108.jar jetty-util-9.1.1.v20140108.jar websocket-api-9.1.1.v20140108.jar websocket-client-9.1.1.v20140108.jar websocket-common-9.1.1.v20140108.JAr以上の依存パケットはhttp://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.1.1.v20140108/ダウンロードしたり、自分でネットで検索したりします.(依存パッケージのmavenアドレスを整理した人がいます:https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/12)
ダウンロードしたプラグインパッケージ、依存パッケージはすべてJMeterのlibextディレクトリの下に置いて、それからJMeterを再起動すればOKです
WebSocket Samplerプラグインを追加および編集した後、JMeterを起動してテスト計画を作成すると、WebSocket Samplerを追加できます.次のようなページがあります.
WebSocket Samplerを追加して、次の情報を設定します.
Web Server
Server Name or IP:WebSocketサーバのドメイン名またはIPを測定する
Port Number:WebSocketサーバのポート番号を測定します.
Timeout
Connection:リンク確立の最大タイムアウト時間、単位ミリ秒.タイムアウト時間設定に達してもリンクが確立されていない場合、samplerは失敗します.
Response:応答メッセージの最大待ち時間、ミリ秒単位.設定時間になるとWebSocketリンクが閉じます.
WebSocket Request
Implementation:RFC 6455のみ対応(v 13)
Protocol:ws-通常のWebSocketリンク、またはwss-安全なWebSocketリンク(WebSocket Secure connection)
Path、要求とともにパラメータを送信、Request Data:httpサンプラと同様に、被測定インタフェースに関連してドキュメントを説明して構成します.
自分で書いたhtmlページはテストシーン#3に対して、大量のWebsocket接続を確立する必要がないため、私たちは自分で簡単なHTMLページを書いてテストと統計を便利にしました.同時にJMeterをメッセージプッシュのtriggerとして大量プッシュメッセージの送信をトリガし,我々のシーンではhttp要求書き込み情報トリガメッセージプッシュであり,データベースを書くなど他の方法でメッセージプッシュをトリガすることもできる.
ここでは、受信したプッシュメッセージの数を直接計算して表示し、圧測終了後の結果統計を容易にします.受信したメッセージをページに印刷すれば、Websocketインタフェースの機能テストに使えます.引用:原文:https://blog.csdn.net/minmintju/article/details/74941445