C# 使用集线器的广播消息信号器规模测试
我有一个非常简单的基于signarhub的应用程序,它基本上每次向大约1000个客户机定期发送一种消息 我希望能够在一个可重复的负载测试环境中测试1000个web浏览器是否可以连接并接收来自集线器的消息 我已经看到信号器文档显示了如何使用曲柄工具进行负载测试。但这样做的局限性是无法测试集线器类型的部署,这是没有帮助的C# 使用集线器的广播消息信号器规模测试,c#,.net,testing,signalr,scale,C#,.net,Testing,Signalr,Scale,我有一个非常简单的基于signarhub的应用程序,它基本上每次向大约1000个客户机定期发送一种消息 我希望能够在一个可重复的负载测试环境中测试1000个web浏览器是否可以连接并接收来自集线器的消息 我已经看到信号器文档显示了如何使用曲柄工具进行负载测试。但这样做的局限性是无法测试集线器类型的部署,这是没有帮助的 有没有人见过如何创建一个中心和客户端的实例,并测试X个客户端在某个时间范围内都收到了一条消息?根据zaitsman的评论,我想出了下面的代码,希望能得到一些反馈 [TestClas
有没有人见过如何创建一个中心和客户端的实例,并测试X个客户端在某个时间范围内都收到了一条消息?根据zaitsman的评论,我想出了下面的代码,希望能得到一些反馈
[TestClass]
public class SignalRConnectionTest
{
static AutoResetEvent _autoEvent = new AutoResetEvent(false);
private const string HUB_URL = "http://mysite/signalr";
private const string HUB_NAME = "chatHub";
private static Dictionary<int, bool> _clientResponsesRecieved = new Dictionary<int, bool>();
private static object lockObject = new object();
[TestMethod]
public void TestJoinHub()
{
const int numberOfClients = 10;
var manualEvents = new ManualResetEvent[numberOfClients];
for (int i = 0; i < numberOfClients; i++)
{
manualEvents[i] = new ManualResetEvent(false);
var stateInfo = new State(manualEvents[i], i);
ThreadPool.QueueUserWorkItem(ConnectToSignalRAndWaitForMessage, stateInfo);
}
foreach (var manualResetEvent in manualEvents)
manualResetEvent.WaitOne();
Assert.AreEqual(_clientResponsesRecieved.Count, numberOfClients);
foreach (var key in _clientResponsesRecieved.Keys)
{
Assert.IsTrue(_clientResponsesRecieved[key]);
}
}
class State
{
public int threadId = 0;
public ManualResetEvent manualEvent;
public State(ManualResetEvent manualEvent, int threadId)
{
this.manualEvent = manualEvent;
this.threadId = threadId;
}
}
private void ConnectToSignalRAndWaitForMessage(object state)
{
var stateInfo = (State) state;
var hubConnection = new HubConnection(HUB_URL);
var chatHub = hubConnection.CreateHubProxy(HUB_NAME);
Console.WriteLine("Starting connection");
hubConnection.Start().Wait();
chatHub.On<string, string>("broadcastMessage", (username, message) =>
{
Console.WriteLine("Message Recieved: {0}", message);
lock (lockObject)
{
_clientResponsesRecieved.Add(stateInfo.threadId, true);
}
stateInfo.manualEvent.Set();
});
}
}
您是在负载测试服务器还是客户端实现?服务器组件在这个阶段,但我还想确认每个客户端都收到了消息。在这种情况下,IMO最容易做的事情是创建一个控制台客户端,其中多线程任务连接到您的中心,并在一些虚拟化环境中运行。