Нагрузочный тест Websocket с locust

#python #websocket #socket.io #load-testing #locust

#python #websocket #socket.io #нагрузочное тестирование #locust

Вопрос:

Я впервые пишу locustfile, и я пытаюсь реализовать нагрузочное тестирование websocket с помощью locust.

Я в основном скопировал и вставил этот пример кода из плагина locust, https://github.com/SvenskaSpel/locust-plugins/blob/5abac5852b0e09623bcdd90889d083df3288fead/examples/socketio_ex.py

но при отправке 2 (ping) возникает исключение WebsocketConnectionClosedException.(нет ответа при отправке 2)

Кроме того, я создаю ws-соединение с реальным сервером, и когда я отлаживаю полученные сообщения, он успешно печатает socketid. Однако журналы подключений не печатаются на стороне сервера. Я здесь в замешательстве. Он вообще устанавливает соединение? если нет, то как он может создать идентификатор сокета?

Еще один вопрос касается прослушивателя событий. Мой исходный клиент написан с помощью сокета.мы с io могли бы прослушивать конкретные события с помощью приведенного ниже кода. Поддерживает ли python такую функцию? Как реализовать прослушиватель событий в python?

 socket.on("message", (data) => console.log(data))
 

Это мой locustfile

 class MySocketIOUser(SocketIOUser):
  @task
  def my_task(self):
    self.my_value = None

    self.connect("wss://<server_url>/socket.io/?EIO=4amp;transport=websocket", [])

    # example of subscribe
    self.send('42["subscribe",{"url":"/namespace","sendInitialUpdate": true}]')
    print('receive: '   self.ws.recv())

    # wait until I get a push message to on_message
    while not self.my_value:
        time.sleep(0.1)

    # wait for additional pushes, while occasionally sending heartbeats, like a real client would
    self.sleep_with_heartbeat(10)

def on_message(self, message):
    print('message: '   message)
    self.my_value = message

if __name__ == "__main__":
    host = "<client_host_url>"
 

сообщение об исключении приведено ниже

 raise WebSocketConnectionClosedException(
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.
 

Мой клиент использует react, socket.io-client, а сервер использует nestjs с ws-gateway (socket.io )

Любая помощь приветствуется.

Ответ №1:

Вы не должны вызывать self.ws.recv() напрямую. Любые полученные сообщения будут генерировать вызов on_message(), обрабатывайте сообщение там.

Кроме того, что вы пытаетесь сделать с дополнительным [] параметром для connect() ?

SocketIOUser немного (очень) грубый по краям. Вы должны прочитать исходный код для получения дополнительных подсказок.

Комментарии:

1. Спасибо за ваш ответ! Я вызываю self.ws.recv() только для отладки полученных сообщений, и удаление этого фрагмента кода не решает проблему. вторым параметром connect() является заголовок, и я помещаю пустой массив, чтобы не указывать заголовок. Знаете ли вы, необходимо ли указывать массив заголовков в моем случае?

2. Ага. Я не знаю о заголовках (проверьте, что делает ваш браузер), я думаю, это зависит от вашей реализации. Если для отображения вашего сообщения требуется много времени, вам следует использовать self.sleep_with_heartbeat() вместо просто time.sleep(), чтобы убедиться, что соединение работает (вы можете получить упомянутое вами исключение, если сервер отправляет соединение слишком долго)