2012-01-27 20 views

Trả lời

7

Không có thao tác 'incrementAndGet' duy nhất trong API tiết kiệm Cassandra.

Bộ đếm trong Cassandra cuối cùng là nhất quán và không nguyên tử. Hoạt động ConsileencyLevel.ALL mong manh được yêu cầu để có được giá trị bộ đếm "được đảm bảo được cập nhật", tức là thực hiện đọc đồng nhất. ConsistencyLevel.QUORUM không đủ (như được quy định trong tài liệu thiết kế quầy: https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf).

Để thực hiện phương pháp incrementAndGet rằng trông phù hợp, bạn có thể muốn lúc đầu đọc giá trị truy cập, sau đó phát hành increment đột biến, và trở lại (đọc giá trị + inc). Ví dụ, nếu giá trị bộ đếm trước đó là từ 10 đến 20 (trên các bản sao khác nhau), và thêm 50 cho nó, giá trị đọc trước khi tăng sẽ trả về 60 hoặc 70. Và đọc-sau-tăng có thể vẫn trả về 10. hoặc 20.

+0

Cách tiếp cận rất thú vị, cảm ơn! – tom

+0

cách này sẽ giải quyết vấn đề của quầy không phải là nguyên tử. Ví dụ: nếu tôi thực hiện một thao tác khác (tăng và đọc), thì có thể tôi vẫn sẽ nhận được giá trị cũ: gọi 1: lượt truy cập val: 1 đọc (được 1), tăng thêm 1 (cuộc gọi đã phát hành), trả lại 2 cuộc gọi 2: (cuộc gọi gia tăng cuối cùng chưa được truyền qua tất cả các nút) đọc (được 1), tăng thêm 1 (gọi được phát hành), trả về 2 –

+0

@AlastorMoody: Như tôi đã nói, phương pháp này cho phép để thực hiện các quầy * trông * nhất quán. Kể từ khi quầy cassandra cuối cùng là phù hợp của thiên nhiên, nó chỉ có thể làm cho quầy nguyên tử ở mức giá tác động hiệu suất đáng kể (tức là với ổ khóa phân phối). Nếu bạn thực sự cần các bộ đếm nguyên tử - có rất nhiều công cụ ngoài Cassandra (như Redis) – Wildfire

0

Cách duy nhất để làm điều đó là truy vấn cho nó. Không có chức năng tăng-sau-đọc có sẵn trong Cassandra.

Các vấn đề liên quan