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