2008-11-06 17 views
15

Tại thời điểm nào tốt hơn là chuyển từ java.net sang java.nio? .net (không phải là thực thể của Microsoft) dễ hiểu hơn và quen thuộc hơn, trong khi nio có khả năng mở rộng và có thêm một số tính năng tiện lợi.java.net so với java.nio

Cụ thể, tôi cần lựa chọn tình huống này: Chúng tôi có một trung tâm điều khiển quản lý phần cứng tại một số trang từ xa (mỗi trang có một máy tính quản lý nhiều đơn vị phần cứng (bộ thu phát, TNC và rotator)). Ý tưởng của tôi là viết một ứng dụng cắt trên mỗi máy hoạt động như một cổng từ trung tâm điều khiển đến phần cứng radio, với một ổ cắm cho mỗi thiết bị. Từ sự hiểu biết của tôi, NIO có nghĩa là cho một máy chủ, nhiều khách hàng, nhưng những gì tôi đang nghĩ đến là một khách hàng, nhiều máy chủ.

Tôi cho rằng tùy chọn thứ ba là sử dụng MINA, nhưng tôi không chắc liệu đó có phải là việc ném quá nhiều vào một vấn đề đơn giản hay không.


Mỗi máy chủ từ xa sẽ có tối đa 8 kết nối, tất cả từ cùng một máy khách (để kiểm soát tất cả phần cứng và tách ổ cắm TX/RX). Tuy nhiên, một máy khách duy nhất sẽ muốn kết nối với một số máy chủ cùng một lúc. Thay vì đặt mỗi máy chủ trên các cổng khác nhau, có thể sử dụng bộ chọn kênh ở phía máy khách hay không hay hơn để đi io đa luồng ở phía máy khách và định cấu hình các máy chủ khác nhau?


Thực tế, vì các máy từ xa chỉ tương tác với phần cứng khác, RMI hay IDL/CORBA có phải là giải pháp tốt hơn không? Thực sự, tôi chỉ muốn có thể gửi lệnh và nhận từ xa từ phần cứng, và không phải tạo ra một số giao thức lớp ứng dụng để thực hiện nó.

Trả lời

9

Khả năng mở rộng có thể sẽ thúc đẩy lựa chọn gói của bạn. java.net sẽ yêu cầu một luồng cho mỗi socket. Mã hóa nó sẽ dễ dàng hơn đáng kể. java.nio hiệu quả hơn nhiều, nhưng có thể có nhiều lông mã.

Tôi sẽ tự hỏi mình có bao nhiêu kết nối bạn mong đợi để xử lý. Nếu nó tương đối ít (ví dụ, < 100), tôi sẽ đi với java.net.

+1

Với hệ điều hành 64 bit hiện đại, bạn có thể có hàng trăm nghìn chủ đề. –

+3

Chắc chắn, nhưng đó không nhất thiết là cách có thể mở rộng nhất để kiến ​​trúc một ứng dụng. –

+1

Nhưng một ổ cắm tốn nhiều tài nguyên hơn một sợi chỉ ... – Zombies

0

Số lượng kết nối bạn đang nói cho tôi biết bạn nên sử dụng java.net. Thực sự, không có lý do gì để phức tạp công việc của bạn với I/O không bị chặn. (Trừ khi hệ thống từ xa của bạn không đủ mạnh, nhưng tại sao bạn sử dụng Java trên chúng?)

Hãy xem gói Apache's XML-RPC. Thật dễ dàng để sử dụng, ẩn hoàn toàn công cụ mạng của bạn và hoạt động trên giao thức HTTP tốt. Không cần phải lo lắng về các vấn đề giao thức ... nó sẽ trông giống như các cuộc gọi phương thức cho bạn, trên cả hai đầu.

+0

XML-RPC trông thú vị, nhưng tôi đang sử dụng SE, và tôi nghĩ việc thêm/chuyển sang EE phức tạp hơn nhiều so với NIO, nhưng sửa tôi nếu tôi sai (chúng có chạy trên cùng một JVM không?). –

+0

Đó là một thư viện đơn giản và nên hoạt động trong SE và EE. Giống như một nhà bình luận khác, nó có vấn đề về khả năng mở rộng. nhưng đối với trường hợp 98%, tôi nghĩ nó khá chắc chắn. –

0

Với số lượng nhỏ các kết nối liên quan, java.net có vẻ như là giải pháp phù hợp.

Các áp phích khác đã nói về việc sử dụng XML-RPC. Đây là một lựa chọn tốt nếu khối lượng dữ liệu được gửi đi nhỏ, tuy nhiên tôi đã có kinh nghiệm xấu với các giao thức dựa trên XML khi viết liên lạc quá trình gửi lượng lớn dữ liệu (ví dụ: yêu cầu/phản hồi lớn hoặc số lượng nhỏ thường xuyên dữ liệu). Chi phí phân tích cú pháp XML thường là các đơn đặt hàng có cường độ cao hơn các định dạng dây được tối ưu hóa hơn (ví dụ: ASN.1).

Đối với các ứng dụng điều khiển âm lượng thấp, tính đơn giản của XML-RPC sẽ lớn hơn chi phí hiệu suất. Đối với truyền thông dữ liệu khối lượng cao, tốt hơn nên sử dụng giao thức dây hiệu quả hơn.

11

Tránh NIO trừ khi bạn có lý do chính đáng để sử dụng nó. It's not much fun and may not be as beneficial as you would think.Bạn có thể có khả năng mở rộng tốt hơn khi bạn đang xử lý hàng chục nghìn kết nối, nhưng với số thấp hơn, bạn có thể có được thông lượng tốt hơn với việc chặn IO. Như mọi khi, hãy tự mình thực hiện các phép đo trước khi cam kết với điều gì đó bạn có thể hối tiếc.

Một cái gì đó khác để xem xét là nếu bạn muốn sử dụng SSL, NIO làm cho nó cực kỳ đau đớn.

+1

Cảm ơn bạn đã nhận xét về SSL, điều này có thể sẽ dẫn đến quyết định của tôi. –

+0

Rất hay, vì tôi chắc chắn bạn đã chạy trên java 1.4 vào tháng 2 năm 2012 – sloven

1

Gần như không có lý do gì để viết loại mã mạng này từ đầu. Các gói như netty.io sẽ hầu như luôn mang đến cho bạn mã đáng tin cậy và linh hoạt hơn với ít dòng mã hơn so với giải pháp thủ công. Ngoài ra, với Netty, bạn có thể nhận hỗ trợ SSL w/o làm phức tạp việc triển khai của bạn. Thư viện như netty cũng obviate "async vs chủ đề" câu hỏi gần như hoàn toàn, mang đến cho bạn hiệu suất tốt, và vẫn cho phép bạn tinh chỉnh mô hình luồng khi cần thiết.

Các vấn đề liên quan