2010-03-17 14 views
5

Ben basit parçacıklı socketserver yazıyorum ve ben en iyi gelen bağlantıları nasıl işleneceğini merak ediyorum:Java socketserver: Birçok gelen bağlantı nasıl ele alınır?

  1. her yeni bağlantı için yeni bir iş parçacığı oluşturun. eşzamanlı parçacığı sayısı bir birikim

  2. bir sıraya gelen tüm bağlantılar ekleyebilir ve

Ben meyilliyim kuyruğu işlemek işçi iş parçacığı bir havuzu var belirterek sınırlı sınırlı ve bekleyen bağlantıları olurdu Seçenek 2'ye geçin çünkü yüksek yükler altında bile herhangi bir bağlantıyı reddetmek istemiyorum, ancak sınırsız bağlantıları etkin bir şekilde kabul etmem gerektiğinin bilincinde bir durum olup olmadığını merak ediyorum.

cevap

6

Sınırsız bağlantılarla, çok sayıda iş parçacığı oluşturabilirsiniz. Bu, çok fazla işlem yapılması gerektiği anlamına gelir, ayrıca her bir iş parçacığı, yalnızca yığın için varsayılan olarak sabit bir miktarda bellek tüketir (bence bu değer, iş parçacığı başına 512kB 'dur, ancak bu platforma bağlı olabilir).

Belirli sayıda iş parçacığını bir araya getirerek ve sınırlı sayıda istemciyi kabul ederek, bazı müşterilerinizin makul bir süre içinde hizmet vermesini ve sunucunuzun aşırı yüklemeden çökmemesini sağlayabilirsiniz.

this article on building servers using NIO'a bakmak veya belki de Apache Mina gibi çerçevelere göz atmak isteyebilirsiniz.

+0

duyuyorum iş parçacığı sayısını sınırsız kullanmaz ve bunun yerine havuzun boyutuna göre sınırlanır. – objects

+0

Üzgünüz - Ben yoklama 'değil, 'havuzu' –

+0

şu Tamam, teşekkür yazarak karışık konularda düşünmek - Apache Mina fantastik ve tam olarak ne arıyordu! – objects

2

Sınırsız bağlantı kabul ediyorsanız ve işleminiz gelen bağlantıların akışıyla başa çıkmak için yeterince hızlı değilse, sıralarınız bir önceki noktaya kadar işlem yapmanın çok uzun sürdüğü bir noktaya ulaşıncaya kadar doldurulacaktır. Çoğu istek, onlara ulaşır ulaşmaz, cevapla bile ilgilenmeyecek.

+0

Veya hafızanız biter. – user359996

2

1 Başına bağlantı ölçülmez. Bu konuda C10K sorununda okuyun. Uzun bir okuma, ama çok ünlü.

NIO hakkında bilgi edinmenizi veya tüm ağır kaldırma işlemlerini (NIO) sizin için işleyen etkileyici netty çerçevesini kullanmanızı tavsiye ederim.

4

Gerçekten

Aslında muhtemelen yapmak herhangi bağlantıları reddetme istemiyoruz. Aşırı yüklendiğinde, daha fazla kabul etmeden önce mevcut yükten kurtulmak için yeterli kapasiteyi korumak istersiniz. Şüphesiz, herkesin durması, bağlantıları reddetmekten daha kabul edilebilir değildir.

Kuyruk teorisi, tatlı nokta kullanımının yaklaşık% 70 olduğunu söylüyor. Sunucunuz daha hızlı donanıma sahip olana kadar sabit bir yüke sahip olacaksa.

Bunu söylediyseniz, yüz binlerce bağlantı bekliyorsanız, iş parçacığı havuzu veya NIO kullanırdım. Sadece binlerce bekliyorsanız, bağlantı başına bir iş parçacığı gitmek için en kolay yoldur.

0
Gerçekten yüksek yüklerde bile

Seçeneğiniz 2 Bence gitmek için tek yoldur altında, herhangi bir bağlantı reddetme istemiyoruz

. Her 5-10k bağlantıda bir sabitlenmiş NIO seçici iplik olmalıdır. Ama hiçbir şey bu kritik iş parçacığını geciktiremez, bu nedenle iş parçacığı sabit sayıda iğneli iş parçacığı arasında çalışmak ve bir iş parçacığı havuzu için bir DEMUX kullanın. Ve iş toplamak ve müşterilere geri cevap vermek için bir MUX. EJP söylediği gibi sizin çalışan iş parçacığı kalmış yerse, eninde sonunda mümkün olarak kuyruk gibi büyük hale getirmek için diske damping mesajları başlatmak sürece bağlantıları damla gerekecektir. Bu şekilde, yüksek yükler altında bile herhangi bir bağlantı kesilmeyecek. Eğer detaylı olarak açıklamak this article ve aşağıdaki şemaya kontrol edebilirsiniz:

enter image description here

Yasal Uyarı: Bir (ı sabit varsayalım boyutu) iplik havuz ediliyor olarak Ben CoralQueue geliştiricilerinden biri

İlgili konular