2011-11-22 25 views
5

Tôi đang viết một ứng dụng phòng trò chuyện đơn giản trong Rails 3.1 - cho mục đích học tập. Để bắt đầu tôi có tất cả các mô hình cần thiết (tin nhắn, người dùng, phòng, vv) và mọi thứ hoạt động tốt. Các khách hàng thăm dò ý kiến ​​máy chủ mỗi phút (ví dụ) và nhận được tin nhắn mới nếu họ có bất kỳ.Có thể bỏ phiếu dài với ứng dụng Rails bằng EventMachine không?

Tôi muốn thay đổi bỏ phiếu đơn giản thành bỏ phiếu dài và không thể tìm hiểu xem điều này có thể được thực hiện trong cùng một ứng dụng hay tôi phải tạo một số máy chủ Push khác cho cuộc thăm dò dài.

Tôi đã đọc rất nhiều về EventMachine và thay đổi ứng dụng đường ray của tôi thành người dùng khi tôi muốn sử dụng EventMachine cho cơ chế điều khiển sự kiện. Tôi nghĩ rằng kênh EventMachine sẽ có ích cho việc này. Một khách hàng sẽ kết nối và chờ tin nhắn trong phòng trò chuyện và nó sẽ chỉ nhận được tin nhắn khi một người được gửi đến phòng.

Điều tôi không thể hiểu là làm thế nào tôi có thể chia sẻ phiên bản EventMachine :: Channel giữa tất cả các kết nối máy khách của tôi. Cách tiếp cận này thậm chí có thể hay tôi đang đi sai đường?

Nếu có thể, tôi muốn một giải pháp có thể chạy dưới dạng ứng dụng đường ray đơn được lưu trữ trên Heroku.

+0

Tôi không phải là chuyên gia về máy sự kiện, nhưng tôi nghĩ điều đó là có thể. Và bạn không chia sẻ kênh giữa các khách hàng của mình, nhưng bạn có một kênh cho mỗi khách hàng và bạn cần phải xây dựng thứ gì đó trên đầu trang của EM để gửi tin nhắn giữa những người dùng khác nhau. – Augusto

+0

Có, giả sử tôi có một kênh cho mọi khách hàng. Tôi có thể lưu trữ tất cả các cá thể kênh đó ở đâu để nó có thể truy cập được từ bộ điều khiển được gọi khi ai đó gửi tin nhắn? – Oded

Trả lời

0

Mở rộng nội dung tôi đã đề cập trên nhận xét, kiểm tra bài viết này blog giải thích cách tạo ứng dụng trò chuyện dựa trên văn bản bằng EM và sử dụng AMQP để phát tin nhắn cho người dùng khác.

Tôi nghĩ bạn có thể làm như vậy hoặc sử dụng một số trong hàng đợi bộ nhớ để chia sẻ tin nhắn, và điều này chắc chắn sẽ hoạt động trên heroku, vì bạn không có sự phụ thuộc vào dịch vụ bên ngoài như RabbitMQ. Dưới đây là một cuộc thảo luận tốt đẹp về khuôn khổ hàng đợi khác nhau: ActiveMQ or RabbitMQ or ZeroMQ or

0

Rails sẽ streaming được thêm vào trong phiên bản 4. Còn bây giờ, bạn có thể truyền trực tuyến (polling dài) như trong this ví dụ với Pub/tính năng Sub Sinatra và Redis như một backend . Bạn sẽ phải thêm một hành động khác để xử lý các thư đã gửi của người dùng, thêm chúng vào lệnh Redis's với lệnh PUBLISH. Bạn nên sử dụng một máy chủ có sự kiện như Thin hoặc Puma.

1

Vâng, chắc chắn. Tôi chỉ viết một bản demo sử dụng máy sự kiện. Trường hợp của tôi là người chơi đi vòng quanh bản đồ và những người chơi khác sẽ có thể nhìn thấy nó. Bản demo trông như thế:

  1. Một khách hàng thiết lập một kết nối, báo cáo riêng của mình phối hợp (được tạo ngẫu nhiên)

  2. Có một mảng duy trì tất cả các tọa độ cho mỗi khách hàng

  3. Khi một khách hàng di chuyển, nó sẽ gửi tọa độ mới của nó đến máy chủ. Sau đó, máy chủ tìm ra những người ở gần anh ta (từ mảng) và đẩy phối hợp mới vào các máy khách đó.

Tôi đã thử nghiệm nó với gần 5000 khách hàng và mỗi 20-30 người chơi thứ hai di chuyển vị trí của nó. Và quá trình máy chủ chỉ mất ít hơn 100M bộ nhớ & 50% -60% sử dụng CPU (trên một lõi đơn).

Trong trường hợp của bạn, tôi nghĩ bạn có lẽ nên thử faye. Nó dựa trên máy sự kiện và giải pháp thích hợp cho những thứ như phòng trò chuyện.

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