16

Mam aplikację usługową korzystającą z usługi Amazon SQS z wieloma kolejkami i wieloma klientami. Robię to, aby móc zaimplementować architekturę opartą na zdarzeniach i oddzielić wszystkie usługi, w których różne usługi reagują na zmiany w stanie innych systemów. Na przykład:Używanie usługi Amazon SQS z wieloma klientami

  • usługi rejestracji:
    • emituje przypadku, gdy nowy użytkownik "Rejestracja rejestrów nowy.
  • Użytkownik Serwisu:
    • Emituje wydarzenie 'user-updated', gdy użytkownik jest aktualizowana.
  • Szukaj usługi:
    • odczytuje z kolejki 'registration-nowy' i indeksy użytkownik w poszukiwaniu.
    • Odczytuje z kolejki "zaktualizowanej przez użytkownika" i aktualizuje użytkownika w wyszukiwaniu.
  • Metrics usługi:
    • odczytuje z kolejki 'nowy' rejestracyjnym i wysyła do Mixpanel.
    • Odczytuje z kolejki "zaktualizowanej przez użytkownika" i wysyła do Mixpanel.

Mam szereg zagadnień:

  • Wiadomość może zostać odebrane wiele razy, gdy robi odpytywanie. Potrafię zaprojektować wiele systemów, aby były idempotentne, ale w przypadku niektórych usług (takich jak usługa metryk) byłoby znacznie trudniej.
  • Wiadomość musi zostać ręcznie usunięta z kolejki w SQS. Myślałem o wdrożeniu "usługi obsługi komunikatów", która zajmuje się usuwaniem komunikatów, gdy wszystkie usługi je otrzymały (każda usługa wyemitowała zdarzenie "potwierdzone komunikatem" po obsłudze wiadomości).

Domyślam się, że moje pytanie jest następujące: jakie wzorce należy użyć, aby zapewnić, że mogę mieć wielu klientów dla pojedynczej kolejki w SQS, jednocześnie zapewniając, że wiadomości są również dostarczane niezawodnie i usuwane. Dziękuję za pomoc.

Odpowiedz

22

Myślę, że robisz to źle.

Wygląda na to, że używasz tej samej kolejki do robienia wielu różnych rzeczy. Lepiej używać pojedynczej kolejki do jednego celu.

Zamiast umieszczać zdarzenie w kolejce "rejestracja-nowa", a następnie mając dwie różne usługi odpytować tę kolejkę, i ZARÓWNO potrzebować, aby przeczytać tę wiadomość i obie robią z nią coś innego (a następnie potrzebując trzeciego procesu, który jest ma usunąć tę wiadomość po tym, jak pozostałe 2 ją przetworzyły).

Jedna kolejka powinna być używana do jednego celu.

  • Utwórz kolejkę „index-user-search” i „wyślij” mixpanels kolejce, więc usługa wyszukiwania odczytuje z kolejki wyszukiwania indeksuje użytkowników i natychmiast usuwa wiadomość.

  • Usługa mixpanel odczytuje z kolejki paneli miksowania, przetwarza komunikat i kasuje komunikat.

Usługa rejestracji, zamiast emulować "nową rejestrację" w pojedynczej kolejce, emituje teraz do dwóch kolejek.

Aby zrobić to o jeden krok lepiej, dodaj SNS do miksu i poproś usługę rejestracji o wysłanie komunikatu SNS do tematu "nowa rejestracja" (bez kolejki), a następnie zapisz obie kole, które wymieniłem powyżej, do tego tematu w schemacie "fan-out".

https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

Obie kolejki otrzyma wiadomość, ale tylko załadować je do SNS raz - jeśli w dół drogi 3rd niezwiązane usługa musi również proces zdarzenia „Rejestracja nowa” można utworzyć kolejną kolejkę i subskrybowania do tematu - może działać bez zależności i wiedzy o tym, co robią inne usługi - oto cel.

+0

To jest idealne. Nie wiedziałem, że możesz to zrobić z SNS! Dziękuję Ci! – user2205763