우리는 정확히 문제가 있었다 . 우리의 경우 우리는 생산자가 각 메시지를 정확하게 한 번 전송했는지 여부를 확신 할 수 없었습니다. 따라서 수신 된 각 레코드에 대해 MD5를 즉석에서 계산하고 영구 저장 장치의 형태로 표시되는지 여부를 확인했지만 실제로 사용할 저장 장치는 무엇입니까? 가장 까다로운 비트.
우선 우리는 사소한 관계형 데이터베이스를 시도했지만 키네시스를 거치는 데이터의 양이 상당히 중요했기 때문에 이것은 읽기가 무거웠지만 쓰기가 힘든 경우이므로 시스템 전체의 주요 병목 현상이되었습니다. .
고유 메시지마다 MD5를 저장하는 DynamoDB 테이블을 갖게되었습니다. 우리가 가진 이슈는 메시지를 지우는 것이 그렇게 쉽지 않았기 때문입니다. 우리 테이블에는 파티션과 정렬 키가 포함되어 있지만 DynamoDB는 주어진 파티션 키를 가진 모든 레코드를 삭제할 수 없지만, 키 값 정렬 (시간과 용량 낭비). 불행히도 우리는 테이블 전체를 한 번만 놓아야했습니다. 차선책은 메시지 식별자를 저장하는 DynamoDB 테이블을 정기적으로 회전시키는 것입니다.
그러나 최근 DynamoDB는 매우 편리한 기능 (Time To Live)을 도입했습니다. 즉, 레코드 당 자동 만료 기능을 활성화하여 테이블의 크기를 제어 할 수 있습니다. 이러한 의미에서 DynamoDB는 ElastiCache와 매우 유사하지만 ElastiCache (적어도 Memcached 클러스터)는 훨씬 덜 내구성이 있습니다. 이중화가 없으며 작동 또는 실패의 규모가 큰 경우 종료 된 노드에있는 모든 데이터가 손실됩니다.
안녕하세요 드미트리. 여기에 설명 된 JustGiving 인프라와 비슷한 것을 사용하여 여러 벤치 마크를 실행했습니다. https://aws.amazon.com/blogs/compute/serverless-cross-account-stream-replication-using-aws-lambda -amazon-dynamodb-and-amazon-kinesis-firehose/왜 DDB 테이블에 Shardid + SequenceNumber를 사용하는 대신 MD5 체크섬을 계산 했습니까? – Antonio
안녕하세요 @Antonio. 우리의 경우에는 제작자가 동일한 메시지를 게시 할 가능성이 있습니다 여러 번. 키네스는 어쨌든 여러 메시지를 다른 메시지로 간주합니다. (단순히 제작자가 2 번 이상 게시했기 때문입니다.) 모든 메시지가 고유해야한다는 것을 알았으므로 단순히 md5가 가진 메시지를 무시했습니다. 또한 md5는 생산자가 계산하여 cosumers에 대한 계산 시간을 절약 해주었습니다. (키네시스를 거치면서 상대적으로 많은 양의 데이터가 제공됨) –
그냥 던지기를 원했습니다 - AWS는 제작자는 오류 사례로 인해 동일한 기록을 자연스럽게 여러 번 생성 할 수 있으며, 일반적으로 여러 소비자가 동일한 기록을 가져올 수 있습니다. 지금 우리 시스템에서도이 문제를 다루고 있습니다. 우리는 elasticsearch를 사용합니다. 그리고 현재 계획은 같은 레코드가 동시에 업데이트되지 않도록하기 위해 버전 관리에 내장 된 탄성체를 사용하고 레코드 자체에 레코드에 적용된 최근 이벤트 목록을 기록하는 것입니다. – genexp