Tôi đã đọc rất nhiều tài liệu trên web về an toàn và hiệu suất của chuỗi trong các phiên bản ruby và đường ray khác nhau và tôi nghĩ rằng tôi hiểu những điều đó khá tốt vào thời điểm này.Làm thế nào để triển khai một ứng dụng Rails không đồng bộ theo chủ đề?
Điều gì dường như bị bỏ sót kỳ lạ từ các cuộc thảo luận là làm thế nào để triển khai ứng dụng Rails không đồng bộ. Khi nói về chủ đề và đồng bộ trong một ứng dụng, có hai điều mọi người muốn tối ưu hóa:
- sử dụng tất cả các lõi CPU với việc sử dụng tối thiểu RAM
- việc có thể để phục vụ các yêu cầu mới trong khi yêu cầu trước đó đang chờ đợi trên IO
Điểm 1 là nơi mọi người nhận được (đúng) vui mừng về JRuby. Đối với câu hỏi này, tôi chỉ cố gắng để tối ưu hóa điểm 2.
nói đây là bộ điều khiển chỉ trong ứng dụng của tôi:
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
fast
không có IO và có thể phục vụ hàng trăm hoặc hàng ngàn yêu cầu mỗi giây, và slow
phải gửi yêu cầu qua mạng, chờ công việc được thực hiện, sau đó nhận câu trả lời qua mạng và do đó chậm hơn nhiều so với fast
.
Vì vậy, triển khai lý tưởng sẽ cho phép hàng trăm yêu cầu đến fast
được hoàn thành trong khi yêu cầu slow
đang chờ IO.
Điều gì dường như bị thiếu trong các cuộc thảo luận trên web là lớp ngăn xếp nào chịu trách nhiệm bật đồng thời này. mỏng có cờ --threaded
, sẽ "Gọi ứng dụng Rack trong chủ đề [thử nghiệm]" - điều đó có bắt đầu một chuỗi mới cho mỗi yêu cầu gửi đến không? Spool up rack trường hợp ứng dụng trong các chủ đề mà vẫn tồn tại và chờ đợi cho các yêu cầu gửi đến?
Là cách duy nhất hoặc có những người khác không? Liệu vấn đề thời gian chạy ruby để tối ưu hóa điểm 2?
Tôi nghi ngờ phiên bản ruby của bạn sẽ có nhiều điểm liên quan đến điểm 2. Điều này sẽ phụ thuộc nhiều vào việc triển khai đồng thời của máy chủ và cách đặt chính xác đường ray. – providence