2016-03-20 31 views
0

UDP yük dengeleyicisini Netty kullanarak yazıyorum.UDP yük dengeleyici Netty kullanarak

Yük dengeleyici, yerel bir taşıma adresinde dinler. Netty açısından, bu adresi dinlemek için sadece bir adet Channel oluşturulmuştur. Gelen UDP paketleri daha sonra, tek iş parçacığı (tek iş parçacıklı olay döngü grubunun) tarafından işlenmek üzere bir işçi iş parçacığı havuzuna gönderilir (burada, yük dengelemesi gerçekleştirme araçları).

Giden tarafında birden çok sunucu kullanılabilir. Alınan her UDP paketi için ilişkili çalışan iş parçacığı bir sunucu seçer ve UDP paketini bu sunucuya iletir. UDP paketini iletmek için Channel'a ihtiyaç vardır. sunucularına tüm paketleri yönlendirmek için kullanılan bir tek giden Channel kullanma

  1. :

    Ben dört yaklaşımı görebilirsiniz. Bu yaklaşımı kullanarak, paketler her zaman aynı taşıma adresinden gönderilecektir.

  2. Kullanılabilir sunucu başına bir giden Channel kullanın. Bir sunucuya yönlendirilen her paket, bu sunucuyla ilişkili Channel kullanılarak iletilecektir.
  3. N kullanılabilir sunucu başına giden Çıkış Channel. Bir sunucuya iletilen her paket, bu sunucuyla ilişkili Channels grubundan bir Channel kullanılarak iletilecektir.
  4. Her paketin iletilmesi için yeni bir Channel kullanın.

Yaklaşım 4'ü denedim ve kötü performans getirdiğini görebiliyorum. Özellikle çok fazla soketin oluşturulduğu bir sorunla karşılaştım ve bu nedenle açık dosya limitini aştı.

Birden çok paket arasında paylaşıldığı için, 1, 2 ve 3 numaralı yaklaşımlar, UDP paketinin içine gönderenin adresini eklemeyi gerektirir, ancak bu aslında benim için bir sorun değil çünkü bu bilgiyi, aslında paketi işleyen sunucu için bu bilgiye gereksinim duyuyorum .

1, 2 ve 3 arasında önerilen yaklaşım nedir? Hedef sunucu başına bir veya daha fazla Channel kullanmak iyi bir uygulamadır mı?


DÜZENLEME: aklıma geliyor

diğer yaklaşım Channels bir ortak havuz kullanmaktır. Bir UDP paketi alındığında, mevcut bir sunucu seçilir, ardından havuzdan bir Channel seçilir (örneğin yuvarlak robin seçim algoritması kullanılarak) ve paket bu Channel kullanılarak iletilir.

cevap

0

Sizinle benzer bir sorunum var ve ben Another approach kullanın. Ancak, dengeleyicinin performans sorunu için Another approach'u seçmedim, ancak kullanılabilir sunucuların performans sorunu için.

Dengeleyici performansı için, performans testimde yaklaşım 1 ile Another approach arasında çok fazla fark yoktur. Ve Netty'nin bir dinleme kanalının üst limit oranı var, bence birden fazla dinleme kanalı oluşturmak için EpollChannelOption.SO_REUSEPORT'u kullanmalısınız.

İlgili konular