Как воспроизоводить сетевую активность WebSocket минимумом ресурсов?

Нужно тестировать движок игры на нагрузку. Клиенты взаимодействуют только по WebSocket.
Подключаются, отправляют одно сообщение, другое сообщение.

Сейчас используем высокоуровневые Artillery.io и самописные тесты нв NodeJS для проверки разных сценариев.

Можно ли не полноценным WebSocket-клиентом, а как-то совсем «легко» тестировать на нагрузку, когда волнуют только исходящие данные?

Может, запомнить исходящие сетевые пакеты — они ведь одинаковые для каждого потока? Открыть десятки тысяч соединений, и отправлять готовый пакет по каждому. Каким инструментом это можно делать?

Например, сценарий: нужно открыть wss://myserver.com:443/ws и отправить туда сообщение {"type": "handshake"}, а через 10 секунд отправить ещё одно {"type":"action", "value":"move"}

И меня интересует, как сервер потянет это при 5 тыс., 10, 50, 250, 500 тыс. одновременных соединений, открытых в течение 10 секунд.

Тут пример как Wireshark перехватывает соединение WebSocket. Выходит, нужно обязательно дожидаться хотя бы одного ответа от сервера во время установления соединения.
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Aves
const net = require('net');
const crypto = require('crypto');

const handshake = `GET / HTTP/1.1
Host: 192.168.43.135:12345
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: bKdPyn3u98cTfZJSh4TNeQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

`;

const s = net.connect(8080);

s.on('data', d => {
  if (/HTTP\/1\.1 101 Switching Protocols/.test(d)) {
    s.write(composeFrame('{"type": "handshake"}'));
    setTimeout(
      () => s.write(composeFrame('{"type":"action", "value":"move"}')),
      10000
    );
  }
});

s.write(handshake);

function composeFrame(text) {
  const mask = crypto.randomBytes(4);
  return Buffer.from([
    0b10000001,
    0b10000000 | text.length,
    ...mask,
    ...[...Buffer.from(text)].map((e, i) => e ^ mask[i % 4])
  ]);
}


Это для ws работает, а для wss наверно нужен будет TLSSocket из tls.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы