2010-09-01 37 views
5

Tôi đang cố gắng tạo một ứng dụng ruby ​​trên đường ray thương mại điện tử, nơi khách hàng tiềm năng có thể đặt hàng và chủ cửa hàng sẽ có thể nhận được đơn đặt hàng trong thời gian thực. Thứ tự cuối cùng sẽ được ghi vào cơ sở dữ liệu (tại thời điểm SQLite) và chủ cửa hàng sẽ mở cửa sổ trình duyệt, nơi các đơn đặt hàng mới sẽ xuất hiện ngay sau khi đơn đặt hàng được hoàn tất. (Thông tin ứng dụng: Tôi đang sử dụng khung đường ray HOBO và lập kế hoạch để lưu trữ ứng dụng trong Heroku)Tôi làm cách nào để truy xuất các bản ghi được cập nhật trong thời gian thực? (thông báo đẩy?)

Tôi đang xem xét công nghệ tốt nhất để thực hiện điều này, vì ứng dụng dự kiến ​​sẽ có nhiều người dùng gửi nhiều đơn đặt hàng:

1) Mỗi ​​cửa sổ trình duyệt làm mới trang sau mỗi X phút, bỏ phiếu liên tục máy chủ cho các bản ghi mới (đơn đặt hàng mới). Tất nhiên, điều này đặt một tải nặng trên máy chủ.

2) Như trên, nhưng thăm dò ý kiến ​​máy chủ với một số loại khung AJAX.

3) Sử dụng một số loại công nghệ đẩy máy chủ, như nhắn tin không đồng bộ 'sao chổi'. Tìm thấy Juggernaut, chỉ có vấn đề là nó đang sử dụng các cổng tùy chỉnh và Flash, và điều này có thể là một vấn đề khi ứng dụng của tôi có thể truy cập được sau tường lửa của công ty và NAT.

4) Tôi cũng đang kiểm tra khung công tác node.js, có vẻ hiệu quả đối với loại tin nhắn không đồng bộ này, mặc dù nó không được hỗ trợ trong Heroku.

Cách hiệu quả nhất để triển khai loại chức năng này là gì? Có lẽ có một phương pháp khác mà tôi đã không nghĩ đến?

Cảm ơn bạn đã dành thời gian và trợ giúp!

+1

bạn đã thực hiện điều này bằng cách nào? :) – bxjx

Trả lời

3

Node.js có lẽ sẽ phù hợp - nhanh, yêu thích thời gian thực và hỗ trợ sao chổi tuyệt vời. Nhược điểm duy nhất là bạn đang giới thiệu một công nghệ khác vào giải pháp của bạn. Khá thú vị khi lập trình ở tho và rất nhiều thư viện được lấy cảm hứng từ đường ray và Sinatra.

Tôi biết heroku đã chạy một nút.js beta trong một thời gian và mọi người đã sử dụng nó như một phần của cuộc cạnh tranh nodeknockout gần đây. See this blog post. Nếu đó không phải là một lựa chọn, bạn chắc chắn có thể lưu trữ nó ở nơi khác. Nếu bạn lưu trữ nó tại heroku, bạn có thể yêu cầu proxy. Nếu không, bạn có thể vui vẻ chạy nó ra khỏi một tên miền phụ để bạn có thể chia sẻ cookie.

Đồng thời thanh toán socket.io. Nó làm một công việc tuyệt vời của việc lựa chọn cách tốt nhất để làm sao chổi dựa trên khả năng của trình duyệt.

Để chia sẻ dữ liệu giữa nút và đường ray, bạn có thể chia sẻ cookie và sau đó lưu trữ dữ liệu phiên trong cơ sở dữ liệu của bạn nơi cả hai ứng dụng có thể truy cập vào nó. Một kiến ​​trúc có liên quan hơn có thể liên quan đến việc sử dụng Redis để xuất bản các thông báo giữa chúng. Hoặc bạn có thể thoát khỏi mọi thứ bạn cần trong các yêu cầu http.

1

Trong HTTP, các yêu cầu chỉ có thể đến từ khách hàng. Vì vậy, các tùy chọn tốt nhất là những gì bạn đã đề cập (bỏ phiếu và HTTP streaming).

Bỏ phiếu là tùy chọn triển khai dễ dàng hơn; nó sẽ sử dụng khá nhiều băng thông. Đó là lý do tại sao bạn nên giữ các yêu cầu và phản hồi càng nhỏ càng tốt, vì vậy bạn chắc chắn nên sử dụng XHR (Ajax) cho việc này.

Tùy chọn khác của bạn là phát trực tuyến HTTP (Comet); nó sẽ đòi hỏi nhiều công việc hơn trong việc thiết lập, nhưng bạn có thể thấy nó có giá trị công sức. Bạn có thể cung cấp cho Realtime on Rails một ảnh. Để biết thêm thông tin và lời khuyên về làm thế nào để giảm thiểu sử dụng băng thông, xem:

http://ajaxpatterns.org/Periodic_Refresh
http://ajaxpatterns.org/HTTP_Streaming

+0

Xin chào và cảm ơn bạn đã trả lời. Tôi nghĩ rằng http streaming (comet) phù hợp hơn với ứng dụng của tôi, vì tôi hy vọng các chủ cửa hàng sẽ đi trước các trình duyệt của họ suốt cả ngày, chờ các đơn đặt hàng. Điều này có thể tạo ra một gánh nặng đáng kể trên máy chủ nếu tôi sử dụng bỏ phiếu. Vậy làm cách nào để tích hợp các máy chủ sao chổi (như node.js và Ajax Push Engine) với ứng dụng Ruby on Rails hiện có của tôi? Điều này có nghĩa rằng tôi phải trả tiền cho một dịch vụ lưu trữ Linux khác (ngoài heroku), nơi mà các máy chủ sao chổi sẽ được cài đặt? Bạn nghĩ sao? Cảm ơn! – Alex

0

Trên thực tế, nếu bạn có storeowner của bạn chạy Chrome (trình duyệt khác sẽ làm theo ngay), bạn có thể sử dụng WebSockets (chỉ dành riêng cho thông báo của chủ cửa hàng), cho phép bạn mở kết nối liên tục và bạn có thể gửi dữ liệu đến trình duyệt mà không cần trình duyệt yêu cầu bất kỳ điều gì.

Có một vài thư viện websocket cho node.js, nhưng tôi tin rằng bạn có thể tự mình làm dễ dàng bằng cách sử dụng kết nối tcp thông thường.

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