PHP 편집자 Strawberry는 kubernetes 연산자를 개발하기 위해 golang 사용을 탐색할 때 "개체가 수정되었습니다"라는 일반적인 오류에 직면했습니다. 이 오류는 일반적으로 여러 고루틴이 동시에 동일한 객체를 수정하여 데이터 불일치 또는 경쟁 조건이 발생할 때 발생합니다. 이 기사에서는 개발자가 유사한 문제를 더 잘 이해하고 처리할 수 있도록 이 오류의 원인과 해결 방법을 살펴보겠습니다.
k8s 연산자에 "개체가 수정되었습니다" 오류가 나타납니다
으아악이 오류에 대해 많은 논의가 있습니다. 주된 대답은 "이 문제는 업데이트하려고 할 때 개체의 이전 버전이 있기 때문에 발생합니다."입니다. 하지만 몇 가지 질문이 있습니다. 내 교환원의 일부 시나리오에서는 단일 "좌표" 호출 중에 포드의 주석을 2번 업데이트해야 합니다. 물론 "개체가 수정되었습니다"라는 오류가 자주 발생합니다.
질문: 'r.Get()' 및 'r.Update()'가 개체를 가져오거나 업데이트하는 위치를 알고 싶습니다. 로컬 캐시 또는 API 서버에서?
1: 'r.Get()'은 '캐시'에서 개체를 가져오고 'r.Update()'는 개체를 캐시로 업데이트하는 것 같아요. 맞나요? 그렇다면 왜 이 오류가 발생합니까? 운영자 이외의 이유로 Pod 개체가 변경되면 현재 "조정" 중에 내 Pod 개체를 업데이트할 수 없나요? (캐시된 객체는 로컬이므로 이미 API 서버와 동기화되지 않았습니다.) 최신 객체를 얻기 위해 때때로 "재시도"하는 이유는 무엇입니까?
으아악2: 'r.Get()'이 API 서버에서 객체를 가져오는 것이고 'r.Update()'도 API 서버를 업데이트하는 것입니다. 객체 업데이트를 다시 시도해야 하는 이유는 무엇입니까?
Kubernetes 컨트롤러에서 r.Get() 및 r.Update()를 사용하는 경우 API 서버와의 상호 작용에는 로컬 캐시와 API 서버 자체가 모두 포함됩니다.
r.Get()
:
r.Get() 함수는 객체가 존재하는 경우 로컬 캐시에서 객체를 검색하고, 그렇지 않으면 API 서버에서 객체를 가져옵니다. 개체가 로컬 캐시에 있으면 즉시 반환됩니다. 그렇지 않은 경우 API 서버에 객체를 요청하고, 획득한 객체를 이후 사용을 위해 로컬 캐시에 저장합니다. r.업데이트():
r.Update()
함수는 로컬 캐시 및 API 서버의 개체를 업데이트합니다.
객체가 원래 검색된 이후 로컬 캐시에서 수정된 경우 API 서버에 대한 업데이트 작업이 "충돌" 오류와 함께 실패할 수 있습니다. 이는 캐시에 있는 개체의 버전이 API 서버의 버전과 일치하지 않을 때 발생합니다. 이는 다른 사람이 그 동안 개체를 수정했음을 나타냅니다.
이를 처리하는 전략이 있습니다 -
乐观并发控制(OCC):
- 이전 버전과 일치하도록 업데이트되었습니다. retry
-위 내용은 k8s 연산자에서 golang 오류 "개체가 수정되었습니다"의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!