Go에서의 singleflight: 부하 시 중복 작업... 노트

Go에서의 singleflight: 부하 시 중복 작업 통합

캐시 스탬피드는 캐시가 만료되고 많은 요청이 동시에 누락될 때 발생하며, 중복된 비용이 많이 드는 작업을 초래합니다. Go의 golang.org/x/sync/singleflight 패키지는 주어진 키에 대해 함수의 실행을 하나만 보장함으로써 이를 해결합니다. 동일한 키를 가진 동시 호출자는 대기하고 해당 단일 실행의 결과를 받게 됩니다. Do 메서드는 키와 함수를 받아 첫 번째 호출자에 대해서만 함수를 실행합니다. 후속 호출자는 함수가 완료될 때까지 차단된 후 결과를 공유합니다. shared 불리언은 결과가 여러 호출자에게 분배되었는지 여부를 나타내며, 메트릭에 유용합니다.Singleflight 자체는 캐시가 아니며, 시간적으로 겹치는 호출만 축소합니다. 일반적인 패턴은 캐시를 확인한 다음 누락 시 group.Do를 사용하고, 마지막으로 결과를 캐시에 다시 쓰는 것을 포함합니다. 중요한 주의 사항은 반환된 값이 공유되므로 포인터, 슬라이스, 맵과 같은 변경 가능한 유형은 여러 고루틴에서 수정할 경우 데이터 경합을 유발할 수 있다는 것입니다. 이를 피하려면 반환된 값을 불변으로 취급하거나 호출자가 독립적으로 소유하고 수정할 수 있는 복사본을 반환하십시오.비차단 동작의 경우 DoChan은 채널을 반환하여 호출자가 컨텍스트 취소를 처리할 수 있도록 합니다. 그러나 함수는 첫 번째 호출자의 컨텍스트에서 실행되므로 공유 작업의 경우 요청별 컨텍스트에서 작업을 분리하는 것이 좋습니다. Forget 메서드는 키를 지우는 데 사용할 수 있으며, 후속 호출이 새 실행을 시작할 수 있도록 하여 실패하는 작업의 폭발 반경을 제한하는 데 유용합니다. Singleflight는 캐시 로딩 또는 느린 업스트림 호출과 같이 중복 작업이 비용이 많이 드는 경계에 속하며 도메인 로직 내부에 있지 않습니다. 두 가지 주요 함정은 공유 값과 첫 번째 호출자의 컨텍스트입니다.
CdXz5zHNQW_EMU9QnIza4.webp