如何使用长轮询机制处理 SignalR 应用程序,以使用 Jmeter 进行负载测试

问题描述 投票:0回答:2

我们需要在少数组件中使用

SignalR
对 Web 应用程序进行负载测试,传输模式为长轮询。我的脚本在连接步骤中挂起。连接步骤是
GET- /signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken=ZW6cj17pImmCjGGBQSQNy%2Bdiy7DKDUy4i4R1AE78c%2FTitzS6QgiPoX6fM3zBOrDK11hyx0QNEc92JM6bsLY19MCt5JjaYFgdTDVsbxfnRbkqKp6dpsl64BV1zI8Vu1X%2F&connectionData=%5B%7B%22name%22%3A%22mypreviewhub%22%7D%5D&tid=10&frameId=1

我关联了以下 2 个参数 - 1)从协商步骤捕获连接令牌并在后续请求中使用 2) 使用

${__time()}
作为时间戳,如链接-如何在 Jmeter 中捕获 signalR 连接字符串

除了这些之外,我还可以看到在连接中发送的另外 2 个参数 - tid 和 frameid。我们是否也需要关联这两个参数,尽管除了连接步骤之外,这些参数在其他任何地方都没有使用?

或者我的脚本缺少什么?

在各种帖子中,我看到了使用 websocket 采样器插件的建议,但我相信如果您的 SignalR 使用 websocket 机制而不是长轮询,这会有所帮助。

请帮我解决这个问题。感谢您的帮助。谢谢

jmeter signalr correlation long-polling
2个回答
0
投票

根据长轮询如何工作?答案:

Case
:服务器收到请求(轮询)时没有任何可供客户端使用的信息。

Behavior
:服务器不发送空响应,而是保持请求打开并等待响应信息可用。一旦完成,服务器立即向客户端发送 HTTP/S 响应,完成打开的 HTTP/S 请求。

所以你的“挂起”可能表明没有来自服务器的数据。

您可能想查看

使用 JMeter 加载测试流行聊天插件的 5 种方法文章,该文章假设使用并行控制器来实现长轮询场景测试,它甚至有一个示例测试计划

在任何情况下,您的测试都需要复制真实浏览器正在执行的操作,因此我建议使用

Wireshark 等嗅探器工具捕获 JMeter 和真实浏览器发送的请求,如果存在差异 - 修改 JMeter 配置,以便请求将与来自真实浏览器的请求 100% 匹配


0
投票
此解决方案适用于 Load runner 用户。 1.tid 和帧 id 都不必参数化。 java脚本是为TID从1到11随机生成的

  1. 您的时间戳是12位随机数

  2. 挂起的原因是永久帧是 Signalr 的异步函数,您必须使用此语句来注册 PUSH。如果 PUSH 不起作用,则进行 POLL。像这样

web_reg_async_attributes("ID=Push_0", "Pattern=Push", "URL=https://YOURurl.COM/signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken={CONNECTIONTOKEN}&connectionData=%5B%7B%22name%22%3A%22interactionhub%22%7D%5Dtid={TID}&frameId=1", "RequestCB=Push_0_RequestCB", "ResponseHeadersCB=Push_0_ResponseHeadersCB", "ResponseBodyBufferCB=Push_0_ResponseBodyBufferCB", "ResponseCB=Push_0_ResponseCB", LAST);



然后修改你的callback.c函数

int Push_0_ResponseBodyBufferCB( const char * aLastBufferStr, int aLastBufferLen, const char * aAccumulatedStr, int aAccumulatedLen, int aHttpStatusCode) {



//在此处输入 ResponseBodyBufferCB() 的实现。

lr_vuser_status_message("This is accumulated String %s", aAccumulatedStr); lr_vuser_status_message("This is response body %s", aLastBufferStr);

下次在录音中使用启用的异步选项,您将看到这些内容,但您必须在录音结束时关闭浏览器窗口,否则异步内容将不会在您的脚本中发布和创建!我用 Fiddler 发现了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.