5

Ví dụ:chiến lược/mô hình để ngăn chặn tình trạng cập nhật/chủng tộc bị mất trên GAE/memcache

  1. Process A - được phiên bản mới nhất của một tổ chức từ memcache
  2. Process B - được phiên bản mới nhất của một thực thể từ memcache
  3. Process A - làm cho một số bản cập nhật cho thực thể lấy ra trong (1) và sau đó puts trong db/memcache
  4. Process B - làm cho một số bản cập nhật cho thực thể lấy ra trong (2) và sau đó puts trong db/memcache

Cập nhật 3. bị mất.

Chiến lược/mẫu nào có thể được sử dụng để ngăn chặn điều này?

Trả lời

2

Bạn có thể muốn sử dụng casgets lệnh:

https://code.google.com/p/memcached/wiki/NewCommands#cas

EDIT GAE memcache là thực sự tương thích với memcached. Dưới đây là tài liệu tham khảo từ GAE:

https://developers.google.com/appengine/docs/python/memcache/clientclass#Client_cas

và lưu ý cuối cùng:

https://developers.google.com/appengine/docs/python/memcache/clientclass#Memcached_compatibility

+0

Điều này không liên quan đến memcach độc lập, không phải là meme của GAE? –

+0

@KallePokki Tôi đã cập nhật câu trả lời. – freakish

0

Bạn nên làm như cập nhật bên trong một giao dịch để làm cho nó nguyên tử.

https://developers.google.com/appengine/docs/python/ndb/transactions

+0

Chỉ cần đặt các ghi bên trong một giao dịch sẽ không cải thiện tình hình vì nó sẽ không dừng quá trình B từ ghi đè ghi của A. Để ngăn chặn bạn cần một số loại khóa mà A giữ, vì vậy B sẽ không/không thể viết, đó là nơi CAS trong memcache có thể giúp đỡ. –

+0

@TimHoffman Giao dịch Datastore bảo vệ bạn chính xác từ đó. Xem ví dụ ví dụ đơn giản https://developers.google.com/appengine/docs/python/datastore/transactions#Uses_for_Transactions. Ngoài ra, bằng cách sử dụng ndb không có lý do để rõ ràng cache các thực thể trong memcache, như ndb làm điều đó cho bạn. –

+0

Tất nhiên, nếu câu hỏi ban đầu là đặc biệt về memcache, so sánh và thiết lập là con đường để đi. Trong phản ứng của tôi, tôi đã phát hiện từ "db" từ câu hỏi và kho dữ liệu giả định cũng liên quan. –