Gatling Stomp Pub / тестирование под нагрузкой - PullRequest
0 голосов
/ 16 января 2020

У меня есть веб-сервер Spring boot + STOMP через WS. Вскоре этот микросервис начнет работать, и я хочу измерить производительность веб-сокета под нагрузкой. Я хочу знать, сколько пользователей будет обрабатывать моя служба (и на основе этой настройки автоматического масштабирования)

Служба - это REST API + STOMP topi c Publishing. Я хочу написать сценарий, который:

  • в первой итерации порождает 1 пользователя, подключается через websocket, подписывается на topi c, затем публикуется одно сообщение и проверяется, что пользователь получил его через WS, закрывает подключение .
  • во второй итерации порождает 10 пользователей, подключается через websocket, подписывается на topi c, затем публикуется одно сообщение и проверяется, что 10 пользователей получили его через WS, закройте соединение;
  • in третья итерация порождает 100 пользователей, подключается через websocket, подписывается на topi c, затем публикуется одно сообщение и проверяется, что 100 пользователей получили его через WS, закрывает соединение;
  • и так далее.

Затем, основываясь на статистике, я найду, сколько пользователей могут обрабатывать мой сервис. В настоящее время я могу порождать пользователей, подключаться через WS и все. Как я могу создать некоторое количество пользователей и создать один http-запрос, который будет запускать публикацию событий в STOMP topi c, на которую подписаны все пользователи?

Вот мой текущий сценарий тестирования.

package computerdatabase

import java.util.concurrent.TimeUnit
import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.core.check.Check
import io.gatling.http.Predef._
import io.gatling.http.check.ws.WsTextCheck

import scala.concurrent.duration.{Duration, FiniteDuration}
import scala.util.Random

class TickerSimulation extends Simulation {

  val baseUrl = "https://myserverurl.com"

  val httpProtocol = http
    .baseUrl(baseUrl)
    .inferHtmlResources(BlackList(""".*\.js""", """.*\.css""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.ico""", """.*\.woff""", """.*\.woff2""", """.*\.(t|o)tf""", """.*\.png""", """.*detectportal\.firefox\.com.*"""))
    .acceptHeader("*/*")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("de,en-US;q=0.7,en;q=0.3")
    .userAgentHeader("Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0")

  def randomServerId(): String = {
    val rand = new Random()
    (1 to 3).map { _ => rand.nextInt(10).toString }.mkString
  }

  def randomSessionId(): String = {
    Random.alphanumeric.take(8).mkString
  }

  val feeder = Iterator.continually(Map(
    "serverId" -> randomServerId(),
    "sessionId" -> randomSessionId()
  ))

  val headers_0 = Map(
    "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "DNT" -> "1",
    "Pragma" -> "no-cache",
    "Content-Type" -> "application/json",
    "Upgrade-Insecure-Requests" -> "1",
    "Authorization" -> "Basic somebasicauth=")

  val answerCheck = ws.checkTextMessage("Connection acknowledge answer")
    .check(regex("^a.*"))

  val answerEventCheck = ws.checkTextMessage("Game event received")
    .check(regex(".*gameEvent.*"))


  val scn = scenario("WidgetTicker")
    .feed(feeder)
        .exec(http("Get game info ")
          .get("/api/game/35384")
          .headers(headers_0))
        .pause(Random.nextInt(10))
    .exec(ws("WS connection").connect("ws://myserverurl.com/api/sock/${serverId}/${sessionId}/websocket"))
    .pause(1)
    .exec(ws("Connect via STOMP")
      .sendText("[\"CONNECT\\naccept-version:1.1,1.0\\nheart-beat:10000,10000\\n\\n\\u0000\"]")
      .await(60 seconds)(answerCheck)
    ).pause(3)
    .exec(ws("Subscribe")
      .sendText("""["SUBSCRIBE\nid:sub-0\ndestination:/topic/game/35384\n\n\u0000"]""")
      .await(60 seconds)(answerEventCheck)
    )
    .pause(3)
    .exec(ws("WS close").close)


  setUp(scn.inject(
    atOnceUsers(1000)
  )).protocols(httpProtocol)
}

1 Ответ

0 голосов
/ 20 января 2020

Я создал топи c, которые сервер записывает каждые несколько секунд. Затем я проверяю во время симуляции, что пользователи получают это сообщение. И таким образом протестируйте соединение WebSocket pub / sub

Вот что я придумала:

val answerEventCheck = ws.checkTextMessage("Game event received")
    .check(regex("""^a.*topic\/game\/123.*"""))


val scn = scenario("WidgetTicker")
    .feed(feeder)
    .exec(ws("WS connection").connect("ws://${baseUrl}/api/sock/${serverId}/${sessionId}/websocket"))
    .pause(1)
    .exec(ws("Connect via STOMP")
      .sendText("[\"CONNECT\\naccept-version:1.1,1.0\\nheart-beat:10000,10000\\n\\n\\u0000\"]")
      .await(3 seconds)(answerCheck)
    ).pause(3)
    .exec(ws("Subscribe")
      .sendText("[\"SUBSCRIBE\\nid:sub-0\\ndestination:/topic/game/123\\n\\n\\u0000\"]")
      .await(5 seconds)(answerEventCheck)
    )
    .pause(5)
    .exec(ws("WS close").close)
...