2016-10-27 3 views
1

"요청"상태를 유지하는 웹 서비스가 있습니다. 가능한 상태는 "활성"및 "비활성"입니다. 요청 정보를 Cassandra DB에 저장하고 있습니다. 두 테이블이 있습니다. 하나는 활성 요청 용이고 다른 하나는 비활성 요청 용입니다. 둘 다 동일한 스키마를가집니다.카산드라에서 삭제 작업을 수행 할 때 데이터베이스 항목 가져 오기

ActiveRequests{ 
    UserId text, 
    RequestId int, 
    RequestData text 
    PRIMARY KEY(UserId, RequestId) 
} 

나는 비활성 상태로 활성 상태에서 요청을 이동합니다 API를 구현해야 다음과 같이

내 스키마입니다. 필자는 Active 테이블에서 항목을 삭제 한 다음 제거 된 항목을 InActive 테이블에 추가하여이 작업을 수행 할 계획입니다.

Cassandra에서는 DELETE 작업이 실제로 삭제 된 데이터를 반환하지 않는 것처럼 보입니다. 따라서 요청 항목에 SELECT을 입력해야 (InActive 테이블에 추가하기위한 모든 요청 데이터를 얻을 수 있음) DELETE 작업을 수행해야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

편집

내가 별도의 테이블과 같은 활성 및 비활성 요청을 유지하고 왜 당신은 요청할 수 있습니다. 잠재적으로 이들을 하나의 테이블로 결합하고 IsActive 열을 가질 수 있습니다. 별도의 테이블을 유지 관리하려는 이유는 다음과 같습니다.

활성 테이블에 대한 내 쿼리를 매우 빠르게 작성하고 싶습니다. 최적이 아닌 활성 및 비활성 요청이 모두있는 테이블의 모든 활성 요청을 쿼리하려고합니다. partitionKey는 userId이며 InActive 테이블에 주어진 UserId에 대해 1000 개의 요청 ID가 있어야합니다. 하지만 Active에는 UserId 당 10 개 이상의 requestIds 만 있어야합니다.

+0

두 테이블이있는 이유는 무엇입니까? 단일 테이블을 사용하는 경우 이것은 CQL에서 간단한 플래그로 넘기는 문제가됩니다.하지만 재미있는 질문입니다. – Sreekar

+0

활성 테이블에 대한 내 쿼리가 매우 필요합니다. 만약 내가 최적이 아닌 Active 및 InActive 요청을 모두 가지고있는 테이블에서 모든 Active 요청을 쿼리하고자한다면.partitionKey는 userId이며 InActive 테이블에 주어진 UserId에 대해 1000 개의 요청 ID가 있어야합니다. 하지만 Active에는 UserId 당 10 개 이상의 requestIds 만 있어야합니다. – AndroidDev93

답변

2

DELETE이 반환하는 기본적인 대답은 실제로 카산드라가 할 수있는 것이 아니라는 것입니다. 카산드라의 삭제는 사실 삭제 표시입니다. 카산드라는 일반적으로 글을 쓰고 필요성을 느끼기 전에 읽지 않습니다. 실제로는 안티 패턴으로 간주됩니다.

또 다른 사실은 카산드라의 삭제가 해당 테이블의 GC 그레이스 설정 이후의 어느 시점까지 시스템을 떠나지 않는다는 것입니다.

이러한 요청은 언제나 기반으로합니까? 그들이 있다면 당신은 요청을 버킷 팅하는 것에 대해 생각할 수 있습니다.

Requests{ 
    UserId text, 
    TimeBucket text, 
    RequestId int, 
    RequestData text, 
    Active boolean, 
    PRIMARY KEY((UserId, TimeBucket) RequestId) 
} 

시간 버킷 시간 또는 이제까지 사용 사례에 대한 의미가 무엇 분당 수 : 그래서 당신은 같은 하나의 테이블에 뭔가있을 것입니다. 그런 다음 다른 선택 항목을 사용하여 지정된 버킷을 처리 할 수 ​​있습니다. 이렇게하면 주어진 파티션 키에 대해 너무 많은 요청을하지 않게됩니다. 시간 초과 버킷은 대부분의 활성 요청을 처리 할만큼 충분히 크므로 모든 버킷을 볼 필요가 없습니다.

오랜 기간 동안 보관해야하거나 오래도록 보관할 경우 기록을 보관할 계획이 확실하지 않습니다.이 버킷 팅은 지나치게 큰 파티션으로 끝나지 않도록합니다. InActive 테이블과 다른 설정.

관련 문제