2009-03-31 13 views
8

Tôi có thể tạo nhiều luồng để hỗ trợ tính năng đa khách hàng trong lập trình socket; đó là làm việc tốt. Nhưng nếu 10.000 khách hàng muốn được kết nối, máy chủ của tôi không thể tạo quá nhiều luồng.Lập trình Socket Java không hoạt động với 10.000 khách hàng

Tôi làm cách nào để quản lý các chuỗi để tôi có thể nghe tất cả các ứng dụng này cùng một lúc?

Ngoài ra, nếu trong trường hợp này máy chủ muốn gửi thứ gì đó cho một khách hàng cụ thể, thì làm cách nào có thể?

+0

Điều này đã được trả lời: http://stackoverflow.com/questions/592303/asynchronous-io-in-java – mparaz

+0

Có một số đề xuất không chặn tuyệt vời của NIO bên dưới nhưng vì mục đích tóm tắt, hãy để tôi nêu rõ : Khi bạn mong đợi một vài khách hàng, bạn có thể đi một luồng trên mỗi socket. Nhưng khi bạn mong đợi 10K khách hàng, và tôi sẽ tranh luận (tùy thuộc vào I/O và CPU tải) rằng nếu bạn mong đợi bất cứ điều gì hơn 100 khách hàng bạn CẦN ĐI ĐẾN NIO WAY (không chặn IO). Ngay cả khi hệ điều hành của bạn thử 1.000 lần mỗi giây, bạn có thể tưởng tượng nhiệm vụ xử lý các ứng dụng khách 10K không? Nó không có ý nghĩa để đi với chặn ổ cắm với nhiều khách hàng! – Jeach

Trả lời

1

Đây không phải là một câu hỏi đơn giản, nhưng đối với một rất sâu (xin lỗi, không phải trong java mặc dù) câu trả lời thấy điều này: http://www.kegel.com/c10k.html


EDIT

Ngay cả với nio, đây là vẫn là một vấn đề khó khăn. 10000 kết nối là một gánh nặng tài nguyên to lớn trên máy tính, ngay cả khi bạn đang sử dụng các ổ cắm không bị chặn. Đây là lý do tại sao các trang web lớn có trang trại máy chủ và cân bằng tải.

7

Lập trình socket có thể mở rộng cao trong Java yêu cầu selectable channels được cung cấp trong gói "I/O mới" hoặc NIO. Bằng cách sử dụng IO không chặn, một luồng đơn có thể phục vụ nhiều ổ cắm, chỉ chăm sóc các ổ cắm đã sẵn sàng.

Một trong những ứng dụng NIO mã nguồn mở có thể mở rộng hơn là thành phần Grizzly của máy chủ ứng dụng Glassfish. Jean-Francois Arcand đã viết một số bài đăng blog chuyên sâu, đầy đủ thông tin về công việc của anh ấy trên dự án và bao gồm nhiều cạm bẫy tinh tế khi viết loại phần mềm này với NIO.

Nếu khái niệm IO không chặn là mới đối với bạn, sử dụng phần mềm hiện có như Grizzly, hoặc ít nhất sử dụng nó làm điểm khởi đầu cho thích ứng của bạn, có thể rất hữu ích.

11

Bạn nên điều tra thư viện NIO ("New I/O") của Java để lập trình mạng không chặn. NIO được thiết kế để giải quyết chính xác sự cố khả năng mở rộng máy chủ mà bạn đang gặp phải!

4

Một mô hình luồng thread-per-kết nối (Chặn Ổ cắm I/O) sẽ không quy mô quá tốt. Dưới đây là phần giới thiệu về Java NIO cho phép bạn sử dụng các cuộc gọi ổ cắm không chặn trong java: http://today.java.net/cs/user/print/a/350

Như bài viết nêu rõ, có rất nhiều khung làm việc để bạn không phải tự cuộn.

+0

Cảm ơn Peter, Đây là một liên kết hữu ích.Bạn có thể giúp tôi cho loại liên kết như vậy mà tôi có thể biết thêm chi tiết hay không. –

+0

Có mã mẫu trong JDK cho mô hình này. Lưu ý: bạn không thể vượt quá số lượng người dùng mà máy chủ của bạn sẽ hỗ trợ. Bạn có thể cần thêm máy chủ. –

1

Tại sao bạn không chỉ xử lý một lượng yêu cầu nhất định tại một thời điểm.

Hãy nói rằng bạn muốn xử lý tối đa là 50 yêu cầu tại một thời điểm (vì không tạo ra quá nhiều chủ đề)

Bạn tạo một threadpool của 50 chủ đề.

Bạn đặt tất cả các yêu cầu trong hàng đợi (chấp nhận kết nối, giữ ổ cắm mở) và mỗi luồng, khi hoàn tất, nhận yêu cầu tiếp theo, sau đó xử lý yêu cầu đó.

Điều này sẽ mở rộng dễ dàng hơn.

Ngoài ra, nếu có nhu cầu, nó sẽ được dễ dàng hơn để làm cân bằng tải, kể từ khi bạn có thể chia sẻ hàng đợi của bạn cho nhiều máy chủ

6

Những lợi ích của nio đang gây tranh cãi. Xem các bài viết trên blog của Paul Tyma herehere.

2

Như đã đề cập trước đây, 10.000 khách hàng không dễ dàng. Đối với java, NIO (có thể được tăng cường với một threadpool riêng biệt để xử lý từng yêu cầu mà không chặn luồng NIO) là cách thông thường để xử lý một lượng lớn khách hàng.

Như đã đề cập, tùy thuộc vào việc triển khai, các chuỗi có thể thực sự mở rộng, nhưng nó phụ thuộc rất nhiều vào mức độ tương tác giữa các kết nối máy khách. Chủ đề lớn có nhiều khả năng làm việc nếu có ít đồng bộ hóa giữa các chủ đề.

Điều đó nói rằng, NIO nổi tiếng là khó có thể nhận được 100% ngay khi lần đầu tiên bạn triển khai.

Tôi khuyên bạn nên thử hoặc ít nhất là tìm kiếm nguồn cho lib Naga NIO tại naga.googlecode.com. Các codebase cho lib là nhỏ so với hầu hết các khung NIO khác. Bạn sẽ có thể nhanh chóng thực hiện một thử nghiệm để xem bạn có thể nhận được 10.000 khách hàng và chạy hay không.

(Nguồn Naga cũng sẽ xảy ra là miễn phí để sửa đổi hoặc sao chép mà không gán tác giả ban đầu)

0

Cá nhân tôi thà sử dụng tạo ra một tùy chỉnh I/O không thiết lập chặn, ví dụ sử dụng một thread để chấp nhận khách hàng và sử dụng một luồng khác để xử lý chúng (kiểm tra xem có bất kỳ đầu vào nào và ghi dữ liệu vào đầu ra nếu cần).

0

Bạn sẽ phải tìm ra lý do tại sao ứng dụng của bạn không thành công ở 10.000 chủ đề.

  1. Có giới hạn khó về số lượng chủ đề trong JVM hoặc hệ điều hành không? Nếu vậy, nó có thể được dỡ bỏ không?

  2. Bạn sắp hết bộ nhớ? Hãy thử định cấu hình kích thước ngăn xếp nhỏ hơn cho mỗi chuỗi và/hoặc thêm bộ nhớ khác vào máy chủ.

  3. Cái gì khác? Sửa nó.

Chỉ khi bạn đã xác định nguồn gốc của sự cố, bạn sẽ có thể khắc phục sự cố. Trong lý thuyết 10.000 chủ đề nên được OK nhưng ở mức độ đồng thời nó đòi hỏi một số điều chỉnh thêm của JVM và hệ điều hành nếu bạn muốn nó làm việc ra ngoài.

Bạn cũng có thể xem xét NIO nhưng tôi nghĩ rằng nó cũng có thể hoạt động tốt với các chuỗi.

+0

Tôi có một thời gian khó tiêu hóa ý kiến ​​của bạn (chủ đề 10K nên được tốt)? Tôi thách thức bạn viết một chương trình nhỏ thực hiện một tác vụ duy nhất. Đo điểm chuẩn tốt và giữ số đó an toàn. Sau đó, tạo chủ đề 10K và bắt đầu nhiệm vụ tương tự đó trong mỗi chuỗi, đồng thời cũng đánh giá nó. Không có vấn đề mà hệ điều hành bạn sử dụng, bạn có thể sẽ có nạn đói! – Jeach

+0

Hi Jeach, nhiệm vụ ở đây là "chờ I/O", không có quá trình xử lý nào được thực hiện. Hệ điều hành không làm bất kỳ ngữ cảnh nào chuyển sang các luồng đang chờ I/O. Hệ điều hành không cấp phát bộ nhớ vật lý cho các vùng của ngăn xếp không được sử dụng. –