vert.xがWebサーバーにどのように適用されるのかよくわかりません。
私がWebサーバーについて知っている概念は、スレッドベースの概念です。
したがって、どのスレッドがどのソケットに対して作業を行っているかが明確に定義されています。ただし、すべてのソケットに新しいスレッドが必要です。これは、多くのソケットにとって長期的にはコストがかかります。
次に、vert.xが提供するイベントベースの概念があります。これまでのところ、次のように機能するはずです。
Webサーバーの例として:
class WebServer: AbstractVerticle() {
lateinit var server: HttpServer
override fun start() {
server = vertx.createHttpServer(HttpServerOptions().setPort(1234).setHost("localhost"))
var router = Router.router(vertx);
router.route("/test").handler { routingContext ->
var response = routingContext.response();
response.end("Hello from my first HttpServer")
}
server.requestHandler(router).listen()
}
}
このWebサーバーは、Vertxインスタンスに複数回デプロイできます。そして、見たところ、各WebServerインスタンスは独自のスレッドを取得します。100のクライアントを接続して単純な応答で応答しようとすると、各クライアントが同期的に処理されているように見えます。各サーバーハンドラーでThread.sleepステートメントを実行すると、1つおきのクライアントが応答を受け取るためです。ただし、すべてのサーバーハンドラーが1秒間のスリープを開始し、この時間以降はほぼ同じようにすべてのクライアントに応答する必要があります。
これは、100個のクライアントを起動するためのコードです。
fun main(){
Vertx.vertx().deployVerticle(object : AbstractVerticle(){
override fun start() {
for(i in 0 .. 100)
MyWebClient(vertx)
}
})
}
class MyWebClient(val vertx: Vertx) {
init {
println("Client starting ...")
val webClient = WebClient.create(vertx, WebClientOptions().setDefaultPort(1234).setDefaultHost("localhost"))
webClient.get("/test").send { ar ->
if(ar.succeeded()){
val response: HttpResponse<Buffer> = ar.result()
println("Received response with status code ${response.statusCode()} + ${response.body()}")
} else {
println("Something went wrong " + ar.cause().message)
}
}
}
}
誰かがこれの説明を知っていますか?
そこにはいくつかの大きな問題があります。
これを行うとき:
class WebServer: AbstractVerticle() {
lateinit var server: HttpServer
override fun start() {
server = vertx.createHttpServer(HttpServerOptions().setPort(1234).setHost("localhost"))
...
}
}
次に、このようなもの:
vertx.deployVerticle(WebServer::class.java.name, DeploymentOptions().setInstances(4)
4つのバーティクルを取得しますが、実際にポートでリッスンするのはそのうちの1つだけです。したがって、これ以上の並行性は得られません。
次に、Thread.sleep
Vert.xコードで使用すると、イベントループスレッドがブロックされます。
第三に、クライアントでのテストが正しくありません。WebClientの作成には非常にコストがかかるため、WebClientを次々に作成することにより、実際には非常にゆっくりとリクエストを発行します。本当にWebアプリケーションをテストしたい場合は、https://github.com/wg/wrkのようなものを使用してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加