Mam przypadek użycia, w którym nadchodzi strumień danych i nie mogę ich konsumować w tym samym tempie i potrzebuję bufora. Można to rozwiązać za pomocą kolejki SNS-SQS. Dowiedziałem się, że Kinesis ma ten sam cel, więc jaka jest różnica? Dlaczego powinienem (lub nie powinienem) preferować kinezę?
164
Pamiętaj, że ta odpowiedź była poprawna dla czerwca 2015 r
Po dłuższym przestudiowaniu problemu, mając na uwadze to samo pytanie, stwierdziłem, że SQS (z SNS) jest preferowany w większości przypadków użycia, chyba że kolejność komunikatów jest dla Ciebie ważna (SQS nie gwarantuje FIFO w wiadomościach).
Kinesis ma dwie główne zalety:
Obie zalety można osiągnąć, używając SNS jako wachlarza do SQS. Oznacza to, że producent wiadomości wysyła tylko jedną wiadomość do SNS, a następnie SNS rozsyła wiadomość do wielu SQS, po jednym dla każdej aplikacji konsumenckiej. W ten sposób możesz mieć tylu konsumentów, ilu chcesz, bez myślenia o shardingu.
Co więcej, dodaliśmy jeszcze jeden SQS, który jest subskrybowany do SNS, który będzie przechowywać wiadomości przez 14 dni. W normalnym przypadku nikt nie czyta z tego SQS, ale w przypadku błędu, który powoduje, że chcemy przewinąć dane, możemy łatwo odczytać wszystkie wiadomości z tego SQS i ponownie wysłać je do SNS. Podczas gdy Kinesis zapewnia tylko 7 dni retencji.
Podsumowując, SNS + SQS jest znacznie łatwiejsze i zapewnia większość możliwości. IMO potrzebujesz naprawdę mocnego etui, aby wybrać Kinesis zamiast niego.
źródło
split
wSNS split the message to multiple SQSs
ponieważ nie rozbić wiadomości w kawałkach, ale kopiuje go do wielu miejsc docelowych.Kinesis obsługuje funkcje wielu konsumentów, co oznacza, że te same rekordy danych mogą być przetwarzane w tym samym lub różnym czasie w ciągu 24 godzin u różnych konsumentów, podobne zachowanie w SQS można osiągnąć, zapisując w wielu kolejkach, a konsumenci mogą czytać z wielu kolejek. Jednak ponowne zapisywanie w wielu kolejkach spowoduje wydłużenie czasu oczekiwania o mniej niż kilka sekund {kilka milisekund} w systemie.
Po drugie, Kinesis zapewnia możliwość routingu w celu wybiórczego kierowania rekordów danych do różnych fragmentów przy użyciu klucza partycji, który może być przetwarzany przez poszczególne instancje EC2 i może umożliwić obliczenia mikro partii {Liczenie i agregacja}.
Praca na dowolnym oprogramowaniu AWS jest łatwa, ale z SQS jest najłatwiejsza. W przypadku Kinesis istnieje potrzeba dostarczenia wystarczającej liczby shardów z wyprzedzeniem, dynamicznie zwiększając liczbę shardów, aby zarządzać obciążeniem skokowym i zmniejszać, aby zaoszczędzić koszty również wymagane do zarządzania. to ból w kinezie, żadne takie rzeczy nie są wymagane w przypadku SQS. SQS jest nieskończenie skalowalne.
źródło
Semantyka tych technologii jest inna, ponieważ zostały zaprojektowane do obsługi różnych scenariuszy:
Rozumiemy różnicę na przykładzie.
Gdy przetwarzanie jednego elementu nie może być oddzielone od przetwarzania innego, musimy mieć semantykę Kinesis, aby bezpiecznie obsłużyć wszystkie przypadki.
źródło
Fragment dokumentacji AWS :
źródło
Największą zaletą dla mnie jest to, że Kinesis to kolejka do wielokrotnego odtwarzania, a SQS nie. Możesz więc mieć wielu odbiorców tych samych wiadomości Kinesis (lub tego samego konsumenta w różnym czasie), podczas gdy SQS, gdy wiadomość zostanie potwierdzona, zniknie z tej kolejki. Z tego powodu SQS jest lepszy w przypadku kolejek roboczych.
źródło
Inna sprawa: kineza może wyzwolić Lambdę, podczas gdy SQS nie. Więc w przypadku SQS musisz albo dostarczyć instancję EC2 do przetwarzania wiadomości SQS (i radzić sobie z nią, jeśli się nie powiedzie), albo musisz mieć zaplanowaną Lambdę (która nie skaluje się w górę ani w dół - dostajesz tylko jedną na minutę) .Edycja: ta odpowiedź nie jest już poprawna. SQS może bezpośrednio wyzwalać Lambdę od czerwca 2018 r
https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
źródło
Modele cenowe są różne, więc w zależności od przypadku użycia jeden lub drugi może być tańszy. W najprostszym przypadku (bez SNS):
Podłączając aktualne ceny i nie biorąc pod uwagę poziomu darmowego, wysyłając 1 GB wiadomości dziennie przy maksymalnym rozmiarze wiadomości, Kinesis będzie kosztować znacznie więcej niż SQS (10,82 USD / miesiąc dla Kinesis vs. 0,20 USD / miesiąc dla SQS) . Ale jeśli wysyłasz 1 TB dziennie, Kinesis jest nieco tańsza (158 USD / miesiąc w porównaniu do 201 USD / miesiąc w przypadku SQS).
Szczegóły: SQS pobiera 0,40 USD za milion żądań (64 KB każde), więc 0,00655 USD za GB. Przy 1 GB dziennie to nieco poniżej 0,20 USD miesięcznie; przy 1 TB dziennie dochodzi do nieco ponad 201 USD miesięcznie.
Kinesis pobiera 0,014 USD za milion żądań (po 25 KB), czyli 0,00059 USD za GB. Przy 1 GB dziennie to mniej niż 0,02 USD miesięcznie; przy 1 TB dziennie to około 18 USD miesięcznie. Jednak Kinesis pobiera również 0,015 USD za godzinę fragmentu. Potrzebujesz co najmniej 1 fragmentu na 1 MB na sekundę. Przy 1 GB dziennie 1 fragment będzie wystarczający, co oznacza dodatkowe 0,36 USD dziennie, co daje łączny koszt 10,82 USD miesięcznie. Przy 1 TB dziennie będziesz potrzebować co najmniej 13 fragmentów, co oznacza dodatkowe 4,68 USD dziennie, co daje łączny koszt 158 USD miesięcznie.
źródło
Kinesis rozwiązuje problem części mapy w typowym scenariuszu redukcji mapy dla danych przesyłanych strumieniowo. Chociaż SQS nie zapewnia tego. Jeśli masz dane strumieniowe, które muszą być zagregowane na kluczu, kineza zapewnia, że wszystkie dane dla tego klucza trafiają do określonego fragmentu, a fragment może zostać zużyty na jednym hoście, co ułatwia agregację klucza w porównaniu z SQS
źródło
Dodam jeszcze jedną rzecz, o której nikt inny nie wspomniał - SQS jest o kilka rzędów wielkości droższy.
źródło
Przypadki użycia kinazy
Przypadki użycia SQS
źródło