2012-06-28 13 views
8

Chcę utworzyć kolejkę, w której klienci mogą wysyłać żądania, a następnie wątki robocze serwera mogą je wyciągnąć, ponieważ mają dostępne zasoby.Jak utworzyć kolejkę z wieloma pracownikami?

Odkrywam, jak mogłem to zrobić w repozytorium Firebase, a nie w zewnętrznej usłudze kolejkowania, która musiałaby następnie wprowadzić dane z powrotem do Firebase.

z bezpieczeństwem i walidacji narzędzi w umyśle, oto prosty przykład tego, co mam na myśli:

  • użytkownik naciska prośbę do „kolejki” Bucket
  • serwery wyciągnąć wniosek i usuwa to (jak mogę zapewnić tylko jeden serwer otrzyma żądanie?)
  • serwer sprawdza poprawność danych i pobiera od prywatnego wiadra (lub wstrzykuje nowe dane)
  • serwer wypycha dane i/lub błędów z powrotem do wiadra użytkownika

enter image description here

Uproszczony przykład, gdzie może to być użyteczne byłoby uwierzytelniania:

  • użytkownik stawia żądanie uwierzytelnienia do kolejki publicznej
  • jego login/hasło idzie do swojego prywatnego wiadrze (miejsce, w którym tylko on może czytać/zapisywać)
  • serwer odbiera żądanie uwierzytelnienia, pobiera login/hasło i sprawdza przed prywatnym buc Ket tylko serwer może uzyskać dostęp
  • serwera popycha token do prywatnej wiadra użytkownika

(oczywiście nadal istnieją pewne luki bezpieczeństwa w kolejce publicznego; Ja tylko badanie w tym momencie)

niektórych innych przykładów do wykorzystania:

  • czytać tylko kolejka status (status użytkownika jest przekazywana za pośrednictwem prywatnej wiadra, serwer zapisu jest to do wiadra publicznego, który jest tylko do odczytu dla publiczności)
  • wiadomość kolejka (komunikaty są wysyłane przez użytkownika, które serwer zdecyduje wiadra dyskusyjne one zrzucane do)

więc pytania są:

  1. Czy to dobry projekt, który będzie dobrze integrował się z nadchodzącymi planami bezpieczeństwa? Jakie są alternatywne podejścia badane?
  2. W jaki sposób uzyskać wszystkie serwery do odsłuchania kolejki, ale tylko jeden do odebrania każdego żądania?

Odpowiedz

8

Wow, świetne pytanie. Jest to wzorzec użycia, który omówiliśmy wewnętrznie, dlatego chcielibyśmy usłyszeć o Twoim doświadczeniu w jego implementacji ([email protected]).Oto kilka myśli na pytania:

Authentication

Jeśli głównym celem jest faktycznie uwierzytelnianie, tylko czekać na naszych zabezpieczeń. :-) W szczególności zamierzamy mieć możliwość wykonywania auth z wykorzystaniem własnego serwera zaplecza, wspieranego przez sklep użytkownika bazy ogniowej lub wspieranego przez niezależnych dostawców (Facebook, twitter itp.).

równoważeniem obciążenia kolejki pracy

Niezależnie od auth, jest jeszcze ciekawy przypadek użycia za korzystanie Firebase jako trzon dla jakiegoś systemu równoważenia obciążenia jak opisujesz. W tym celu można zastosować kilka metod:

  1. Zgodnie z opisem należy mieć jedną kolejkę roboczą, z której wszystkie serwery będą oglądać i usuwać elementy. Możesz to zrobić, używając transaction(), aby usunąć przedmioty. Funkcja transaction() zajmuje się konfliktami, aby transakcja tylko jednego serwera zakończyła się powodzeniem. Jeśli jeden serwer przetnie drugi serwer do elementu pracy, drugi serwer może przerwać jego transakcję i spróbować ponownie na następnym elemencie w kolejce. To podejście jest miłe, ponieważ skaluje się automatycznie podczas dodawania i usuwania serwerów, ale na każdą próbę transakcji nakłada się dodatkowy koszt, ponieważ musi odbyć się w obie strony do serwerów bazy danych, aby upewnić się, że nikt już nie pobrał elementu z kolejki. Ale jeśli czas potrzebny na przetworzenie elementu pracy jest znacznie większy niż czas potrzebny na wykonanie obiegu do serwerów Firebase, to obciążenie to prawdopodobnie nie jest duże. Jeśli masz dużo serwerów (więcej kontrowersji) i/lub dużo drobnych elementów pracy, narzut może być zabójcą.
  2. Przeprowadź równoważenie obciążenia do klienta, wybierając je losowo spośród wielu kolejek roboczych. (np./kolejka/0,/queue/1,/queue/2,/queue/3, i niech klient losowo wybierze jeden). Następnie każdy serwer może monitorować jedną kolejkę roboczą i posiadać całe przetwarzanie. Ogólnie rzecz biorąc, będzie to miało najmniejszy narzut, ale nie skaluje się tak płynnie podczas dodawania/usuwania serwerów (prawdopodobnie będziesz musiał zachować osobną listę kolejek roboczych, które serwery aktualizują, gdy przejdą one do trybu online, a następnie mają klientów monitoruj listę, aby wiedzieć, ile kolejek jest do wyboru itp.).

Osobiście skłaniałbym się ku opcji nr 2, jeśli zależy nam na optymalnej wydajności. Ale # 1 może być łatwiejsze do prototypowania i przynajmniej w porządku.

Generalnie Twój projekt jest zdecydowanie na dobrej drodze. Jeśli eksperymentujesz z implementacją i napotykasz problemy lub masz sugestie dotyczące naszego API, daj nam znać ([email protected] :-)!

+0

@Michael_Lehenbauer dziękuję za wielką wyjaśnienia. Jestem podekscytowany słysząc o różnorodności opcji uwierzytelniania - brzmi świetnie. – Kato

+0

Idea losowych kolejek roboczych jest interesująca; Przypuszczam, że stwarza to pewne zagadnienie, jeśli serwery przejdą w tryb offline. Przypuszczam, że możemy usunąć kolejkę, jeśli serwer stanie się offline i zatrzyma klientów odpowiedzialnych za śledzenie ich żądań i delegowanie ich na nowy serwer. – Kato

+0

@ Kato Sprawdziłem bibliotekę kolejki firebase, ale nie jestem pewien, czy odpowiada ona na moje pytanie tutaj: http://stackoverflow.com/questions/41979438/are-there-any-solution-support-this-single-concurrency-distributed -queue. Czy myślisz o jakimkolwiek rozwiązaniu? – DucDigital

3

To pytanie jest dość stary, ale w przypadku, gdy ktoś robi to tutaj tak ...

Od połowy 2015 Firebase oferuje coś o nazwie Firebase Queue, a odporne na uszkodzenia wielu pracowników rurociągu pracy zbudowany na Firebase.

P: Czy to dobry projekt, który będzie dobrze integrował się z nadchodzącymi planami bezpieczeństwa?

A: Twoja sugestia dotycząca projektu doskonale pasuje do kolejki Firebase.

Pytanie: W jaki sposób uzyskać wszystkie serwery do odsłuchania kolejki, ale tylko jeden, aby odebrać każde żądanie?

A: Cóż, to właśnie kolejka Firebase Que robi dla Ciebie!

Referencje:

+2

Ironiczną częścią tego wszystkiego jest to, że kolejka firebase jest końcowym rezultatem kilku lat iteracji, które pomogłem innym zbudować, co było wynikiem oryginalnej odpowiedzi na moje własne pytanie. Widząc, że to publikujesz, czujesz się jak wchodzenie w jakiś kontinuum czasu. :) – Kato

Powiązane problemy