的崩潰我有一個原型,中,我把壓力一點點在瀏覽器此刻正在使用LongPolling時SSE和WebSockets的,但崩潰效果很好。SignalR LongPolling一點點壓力
我的應用可以創建遊戲,並且每個遊戲都會生成自己的事件,並且這些事件必須發送到瀏覽器。我有一個按鈕可以一次創建一個,十個和一百個遊戲。創建每個遊戲需要POST調用WebAPI,所以x10按鈕會創建10個請求,而x100會向服務器創建100個請求。
當我使用SSE或WS時,它可以很好地工作,我可以調用x100按鈕並創建一百個遊戲,所有遊戲都可以獲得各自的事件。我可以看到100個HTTP POST請求全部成功。
但是如果我切換到LongPolling模式,我可以一個一個地創建遊戲,只要我不點擊太快,並且效果很好。在那一刻我點擊快或點擊「十」或「百」按鈕,所有的WebAPI電話,但一個被卡住,並最終失敗此消息:
{"Message":"Anerrorhasoccurred.","ExceptionMessage":"Ataskwascanceled.","ExceptionType":"System.Threading.Tasks.TaskCanceledException","StackTrace":"atSystem.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__1.MoveNext()\r\n---Endofstacktracefrompreviouslocationwhereexceptionwasthrown---\r\natSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\natSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Tasktask)\r\natSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tasktask)\r\natSystem.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"}
在調試即使運行,我無法在任何地方看到異常情況。
而且SignalR斷開:
[14:24:37 GMT+0000 (GMT Standard Time)] SignalR: Long poll complete. jquery.signalR-2.0.1.js:75
[14:24:37 GMT+0000 (GMT Standard Time)] SignalR: Disconnect command received from server. jquery.signalR-2.0.1.js:75
[14:24:37 GMT+0000 (GMT Standard Time)] SignalR: Stopping connection.
它是真實的,服務器實際上將在最後響應D:1
,但我不知道這是爲什麼發生的事情,我在我的代碼沒有什麼斷開SignalR連接。
它發生在,至少,谷歌Chrome和IE 10
我不知道什麼可能是問題的線索。任何想法?
乾杯。
UPDATE:
我創建了一個小項目,再現問題。它分享了它here。
訪問:http://localhost/LongPollingLoadTest/
我們可以添加一個遊戲,十個或一百個沒有問題,因爲它會使用SSE或WebSockets(如果可用)。
現在打開http://localhost/LongPollingLoadTest/?transport=longPolling
。你會看到大部分的呼叫被卡住了,大部分時間,SignalR連接都會崩潰。
我認爲這個問題以某種方式與集團管理相關:
[AcceptVerbs("POST")]
public async Task<GameInfo> Post([FromBody]GameRequest request)
{
var game =new GameInfo() { Id = Guid.NewGuid(), Name = request.Name };
if (_games.TryAdd(game.Id, game))
{
var context = GlobalHost.ConnectionManager.GetConnectionContext<MyPersistentConnection>();
await context.Groups.Add(request.ConnectionId, game.Id.ToString());
await context.Connection.Broadcast(game);
Thread.Sleep(100);
return game;
}
else
throw new ArgumentException("Already exists");
}
當您使用longpolling時,瀏覽器網絡跟蹤(或fiddler)的外觀如何?這個錯誤可能與https://github.com/SignalR/SignalR/issues/2456 – davidfowl
有關。儘管我沒有使用集線器,但它看起來完全一樣。連接出現一段時間,然後一起失敗。所以修復將在2.1.0? – vtortola
待定。一種解決方法可能是不要等待羣組被佔用。只需調用Groups.Add而無需等待。 – davidfowl