2012-07-25 25 views
7

हमारे पास StatusUpdateHub नामक सिग्नलआर हब है। यह केंद्र एक .NET क्लाइंट द्वारा अद्यतन किया जाता है जिसे HubClient कहा जाता है। यह ग्राहक विभिन्न लेनदेन के लिए एकाधिक उपयोगकर्ताओं द्वारा प्रति सेकंड 1000 गुना कहा जाता है (उत्पादन में)। यहाँ ग्राहक कोड है:सिग्नलआर हब स्केलेबिलिटी इश्यू

Unexpected error in UpdateBrowser: System.InvalidOperationException: The connection has not been established. at SignalR.Client.Connection.SignalR.Client.IConnection.Send[T](String data) at SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args) at SignalR.Client.Hubs.HubProxy.Invoke(String method, Object[] args) at Application.Services.HubClient.<>c_DisplayClass2.b_0(Task task1) in c:\Build\Work\Application\Services\HubClient.cs:line 20
at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)
at System.Threading.Tasks.Task.Execute()

:

public static class HubClient 
{ 
    private static readonly string statusUpdateUrl = ConfigurationManager.AppSettings["StatusUpdateUrl"]; 
    private static readonly HubConnection connection = new HubConnection(statusUpdateUrl); 
    private static readonly IHubProxy hub = connection.CreateProxy("StatusUpdateHub"); 

    internal static void UpdateBrowser(long transactionId) 
    { 
     connection.Start().ContinueWith(task => hub.Invoke("UpdateTransactionStatus", transactionId)).ContinueWith(task => 
     { 
      if (task.IsFaulted && task.Exception != null) 
      { 
       // log error 
      } 
     }); 
    } 
} 

इस कोड को 100 समवर्ती उपयोगकर्ताओं के साथ कहा जाता है जब यह ठीक काम कर रहा है लेकिन जब हम 250 समवर्ती उपयोगकर्ताओं तो हम निम्न त्रुटि देख रहे हैं की संख्या में वृद्धि

हमें बताएं कि हम कोड को और अधिक स्केलेबल कैसे बना सकते हैं?

+0

क्या किसी भी मौके से सर्वर पर एक साथ कनेक्शन पर सीमा है? – Stilgar

+0

क्या आप पूरे रन में मेमोरी खपत की निगरानी भी कर रहे हैं? क्या आप। मुझे यह जानकर उत्सुकता है कि रुझान क्या हैं जो आप जुड़े हुए # उपयोगकर्ताओं से जुड़े/डिस्कनेक्ट किए गए हैं। मैं अपने ऐप में कुछ अपरिवर्तित स्मृति देख रहा था, और सोच रहा था कि यह सिग्नलआर या कुछ और वजह से था। – ElHaix

+0

@Stilgar हमने कोई सीमा निर्धारित नहीं की है। Machine.config में मुझे किस सेटिंग में बदलना चाहिए? –

उत्तर

9

यदि प्रति सेकंड 1000 बार कहा जा रहा है, तो आपको हर बार connection.Start() पर कॉल नहीं करना चाहिए।

केवल एक बार कनेक्शन खोलें, फिर बस उस पर विधियों का आह्वान करें।

संपादित, मैं क्या मतलब है, कम से कम, अपने कोड बनाने के कुछ इस तरह करते हैं:

internal static void UpdateBrowser(long transactionId) 
{ 
    lock (connection) 
    { 
     if (connection.State == ConnectionState.Disconnected){ 
      connection.Start().Wait(); 
     } 
    } 
    hub.Invoke("UpdateTransactionStatus", transactionId).ContinueWith(task => 
    { 
     if (task.IsFaulted && task.Exception != null) 
     { 
      // log error 
     } 
    }); 
} 
5

डिफ़ॉल्ट नेट तक ग्राहक क्षुधा और 10 एएसपी से से बाहर जाने वाले 2 समवर्ती कनेक्शन की अनुमति देता है। नेट एप्स। यदि आप इस नंबर को बढ़ाना चाहते हैं तो http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx को एक बड़ी संख्या में सेट करें। देखें कि क्या मदद करता है।

संबंधित मुद्दे