Mieliśmy dokładnie ten problem przy budowie systemu telemetrii dla aplikacji mobilnej . W naszym przypadku nie byliśmy również pewni, że producenci wysyłają każdą wiadomość dokładnie raz, dlatego dla każdego otrzymanego rekordu obliczyliśmy jej MD5 w locie i sprawdziliśmy, czy jest on prezentowany w pewnej formie trwałego magazynu, ale w rzeczywistości to, którego najtrudniejszy kawałek.
Po pierwsze, próbowaliśmy trywialnej, relacyjnej bazy danych, ale szybko stała się ona poważnym wąskim gardłem całego systemu, ponieważ nie jest to tylko ciężki odczyt, ale także pisanie ciężkich przypadków, ponieważ ilość danych przechodzących przez Kinesis była dość znacząca. .
W końcu otrzymaliśmy tabelę DynamoDB przechowującą MD5 dla każdej unikalnej wiadomości. Problem polegał na tym, że nie było tak łatwo usunąć wiadomości - mimo że nasza tabela zawierała klucze partycji i sortowania, DynamoDB nie pozwala na opuszczenie wszystkich rekordów za pomocą danego klucza partycji, musieliśmy zapytać wszystkich, aby uzyskać sortuj kluczowe wartości (które tracą czas i pojemność). Niestety, musieliśmy po prostu odrzucić cały stół raz na jakiś czas. Innym sposobem na nieoptymalne rozwiązanie jest regularne obracanie tabel DynamoDB, które przechowują identyfikatory wiadomości.
Jednak niedawno DynamoDB wprowadził bardzo przydatną funkcję - Time To Live, co oznacza, że teraz możemy kontrolować wielkość tabeli, włączając automatyczne wygaśnięcie na podstawie każdego rekordu. W tym sensie DynamoDB wydaje się być dość podobny do ElastiCache, jednak ElastiCache (przynajmniej klaster Memcached) jest znacznie mniej trwały - nie ma tam nadmiarowości, a wszystkie dane rezydujące na zakończonych węzłach są tracone w przypadku działania wagi lub awarii.
Witam Dmitriju, pracowałem nad kilkoma benchmarkami używając czegoś podobnego do infrastruktury JustGiving, wyjaśnionej tutaj: https://aws.amazon.com/blogs/compute/serverless-cross-account-stream-replication-using-aws-lambda -amazon-dynamodb-and-amazon-kinesis-firehose /. Dlaczego obliczono sumę kontrolną MD5 zamiast Shardid + SequenceNumber dla tabeli DDB? – Antonio
Hi @Antonio W naszym przypadku możliwe było, że producent wysłałby tę samą wiadomość Gdyby tak było, to Kinesis i tak uważałaby je za inne wiadomości (po prostu dlatego, że były 2 lub więcej postów od producenta). Ponieważ wiedzieliśmy, że każda wiadomość musi być unikalna, po prostu zignorowaliśmy wiadomości, które md5 ma Md5 zostało również wyliczone przez producentów, oszczędzając trochę czasu obliczeniowego dla klientów (biorąc pod uwagę stosunkowo dużą ilość danych przechodzących przez Kinesis) –
Po prostu chciałem się tam wyrzucić - AWS zauważa, że różne producenci mogą naturalnie wytwarzać ten sam rekord wiele razy ze względu na błędy, a także, częściej, wielu konsumentów może ciągnąć ten sam zestaw rekordów. Mam teraz do czynienia z tym w naszym systemie. Korzystamy z elastycznego przeszukiwania, a na razie plan polega na zastosowaniu elastycznych elementów wbudowanych w wersjach, aby zapewnić, że ten sam rekord nie jest aktualizowany w tym samym czasie, a następnie zapamiętać listę ostatnich zdarzeń zastosowanych do rekordu samego rekordu. – genexp