2008-11-06 25 views
15

Hangi noktada java.net'den java.nio'ya geçmek daha iyidir? .net (Microsoft varlığı değil) daha kolay anlaşılır ve daha tanıdıkken, nio ölçeklenebilir ve bazı ek zarif özellikler ile birlikte gelir.java.net versus java.nio

Özellikle, bu durum için bir seçim yapmam gerekiyor: Birden çok uzak yerde (birden fazla donanım birimi (bir alıcı-verici, TNC ve rotator) yöneten bir bilgisayar bulunan her site) donanımı yöneten bir denetim merkezimiz var. Benim fikrim, kontrol ünitesinden radyo donanımına, her ünite için bir sokete sahip bir ağ geçidi olarak görev yapan her makinede ciddi bir uygulama yazmaktı. Anlayışımdan NIO, bir sunucuya, birçok müşteriye yöneliktir, fakat düşündüğüm şey bir müşteri, birçok sunucudır.

Üçüncü bir seçeneğin MINA'yı kullanmak olduğunu varsayalım, ama bunun basit bir probleme çok fazla attığından emin değilim.


Her uzak sunucu aynı istemciden (tüm donanım ve ayrı TX/RX soketleri kontrol etmek için), 8 adede kadar bağlantı olacaktır. Tek istemci, aynı anda birkaç sunucuya bağlanmak isteyecektir. Her bir sunucuyu farklı bağlantı noktalarına koymak yerine, istemci tarafında kanal seçicilerini kullanmak mümkün mü ya da şeylerin istemci tarafında çok iş parçacıklı io'ya geçmek ve sunucuları farklı şekilde yapılandırmak daha mı iyidir? Uzak makineler diğer donanım ile etkileşim sadece hizmet ettiğinden


Aslında, RMI veya IDL/CORBA daha iyi bir çözüm olurdu? Gerçekten, sadece komutları göndermek ve telemetriyi donanımdan alabilmek ve bunu yapmak için bazı uygulama katmanı protokolleri oluşturmak zorunda kalmak istemiyorum.

cevap

9

Ölçeklenebilirlik büyük olasılıkla paket seçiminizi artıracaktır. java.net soket başına bir iplik gerektirecektir. Kodlamak çok daha kolay olacaktır. java.nio çok daha verimlidir, ancak etrafı kodlamak için kıllı olabilir.

Kendinize kaç tane bağlantı yapacağınızı sorun. Nispeten az ise (demek, < 100), java.net ile giderdim.

+1

Modern bir 64 bit işletim sistemi ile yüz binlerce iş parçacığına sahip olabilirsiniz. –

+3

Elbette, ama bu bir uygulamayı mimar olmak için mutlaka en ölçeklenebilir yol değil. –

+1

Ancak, bir soket, bir iş parçacığından çok daha fazla kaynak yoğunluğuna sahip ... – Zombies

0

Söz konusu bağlantıların sayısı, java.net kullanmanız gerektiğini söyledi. Gerçekten, görevinizi engellemeyen G/Ç ile karmaşıklaştırmak için bir neden yoktur. (Uzak sistemleriniz güce sahip değilse, ancak neden bunlarda Java kullanıyorsunuz?)

Apache's XML-RPC paketine bakın. Kullanımı kolaydır, ağ maddelerini tamamen gizler ve iyi HTTP 'üzerinden çalışır. Protokol sorunları hakkında endişelenmenize gerek yok ... her ikisi de size yöntem çağrıları gibi görünecek.

+0

XML-RPC ilginç görünüyor, ama SE kullanıyorum ve EE'ye ekleme/anahtarlama bile NIO'dan çok daha karmaşık olduğunu düşünüyorum, fakat yanılıyorsam beni düzeltin (aynı JVM'de çalışıyorlar mı?). –

+0

Düz bir kütüphanedir ve SE ve EE'de çalışmalıdır. Bahsedilen başka bir yorumcu gibi, ölçeklenebilirlik sorunları var. ama% 98 davası için bence oldukça sağlam. –

0

İlgili bağlantıların az olduğu göz önüne alındığında, java.net doğru çözüm gibi geliyor.

XML-RPC kullanımı hakkında konuşulan diğer posterler. Gönderilen veri hacmi küçükse, bu iyi bir seçimdir, ancak büyük miktarlarda veri (örneğin büyük istek/yanıtlar veya sık küçük miktarlarda) gönderen işlemler arası iletişimler yazarken XML tabanlı protokollerle ilgili kötü deneyimlerim oldu. veri). XML ayrıştırma maliyeti tipik olarak daha iyi optimize edilmiş tel formatlarından (örn. ASN.1) daha büyük olan buyruklardır.

Düşük hacimli kontrol uygulamaları için XML-RPC'nin sadeliği performans maliyetlerinden daha ağır basmalıdır. Yüksek hacimli veri iletişimleri için daha verimli bir tel protokolü kullanmak daha iyi olabilir.

11

Kullanmak için iyi bir nedeniniz yoksa, NIO'dan kaçının. It's not much fun and may not be as beneficial as you would think.On binlerce bağlantıyla uğraşırken daha iyi bir ölçeklenebilirlik elde edebilirsiniz, ancak daha düşük sayılarda IO'yu bloke ederek daha iyi bir performans elde edersiniz. Her zaman olduğu gibi, pişman olabileceğiniz bir şey yapmadan önce kendi ölçümlerinizi yapın.

Gözden geçirilmesi gereken başka bir nokta, SSL kullanmak istiyorsanız, NIO'nun son derece ağrılı olmasını sağlar.

+1

SSL ile ilgili yorumunuz için teşekkürler, bu muhtemelen kararımı yönlendirecektir. –

+0

Güzel gidiyor, çünkü Eminim Şubat 2012'de java 1.4'te çalışıyorsunuzdur. – sloven

1

Bu tür bir ağ kodunu şimdi sıfırdan yazmak için neredeyse hiçbir neden yok. netty.io gibi paketler, neredeyse her zaman el yapımı bir çözümden daha az kod satırıyla size daha güvenilir ve esnek bir kod getirecektir. Ayrıca, Netty ile, uygulamanızı hiç zorlamadan SSL desteği alabilirsiniz. Netty gibi kütüphaneler, "async vs threads" sorusunu neredeyse tamamen ortadan kaldırır, size iyi bir performans verir ve hala threading modelini gerektiğinde değiştirmenize izin verir.

İlgili konular