【问题标题】:How to handle SignalR application with longpolling mechanism for load testing using Jmeter如何使用长轮询机制处理 SignalR 应用程序以使用 Jmeter 进行负载测试
【发布时间】:2019-02-15 23:47:00
【问题描述】:

我们需要在少数组件中使用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()} 作为链接中的时间戳-How to capture signalR connection string in Jmeter

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

或者我的脚本缺少什么?

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

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

【问题讨论】:

    标签: jmeter signalr connect correlation long-polling


    【解决方案1】:

    根据How does long-polling work?的回答:

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

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

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

    您可能想查看5 Ways to Load Test Popular Chat Plugins with JMeter 文章,该文章假设使用Parallel Controller 来实现长轮询场景测试,它甚至还有example test plan

    在任何情况下,您的测试都需要复制真实浏览器正在执行的操作,因此我建议使用 Wireshark 之类的嗅探器工具捕获 JMeter 和真实浏览器发送的请求,如果存在差异 - 修改 JMeter 配置所以请求将 100% 匹配来自真实浏览器的请求

    【讨论】:

      【解决方案2】:

      此解决方案适用于 Load runner 用户。 1.tid和frame id都不需要参数化。为 TID FROM 1 到 11 随机生成 java 脚本

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

      2. HANGING 的原因是,forever 帧是 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 发现了这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 2019-03-10
        • 2021-09-24
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多