2010-09-01 11 views
5

Próbuję utworzyć aplikację e-commerce ruby ​​on rails, w której potencjalni klienci będą mogli złożyć zamówienie, a właściciel sklepu będzie mógł otrzymać zamówienie w czasie rzeczywistym. Sfinalizowane zamówienie zostanie zapisane w bazie danych (w tej chwili SQLite), a właściciel sklepu będzie miał otwarte okno przeglądarki, w którym nowe zamówienia pojawią się zaraz po sfinalizowaniu zamówienia. (Informacje o aplikacji: używam szkieletu HOBO i planuję hostować aplikację w Heroku)Jak mogę pobierać zaktualizowane rekordy w czasie rzeczywistym? (powiadomienia push?)

Rozważam teraz najlepszą technologię do wdrożenia tego, ponieważ oczekuje się, że aplikacja będzie miała wielu użytkowników wysyłanie wielu zamówień:

1) Każde okno przeglądarki odświeża stronę co X minut, ciągłe polerowanie serwera w poszukiwaniu nowych rekordów (nowe zamówienia). Oczywiście powoduje to duże obciążenie serwera.

2) Jak wyżej, ale odpytuj serwer za pomocą jakiejś architektury AJAX.

3) Użyj jakiejś technologii przekazywania serwera, na przykład asynchronicznego przesyłania wiadomości "komety". Znaleziony Juggernaut, jedynym problemem jest to, że używa Flasha i niestandardowych portów, a to może być problem, ponieważ moja aplikacja powinna być dostępna za firmowymi zaporami ogniowymi i NATem.

4) Sprawdzam również framework node.js, wydaje się być skuteczny dla tego rodzaju asynchronicznego przesyłania komunikatów, chociaż nie jest obsługiwany w Heroku.

Jaki jest najbardziej efektywny sposób wdrożenia tego rodzaju funkcjonalności? Czy jest może inna metoda, o której nie myślałem?

Dziękuję za poświęcony czas i pomoc!

+1

Jak poszło z tym? :) – bxjx

Odpowiedz

3

Node.js prawdopodobnie byłby niezły - jest szybki, kocha w czasie rzeczywistym i ma świetne wsparcie dla komety. Jedynym minusem jest to, że wprowadzasz inną technologię do swojego rozwiązania. Fajnie jest programować, a wiele bibliotek zostało zainspirowanych szynami i sinatrą.

Wiem, że heroku uruchomił węzeł.js beta na jakiś czas, a ludzie używali go w ramach niedawnego konkursu nodeknout. See this blog post. Jeśli to nie jest opcja, możesz zdecydowanie hostować ją gdzie indziej. Jeśli hostujesz go w heroku, możesz mieć możliwość wysyłania żądań proxy. W przeciwnym razie możesz z powodzeniem wylogować się z poddomeny, aby móc udostępniać pliki cookie.

Również kasy socket.io. Robi świetną robotę wybierając najlepszy sposób na kometę w oparciu o możliwości przeglądarki.

Aby udostępniać dane między węzłem i szynami, można udostępniać pliki cookie, a następnie przechowywać dane sesji w bazie danych, do których obie aplikacje mogą się dostać. Bardziej zaangażowana architektura może wymagać użycia Redis do publikowania wiadomości między nimi. Lub możesz być w stanie uciec z przekazaniem wszystkiego, czego potrzebujesz w żądaniach http.

1

W HTTP żądania mogą pochodzić tylko od klienta. Tak więc najlepsze opcje są już wspomniane (polling i HTTP streaming).

Polling jest łatwiejszą do wdrożenia opcją; będzie jednak korzystać z dość szerokiej przepustowości. Dlatego powinieneś trzymać żądania i odpowiedzi tak małe, jak to możliwe, więc powinieneś zdecydowanie użyć XHR (Ajax) do tego.

Inną opcją jest przesyłanie strumieniowe HTTP (Comet); będzie wymagało więcej pracy przy konfiguracji, ale może się okazać, że jest to warte wysiłku. Możesz dać Realtime on Rails strzał. Aby uzyskać więcej informacji i wskazówek na temat jak zmniejszyć zużycie pasma, patrz:

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

+0

Witam i dziękuję za odpowiedź. Myślę, że strumieniowanie http (kometa) jest bardziej odpowiednie dla mojej aplikacji, ponieważ spodziewam się, że właściciele sklepów będą infrontować ich przeglądarki przez cały dzień, czekając na zamówienia. Może to stanowić poważne obciążenie dla serwera, jeśli użyję odpytywania. W jaki sposób mogę zintegrować serwery komet (takie jak node.js i Ajax Push Engine) z istniejącą aplikacją Ruby on Rails? Czy to oznacza, że ​​powinienem zapłacić za inną usługę hosta linuksowego (oprócz heroku), gdzie zostaną zainstalowane serwery komet? Co sądzisz? Dzięki! – Alex

0

Właściwie, jeśli masz storeowner uruchomić Chrome (inne przeglądarki będą wkrótce), można użyć WebSockets (tylko dla powiadomienie właściciela sklepu), co pozwala na stałe połączenie otwarte, i możesz wysyłać dane do przeglądarki bez przeglądarki żądającej czegokolwiek.

Istnieje kilka bibliotek websocket dla node.js, ale wierzę, że możesz to zrobić samodzielnie, używając zwykłego połączenia TCP.

Powiązane problemy