ehcache, memcached 및 기타 키-값 저장소에 대한 액세스를 동기화하는 방법은 무엇입니까?
-
07-07-2019 - |
문제
내 이해에 따르면 다음 각 방법은 다음과 같습니다. get()
그리고 put()
원자적이다.
그러나 ehcache 및 memcached와 같은 캐시에 액세스할 때 CheckThenAct
패션, 경쟁 조건이 발생합니다.
thread1이 다음을 수행하는지 확인하기 위해 무엇을 동기화해야 합니까? Get()
그리고 thread2는 Get()
그 다음에 Put()
, 그 첫 번째 Get()
에 의해 추가된 새로운 가치를 받게 됩니다. thread2
?
해결책
이러한 상황을 처리하는 방법은 여러 위치에서 쓰기를 캐시하지 않거나 다른 방식으로 액세스를 제어하는 것입니다.
이에 대한 간단한 해결책은 클라이언트에서 캐시에 쓰기를 수행하지 않는 것입니다.대신 값을 업데이트하려면 값을 업데이트하라는 요청을 실행합니다.해당 값이 다른 곳에서 검색되면 잘 작동할 수 있습니다.계산되었거나 클라이언트에서 나온 경우에는 더 문제가 될 수 있습니다.
적어도 PHP 세계에서는 Memcache와 함께 사용하는 일반적인 구성 요소는 분산 작업 대기열 프로세서인 beanstalkd입니다.이 시나리오에서는 작업 단위로 "업데이트 캐시" 요청을 실행할 수 있습니다.
기존 값을 입력으로 사용하는 캐시 항목에 대한 작업을 수행하거나 get-then-update가 원자적 작업이 아닌 경우 경쟁 조건을 도입하는 다른 방법은 작업 단위를 만드는 것입니다. 여기에는 이전 값과 새 값이 포함됩니다.이렇게 하면 업데이트를 처리하는 프로세스가 무엇이든 현재 값이 예상 값이 아닌 상황을 무효화하거나 처리할 수 있습니다.
증가 및 감소는 memcached 인터페이스에 의해 처리되므로 액세스가 해당 유형인 경우(또는 해당 종류의 작업으로 축소될 수 있는 경우) 문제도 해결됩니다.
다른 팁
MemCached의 경우 다른 작업이 데이터를 업데이트하지 않았는지 put ()를 수행하기 전에 CAS () 작업을 사용하여 확인할 수 있습니다.