2016-07-02 6 views
0

카산드라 데이터베이스에 HTML 페이지를 만드는 다소 복잡한 웹 응용 프로그램이 있습니다.카산드라 데이터베이스의 페이지 상태 변경이 항상 작동하지 않는 이유는 무엇입니까?

페이지를 만들 때 작업중인 사실을 반영하여 페이지에 상태를 저장합니다.

INSERT INTO content (key,     column1,   value) 
      VALUES ('http://domain/path', 'content:status', 0x0201); 

(열 이름은 ... 중고품 일에서 온)

상태가 0x0201 동안

, 더 otherp 프로세스는 페이지에 아무것도 할 수 없습니다. 은 잠겨져으로 표시됩니다.

페이지 작성이 완료되면 1ms 정도가 지나면 상태가 "정상"으로 전환됩니다. 이것은 content::status 필드의 또 다른 삽입입니다. 0x0201에서 0x0102

다음
INSERT INTO content (key,     column1,   value) 
      VALUES ('http://domain/path', 'content:status', 0x0102); 

상태로 변경됩니다. 단, 웹 사이트 초기화시 생성되는 약 700 페이지 중 22 ~ 30 개 (3 % ~ 4 %)의 상태는 변경되지 않습니다.

첫 번째 INSERT INTO 사이의 시간이 걸리고 두 번째 것이 너무 짧고 카산드라 클러스터가 혼란 스럽기 때문에 이러한 현상이 발생할 수 있습니까? (예를 들어 꽤 많은 것을 함께 도착한 것으로보고 그 중 하나를 선택하면 실패하는 몇 가지 경우에는 잘못된 것입니다.)

답변

0

C++ 드라이버를 사용할 때 , 두 개의 INSERT 명령이 두 개의 다른 파이프 라인으로 전송 될 수 있습니다. 이는 드라이버가 작업자 스레드를 처리하고 명령이 작업자 스레드 파이프 라인 중 하나에서 종료 될 수 있기 때문입니다.

이것은 CREATE와 나중 NORMAL을 보내더라도 스레드 파이프 라인이 NORMAL을 먼저 전송 한 다음 Cassandra로 CREATE (즉, 데이터를 처음 C++ 드라이버로 보낸 순서를 바꿀 수 있음)를 의미합니다. CREATE 상태가 표시됩니다 ...

이것은 직접 해결할 수 없습니다. 대신 작업이 끝나면 해당 페이지에서 작업하는 동안 잠금을 사용하고 다른 작업의 경우 상태를 NORMAL로 업데이트 한 다음 잠금을 해제 할 수 있습니다. 타임 아웃이있는 잠금 장치가 있다면 절대로 완전 교착 상태를 생성해서는 안됩니다 (즉, 한 페이지가 A 페이지를 처리 ​​한 다음 B 페이지를 처리하기 전에 A 페이지를 잠그지 않고 B 페이지를 먼저 처리하는 다른 프로세스 ...)

+0

이것은 서버의 시계 왜곡과 관련이 있습니다. 이 갱신 사항이 단일 클라이언트 인스턴스에서 오는 경우, 클라이언트 측 시간 소인의 사용을 고려하십시오. 예상 상태를 확인하기 위해 비교 및 ​​설정 (경량 트랜잭션) 조정을 고려할 수도 있습니다. –

+0

예. 실제로 나는 삽입물에'USING TIMESTAMP ms '를 추가하거나 드라이버에 발전기를 요청할 수 있음을 알았습니다. 기본적으로 주문이 보장되지 않는다는 사실을 실제로 변경하지는 않습니다 ... –

관련 문제