2012-04-11 18 views
14

Tôi đang viết mạng phía máy chủ của trò chơi nhiều người chơi. Trò chơi là một game nhập vai và nó có công suất tối đa tuyệt đối 2000 người chơi, nhưng thực tế nó sẽ tối đa ở khoảng 300 người chơi, mặc dù nó có thể cao hơn hoặc thấp hơn. Trong thời gian dài nhất, mỗi lần tôi phải kết nối mạng với nhiều khách hàng, tôi đã mắc kẹt với NIO vì nó không yêu cầu sử dụng hàng trăm chủ đề. Gần đây, tôi đã chạy vào một bản trình bày PowerPoint, nơi nó mô tả chi tiết hai mô hình, và nó gần như làm cho mô hình thread-per-client có vẻ vượt trội so với NIO. Tôi cũng đã tìm thấy những nơi mà nó nói rằng IO cũ thực sự có thể tốt hơn NIO là tốt.Chủ đề I/O cũ cho mỗi mô hình máy khách hoặc mẫu lò phản ứng NIO?

Có thể tìm thấy PowerPoint tại đây (hơi cũ): http://www.mailinator.com/tymaPaulMultithreaded.pdf.

Tôi chưa viết bất kỳ nội dung nào, vì vậy sẽ không có vấn đề gì nếu tôi phải bắt đầu lại từ đầu nếu tôi phải thay đổi toàn bộ thiết kế mạng của mình. Tôi không bị áp lực trong thời gian. Ban đầu, tôi đã thiết kế triển khai thực hiện mẫu lò phản ứng với NIO (chọn một sự kiện, gửi một trình xử lý để xử lý sự kiện).

Thông tin thêm có thể được tìm thấy ở đây: http://en.wikipedia.org/wiki/Reactor_pattern

toàn bộ thi hành lò phản ứng của tôi được thiết kế để sử dụng một chủ đề duy nhất. Kể từ khi tôi đọc rằng IO cũ có thể hoạt động tốt hơn, nó thực sự đưa tôi vào tình thế tiến thoái lưỡng nan. Tôi không muốn thiết kế một hệ thống NIO phức tạp sử dụng nhiều luồng chỉ để tận dụng toàn bộ sức mạnh của CPU, nhưng tôi cũng rạn nứt với ý tưởng có một ứng dụng đơn lẻ sử dụng hơn 300 luồng. Thiết kế nào phù hợp với mục đích của tôi? Lợi thế của thread cho mỗi khách hàng là nó thực sự sử dụng khai thác tất cả sức mạnh của CPU bằng tự nhiên, nhưng đồng thời, nó bogs xuống hệ thống. Chưa kể, kích thước ngăn xếp của một sợi đơn chiếm rất nhiều bộ nhớ (khi nhân với vài trăm lần). Tôi có nên dính vào mẫu lò phản ứng không?

Tôi biết câu hỏi này hơi mơ hồ, nhưng tôi cảm thấy rằng tôi cần đặt câu hỏi cụ thể cho tình huống của mình vì tôi không thể tìm thấy câu hỏi trên trang web này cũng như trang web giải quyết vấn đề của tôi. Có một trò chơi về trò chơi, nhưng trò chơi có ý nghĩa để xử lý hàng chục nghìn người chơi.

Cảm ơn rất nhiều! Nếu bạn cần bất kỳ làm rõ, xin vui lòng yêu cầu!

Trả lời

10

Tôi không muốn thiết kế hệ thống NIO phức tạp sử dụng nhiều luồng chỉ để tận dụng toàn bộ sức mạnh của CPU, nhưng tôi cũng răn đe về việc có một ứng dụng đơn lẻ sử dụng hơn 300 luồng. Thiết kế nào phù hợp với mục đích của tôi?

Các JVM của chúng tôi chạy liên tục hơn 500 chủ đề (ngay bây giờ chúng đang ở mức ~ 700) với các đỉnh trong 1000 giây. Tôi thấy không có lý do gì để nghĩ rằng 800 chủ đề là một cách nào đó "rìa" xứng đáng. Tôi sẽ bắt đầu lo lắng khi bạn đạt đến 10.000 chủ đề (như một số công viên bóng) - có thể ít hơn nếu bạn đang chạy dưới 32bit. Bạn chắc chắn sẽ phải phân bổ bộ nhớ nhiều hơn khi bạn nhận được vào những năm 1000 nhưng bất cứ điều gì dưới 1k chủ đề không phải là một vấn đề. Đây là một trang tốt trên thread creation numbers.

NIO hiệu quả nhất khi bạn có số lượng lớn lớn kết nối với IO không thường xuyên. Nó giải quyết rất nhiều vấn đề khi nói đến giao tiếp không đồng bộ và có những thứ bạn có thể làm với NIO rằng "IO cũ" không thể làm từ quan điểm chức năng (các kênh ngắt và IO không chặn), nhưng trình xử lý chuỗi đơn là một mô hình đơn giản hơn nhiều và tôi không ngạc nhiên rằng nó có thể hoạt động tốt hơn NIO trong nhiều cấu hình. Với NIO, bạn đang thực hiện rất nhiều thao tác trong mã Java được thực hiện cho bạn trong JVM hoặc thậm chí là hạt nhân trong mã nguồn gốc.Ghép kênh và xử lý IO sẵn sàng là tất cả những thứ mà bạn nhận được "miễn phí" (về mặt phức tạp) với mô hình "cũ IO".

Tôi sẽ giữ cho nó đơn giản và gắn bó với mẫu chủ đề cho mỗi khách hàng cho đến khi bạn có lý do chính đáng để đạt được mức độ phức tạp.

+0

Xin lỗi @Martin. Tôi có nghĩa là giữ cho nó đơn giản với mô hình thread-per-client. – Gray

+0

Vì vậy, bạn nghĩ rằng 300 chủ đề trên đầu trang của "500" là 'không đáng kể'? –

+0

Tôi không có ý kiến ​​thảo luận, nhưng nếu tôi liên tục viết dữ liệu cho khách hàng từ xa và đọc từ khách hàng đó thì sao? –

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