2013-04-01 46 views
9

Tôi đang cố gắng tận dụng sự kiện Máy chủ gửi trong ứng dụng của mình. Tôi đang sử dụng Sinatra và đá quý sinatra-sse. Viên ngọc này kết thúc cuộc gọi Sinatra stream :keep_alive.Sinatra trực tuyến với Puma?

Khi chạy ứng dụng của tôi trên Thin, tôi hoàn toàn không có vấn đề gì và luồng sự kiện của tôi hoạt động như mong đợi. Tuy nhiên, khi tôi chuyển ứng dụng của mình để chạy với Puma mọi thứ hoạt động, ngoại trừ sse_stream của tôi hoàn toàn không làm gì cả! Nó chỉ trả về một trang trống.

dòng của tôi được thiết lập như vậy

get "/logstream/:server" do 
    if rbcserver = MyApp.servers[params[:server]] 
     sse_stream do |stream|  
      rbcserver.add_web_logger(stream) 
      stream.callback { rbcserver.remove_web_logger(stream) } 
     end 
    else 
     error 404 
    end 
end 

tôi bắt đầu mỏng như vậy:

@@puma_instance = Puma::Server.new MyApp::WebUI 
@@puma_instance.add_tcp_listener ip, port 
@@puma_instance.run 

Bất cứ ý tưởng gì đang xảy ra? Bất kỳ trợ giúp sẽ được đánh giá cao.

EDIT: một số thông tin hơn Đây là những gì cURL cho khi chạy trên Puma

$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver  
HTTP/1.1 200 OK 
Content-Type: text/event-stream;charset=utf-8 
X-Content-Type-Options: nosniff 
Transfer-Encoding: chunked 

$ 

Trong khi đây là những gì xảy ra trên Thin

$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver           
HTTP/1.1 200 OK 
Content-Type: text/event-stream;charset=utf-8 
X-Content-Type-Options: nosniff 
Connection: close 
Server: thin 1.5.1 codename Straight Razor 

event: <event name> 
data: <my data> 

event: <event name> 
data: <my data> 

<continues as more data comes in> 

EDIT: Tôi nên thêm rằng ứng dụng của tôi sử dụng EventMachine ở cốt lõi của nó, do đó, việc ghép nối với EM của sinatra_sse rất có thể không phải là vấn đề.

Trả lời

3

Tôi tin rằng vấn đề xoay quanh số explicit use của thư viện EventMachine, mà nó does not list as a dependency. Tuy nhiên, nó liệt kê Thin trong Gemfile và EventMachine là một phụ thuộc cốt lõi của Thin.

Mô hình đồng thời của Puma là quite different. Trong thực tế, bạn sẽ tìm thấy những tuyên bố sau ngay ở đầu README của dự án: Máy chủ

Puma vẫn cải thiện thông lượng MRI của bằng cách cho phép chặn IO được chạy đồng thời (EventMachine-based như Thin tắt khả năng này , yêu cầu bạn sử dụng các thư viện đặc biệt).

EDIT

Nếu bạn quan tâm tìm hiểu thêm về Rack, Rails, Puma, và SSE, bạn có thể thưởng thức this great blog post bởi Aaron Patterson, một thành viên chủ chốt của Ruby/Rails và tất cả xung quanh sưng chàng.

+0

Vâng, ứng dụng của tôi sử dụng EventMachine là tốt, vì vậy tôi không nghĩ rằng điều này là do EventMachine không chạy. Ngoài ra, dòng cụ thể mà bạn liên kết dường như chỉ được sử dụng để duy trì kết nối khi không có dữ liệu được gửi. Ứng dụng của tôi gửi lượng dữ liệu phong phú thường xuyên, vì vậy tôi không nghĩ rằng có bất kỳ điều gì liên quan đến nó:/ –

+1

@IlyaO. Chỉ cần chỉnh sửa câu trả lời của tôi với một liên kết đến một vấn đề github Puma phác thảo các rào chắn cho việc thực hiện Puma của async.callback. –

+0

Chỉ cần đưa cho một tấm vé. Tôi sẽ cung cấp cho bạn tiền thưởng nếu không ai khác có bất cứ điều gì để thêm vào. –