2009-09-21 34 views
6

Tôi đang trong quá trình chuyển đổi mã java của chúng tôi để sử dụng NIO, nhưng tôi không chắc chắn về cách tốt nhất để thiết kế nó.Mô hình tốt nhất cho việc triển khai NIO?

Cách tiếp cận ban đầu của tôi là tạo một nhóm các chủ đề chọn. Các chủ đề được bắt đầu/bị giết khi cần thiết và các kênh được đăng ký với một chuỗi chọn khi chúng được kết nối/chấp nhận theo kiểu vòng tròn. Từ đó, mỗi chuỗi chặn trên select() và khi được đánh thức sẽ chạy cuộc gọi lại thích hợp được kết hợp với mỗi kênh có khóa được chọn.

Ngoài thiết kế "chuỗi nhiều trình chọn" này, tôi cũng thấy mọi người nói để sử dụng một chuỗi trình chọn đơn và một nhóm các luồng công văn. Khi một hoạt động IO sẵn sàng được thực hiện, bộ chọn sẽ thông báo một luồng điều phối, sau đó xử lý yêu cầu. Mô hình này có lợi ích là không chặn luồng IO, nhưng bây giờ chúng ta buộc tất cả IO vào một luồng đơn và xử lý đồng bộ hóa/một hàng đợi sự kiện trong bộ điều phối.

Ngoài ra, tôi sẽ không thể sử dụng bộ đệm byte trực tiếp để đọc từng kênh, truyền trực tiếp vào cuộc gọi lại. Thay vào đó, tôi phải sao chép dữ liệu mỗi lần đọc xảy ra vào một mảng và đặt lại. (Tôi nghĩ ..)

Cách tốt nhất để thực hiện điều này là gì?

Trả lời

4

Hãy nhìn vào các Reactor Pattern

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

Làm thế nào bạn muốn selectors bạn để làm việc thực sự phụ thuộc vào usecase của bạn. (Số lượng kết nối, kích thước tin nhắn, vv)

Vấn đề mà bạn đang cố gắng giải quyết bằng cách chuyển từ IO sang NIO là gì?

+0

Hiệu suất và khả năng mở rộng. Ít hơn rất nhiều chủ đề, và nó nên đơn giản hóa thiết kế của chúng tôi. –

+0

Mẫu Lò phản ứng là một lựa chọn rất tốt. Có một số triển khai của thiết kế này sử dụng nhiều luồng để xử lý các sự kiện I/O. Những thiết kế này là xấu và đánh bại mục đích của I/O không đồng bộ không chặn. Khi viết một thiết kế cho các máy chủ hiệu suất cao và có khả năng mở rộng, bạn muốn sử dụng các cuộc gọi I/O không đồng bộ và giữ tất cả nó trên một luồng - chủ đề 'Selector'. –

3

Bạn thực sự nên xem xét Mina,

http://mina.apache.org/

Nó giải quyết tất cả các vấn đề bạn đề cập.

+1

Có mặc dù bạn nên thử và hiểu những gì đang diễn ra dưới sự che chở. – pjp

+1

Đó chính xác là những gì tôi đã làm. Tôi đã không thực sự sử dụng Mina trong dự án của mình nhưng tôi đã học được rất nhiều từ việc đọc triển khai của họ. –

1

Ngoài ra, hãy xem netty thực sự nhanh và giàu tính năng và cũng được sử dụng trong các hệ thống lớn và các công ty lớn như Redhat (jboss), Twitter, Facebook ....

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