【问题标题】:What is the best way to load test a SignalR hubs application?负载测试 SignalR 集线器应用程序的最佳方法是什么?
【发布时间】:2012-05-24 15:05:30
【问题描述】:

我想了解一些用于测试基于 SignalR 集线器的应用程序的不同方法。

【问题讨论】:

    标签: asp.net-mvc asp.net-4.0 signalr


    【解决方案1】:

    我没有对 SignalR 进行太多性能测试,但该项目提供了一个有用的工具 - Crank - 用于生成客户端负载。

    项目 wiki 也有一些有用的指导 performance counters and settings

    【讨论】:

    • 据我了解,Crank 不适用于集线器。还有什么?
    【解决方案2】:

    简而言之,如果使用 Hubs,使用 .Net 客户端就足够了。

    就我而言,我有一个新闻源中心,它根据用户的个人资料 ID 提供客户特定的数据。在我的测试用例中,我加载了一堆配置文件 ID(在本例中为 6000 个),调用名为 JoinNewsfeed() 的集线器方法以及特定于客户端的连接 ID 和配置文件 ID。每 100 毫秒建立一个新连接。

        [TestMethod]
        public void TestJoinNewsfeedHub()
        {
            int successfulConnections = 0;
    
            // get profile ID's
            memberService = new MemberServiceClient();
            List<int> profileIDs = memberService.GetProfileIDs(6000).ToList<int>();
    
            HubConnection hubConnection = new HubConnection(HUB_URL);
            IHubProxy newsfeedHub = hubConnection.CreateProxy("NewsfeedHub");
    
    
            foreach (int profileID in profileIDs)
            {
                hubConnection.Start().Wait();
                //hubConnection = EstablishHubConnection();
                newsfeedHub.Invoke<string>("JoinNewsfeed", hubConnection.ConnectionId, profileID).ContinueWith(task2 =>
                {
                    if (task2.IsFaulted)
                    {
                        System.Diagnostics.Debug.Write(String.Format("An error occurred during the method call {0}", task2.Exception.GetBaseException()));
                    }
                    else
                    {
                        successfulConnections++;
                        System.Diagnostics.Debug.Write(String.Format("Successfully called MethodOnServer: {0}", successfulConnections));
    
                    }
                });
    
                Thread.Sleep(100);
    
            }
    
            Assert.IsNotNull(newsfeedHub);
        }
    

    here 列出的性能指标可以在服务器上解决问题。为了确保客户端实际上已连接并且在服务器上填充客户端对象的过程已成功完成,我有一个服务器端方法,该方法调用客户端函数,其中连接客户端的数量和列表来自连接的客户端收藏。

    【讨论】:

      【解决方案3】:

      @ElHaix 根据我在自己的测试中看到的情况,您的方法不是创建新连接,而是重用现有连接。当您遍历 profileID 的集合时,您应该会看到 hubConnection.ConnectionID 保持不变。为了创建一个新连接,您需要在 foreach 循环中创建一个 HubConnection 实例。

              int successfulConnections = 0;
              const int loopId = 10;
      
              Console.WriteLine("Starting...");
              for (int i = 1; i <= loopId; i++)
              {
                  Console.WriteLine("loop " + i);
      
                  var hubConnection = new HubConnection(HUB_URL);
                  IHubProxy chatHub = hubConnection.CreateProxy(HUB_NAME);
      
                  Console.WriteLine("Starting connection");
                  hubConnection.Start().Wait();
                  Console.WriteLine("Connection started: " + hubConnection.ConnectionId);
      
                  chatHub.Invoke("Register", "testroom").ContinueWith(task2 =>
                  {
                      if (task2.IsFaulted)
                      {
                          Console.WriteLine(String.Format("An error occurred during the method call {0}", task2.Exception.GetBaseException()));
                      }
                      else
                      {
                          Console.WriteLine("Connected: " + hubConnection.ConnectionId);
                          successfulConnections++;
                      }
                  });
      
                  Thread.Sleep(1000);
              }
      

      【讨论】:

      • 你添加了哪些包?
      【解决方案4】:

      Crank 只能测试 PersistenConnections,但由于您要测试 SignalR Hub 本身,您可以使用 Tresi。虽然它是一个商业应用程序。以下是一些关于如何针对不同类型的负载进行性能测试的链接

      1. Constant Load
      2. Gradually Incrementing Load
      3. Burst Load

      HTTPWebRequest 的性能计数器设置,例如 Created/SecAborted/Sec、Average Lifetime 等在负载测试执行期间显示。它还显示了其他计算指标,例如 吞吐量/用户 下面显示的是应用程序的屏幕截图

      【讨论】:

        【解决方案5】:

        使用 Gatling 工具创建自己的脚本以创建虚拟用户(多线程)并使用 java signalr 客户端。 如果您想知道如何将用 java 或 scala 编写的自定义脚本附加到 gatling 虚拟用户,请在评论中指定。 告诉我您是否需要信号器性能测试的测试计划,因为这是进行测试的关键点。

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 2010-09-12
          • 2010-11-09
          • 1970-01-01
          相关资源
          最近更新 更多