2012-04-01 6 views
5

Tôi có một ứng dụng Rails đơn luồng chạy trên chế độ đơn luồng mỏng trên Heroku Cedar.Ứng dụng Rails đơn luồng của tôi xử lý các yêu cầu đồng thời như thế nào?

Trong khi tôi thực hiện một yêu cầu POST lớn (tải lên tệp) mất hơn một phút, tôi có thể thực hiện các yêu cầu GET khác cùng một lúc.

Hỗ trợ Heroku đảm bảo với tôi rằng lớp định tuyến của họ không lưu trữ yêu cầu và sau đó gửi tất cả cùng một lúc (đó là hành vi của nhiều proxy, chẳng hạn như nginx). Họ nhấn mạnh rằng ứng dụng của tôi đang xử lý các yêu cầu đồng thời.

Điều gì đang xảy ra ở đây?

Trả lời

6

Thin được xây dựng trên EventMachine, cung cấp IO dựa trên sự kiện.

Điều này có nghĩa là Thin không nhận được yêu cầu POST của bạn, đồng thời phục vụ các yêu cầu GET trong khi đó. Khi dữ liệu POST được tải lên, Thin sau đó tiếp tục truyền nó tới Rails (nơi nó được xử lý đồng bộ và chặn các yêu cầu khác cho đến khi kết thúc).

+0

thú vị - nếu đúng, tôi ngạc nhiên rằng hành vi này của mỏng không được nhắc đến nhiều hơn. nó giống như nó có một proxy nhỏ nhỏ ở phía trước nó, cải thiện sự tương tranh. bạn có biết phần nào của đoạn mã nhỏ mà tôi có thể xem để hiểu hành vi này không? –

+0

Tôi đã không nhìn vào mã của mỏng, nhưng, hợp lý, nó phải là lớp mạng. Không biết nếu nó dễ dàng để xác định điều này trong các nguồn. –

+0

Có vẻ như tác giả của những người đồng hành mỏng: https://groups.google.com/forum/#!msg/thin-ruby/uKLD-qob6Kc/gH8b4MPATI8J –