2011-04-22 39 views
6

Tôi có một câu hỏi làm phiền tôi một lúc. Ví dụ, tôi có một máy chủ đa luồng, khi nó nhận được một yêu cầu, nó chuyển yêu cầu này đến một trình xử lý, trình xử lý này sẽ xử lý yêu cầu này. Một lý do chúng tôi làm cho máy chủ đa luồng là: nếu máy chủ không đa luồng, khi máy chủ xử lý yêu cầu này, trong thời gian có nghĩa, yêu cầu này sẽ bị hủy do yêu cầu này sẽ bị xóa do máy chủ không khả dụng ngay bây giờ.Thay thế Đa luồng trong Java

Vì vậy, tôi tự hỏi nếu có một sự thay thế của máy chủ đa luồng, ví dụ, chúng ta có thể tạo một hàng đợi cho máy chủ không đa luồng? khi nó có thể tìm nạp một yêu cầu khác từ hàng đợi khi nó kết thúc.

+0

Nếu người yêu cầu không cần trả lời đồng bộ, chỉ cần triển khai dịch vụ xếp hàng nhắn tin cơ bản. Thành phần nhận các kết nối mạng vẫn phải là đa luồng, nhưng nó chỉ trích xuất dữ liệu yêu cầu và đổ nó vào hàng đợi (FIFO). Bạn có một chuỗi trình đọc duy nhất để nhận thư cũ nhất trong hàng đợi để xử lý thực tế. Loại mô hình này đã được sử dụng trong nhiều năm và phổ biến cho các hệ thống nhắn tin điểm-điểm. – ewh

Trả lời

1

Bạn vẫn có thể có một công cụ luồng đơn lẻ với máy chủ đa luồng.

xem xét bộ xương sau - nếu bạn có Động cơ chạy, nó có thể hoàn toàn đơn luồng, chỉ cần chuyển yêu cầu theo thứ tự mà chúng được nhận. Điều này cho phép bạn sử dụng các thành phần không an toàn cho luồng trong logic nghiệp vụ và bạn đã quản lý tách lớp mạng của mình khỏi lớp logic nghiệp vụ của mình! Đó là một kịch bản thắng-thắng.

class Engine implements Runnable { 

    private final Object requestLock = new Object(); 
    private List<Request> requests = new LinkedList<Request>(); 
    private boolean running = true; 

    private Request nextRequest() { 
     synchronized(requestLock) { return requests.poll(); } 
    } 

    /** 
    * The engine is single threaded. It doesn't care about server connections 
    */ 
    public void run() { 
     while(running) { 
      Request request = nextRequest(); 
      // handle your request as normal 
      // also consider making a mechanism to send Responses 
     } 
    } 
} 
2

Có, bạn có thể có event-based server. Khả năng này được cung cấp bởi gói java.nio, mặc dù bạn có thể sử dụng một khung như netty thay vì làm điều đó từ đầu. Tuy nhiên, lưu ý rằng trong khi điều này được sử dụng để được coi là một cách để có được hiệu suất tốt hơn, nó có vẻ như một máy chủ đa luồng thông thường thực sự là offers better performances với phần cứng và hệ điều hành ngày nay.

2

Có thể. Bạn đã xem xét kỹ thuật SEDA-like (ví dụ: event-driven kỹ thuật) chưa? Bạn cũng có thể muốn điều tra thư viện Netty. Nó làm hầu hết công việc cho bạn khi nói đến việc sử dụng NIO.