2013-02-11 12 views
6

Mam N dynos dla aplikacji Rails i chciałbym uruchomić polecenie na nich wszystkich. Czy jest jakiś sposób na zrobienie tego? Czy na wszystkich urządzeniach dynama zostanie wykonany kod rails r "SomeRubyCode"?Czy istnieje sposób uruchamiania polecenia na wszystkich dynamach Heroku?

Używam wtyczki, która synchronizuje się z trzecią stroną co M minut. Problem polega na tym, że czasami usługi serwisowe stron trzecich nie działają, a ja chciałbym uruchomić go ponownie bez czekania na kolejne M minut.

+1

Opis twojego przypadku użycia byłby tutaj najbardziej przydatny. – hgmnz

+0

Używam wtyczki, która synchronizuje się z trzecią stroną co N minut. Problem polega czasem na tym, że czasy usługi stron trzecich są niedostępne i chciałbym je uruchomić ponownie, bez konieczności czekania na kolejne N minut. – Geo

+1

Co powiesz na używanie, powiedzmy, Redis jako pamięci dzielonej/rozproszonej (na poziomie aplikacji, a nie na poziomie wtyczki)? Mieć zaplanowane rake "wymusić" wtyczkę, aby zsynchronizować i zapisać wyniki w pamięci podręcznej, a resztę aplikacji pobrać z pamięci podręcznej. Jeśli synchronizacja się nie powiedzie, możesz uruchomić zadanie rake ręcznie, nie martwiąc się o to, na którym dynie jest ono uruchomione. –

Odpowiedz

4

(zadawane włączyć mój komentarz do odpowiedzi ... będzie wykorzystać tę okazję do objaśniać.)

nie wiem o szczegółach, co twój plugin musi zrobić, aby synchronizację Do Usługa zewnętrzna, ale mam zamiar kontynuować założenie, że wtyczka w zasadzie pobiera niektóre przejściowe dane, które aplikacja internetowa wykorzystuje w jakiś sposób.

Ponieważ proces synchronizacji lub pobierania czasami kończy się niepowodzeniem, a aplikacja internetowa korzysta z aktualnych danych, należy ręcznie uruchomić proces "synchronizacji". Obecnie jest to jedyny sposób na zrobienie tego z samej wtyczki, co oznacza, że ​​musisz uruchomić kod na wszystkich dynach, które, jak wskazali inni, nie są obecnie możliwe.

Co robiłem w poprzedniej, podobny scenariusz (pobieranie z usługą Analytics zewnętrznego) jest prosta:

  1. Rezerwa i skonfigurować aplikację Heroku z Redis
  2. Napisz zadanie nachylenia, który po prostu wykonuje kod (który w przeciwnym razie byłby uruchamiany przez wtyczkę) w celu pobrania danych, a następnie zapisania tych danych do pamięci podręcznej
  3. Gdzie zwykle pobierasz dane w aplikacji, najpierw spróbuj pobrać z pamięci podręcznej (i na chybionym pamięci podręcznej, po prostu uruchom ponownie ten sam kod - oznacza to, że dane wygasły z pamięci podręcznej przed odświeżeniem)

Poszedłem dalej i używane Heroku prosty scheduler wykonać wspomniany zadaniem Rake co n minut próbować zachować dane świeżo aktualizowana i zawsze w pamięci podręcznej (cache wygaśnięcia ustalono na nieco mniej niż n minut) i zmniejszyć liczbę zauważalnych opóźnień podczas pobierania danych. Mogłem ustawić datę ważności pamięci podręcznej na nigdy lub większą niż n, ale nie było to krytyczne.

ten sposób, gdybym nie chcą, aby były wyświetlane najnowsze analityka, wszystko, co musiałem zrobić, to albo a) podłączyć do Redis i usunąć element z pamięci podręcznej, lub (łatwiej), b) tylko heroku run rake task .

Znowu - działa to głównie wtedy, gdy pobierasz dane, które muszą być udostępniane wszystkim dynamom.

To oczywiście nie działa w drugą stronę. Na przykład, jeśli masz scentralizowaną usługę, którą chcesz okresowo przesyłać dane (np. Czas spędzony na żądanie) na podstawie za dyno. Nie można wymyślić łatwego, eleganckiego sposobu na to, używając Heroku (innego niż w czasie rzeczywistym, ze wszystkimi związanymi z tym kosztami).

Powiązane problemy