How to choose between cache-aside, read-through, write-through, client-side, and distributed caching strategies 최근에 언급한 것처럼 포스트, 우리는 Pekka Enberg가 글을 쓰기로 결정한 것을 기쁘게 생각합니다. 그리고 우리는 그것에서 3 장을 후원하는 것을 자랑스럽게 생각합니다. 왜 데이터를 암호화합니까? Latency에 관한 책 전체 Get the Latency book excerpt PDF에 대한 리뷰 보기 Get the Latency book excerpt PDF에 대한 리뷰 보기 Get the Latency book excerpt PDF에 대한 리뷰 보기 또한, Pekka는 단지 그 책에서 핵심 촬영을 공유했습니다. (지금 요청에 따라 사용할 수 있습니다) Low Latency Apps를 구축하는 방법 계속해서 우리의 책은 Pekka의 캐시 장에서 더 많은 추출물이 있습니다.이 책은 출판사의 허락을 받아 여기에 다시 인쇄됩니다. 라틴어 * 응용 프로그램에 캐시를 추가할 때 먼저 캐시 전략을 고려해야 하며, 이는 캐시와 데이터베이스 또는 서비스와 같은 기본 백업 저장소에서 어떻게 읽고 쓰는지를 결정합니다.When adding caching to your application, you must first consider your caching strategy, which determines how reads and writes happen from the cache and the underlying backing store, such as a database or a service. 다른 말로하면, 응용 프로그램이 캐시에서 값을 검색하지만 값이 존재하지 않거나 만료되었을 때, 캐시 전략은 응용 프로그램이 귀하의 응용 프로그램인지 백업 스토어에서 값을 검색하는 캐시인지 여부를 명령합니다. Cache-Aside Caching 부근의 호텔 캐시 사이드 캐시는 아마도 가장 일반적인 캐시 전략입니다.캐시 히트가있을 때 데이터 액세스 지연은 통신 지연에 의해 지배되며, 이는 일반적으로 작은 것이므로 캐시 서버 또는 심지어 응용 프로그램 메모리 공간에 가까운 캐시를 얻을 수 있습니다. 그러나, 캐시 미스가 있을 때, 캐시 사이드 캐시와 함께, 캐시는 응용 프로그램에 의해 업데이트 된 수동 저장소입니다.즉, 캐시는 단지 미스를 보고하고 응용 프로그램은 백업 저장소에서 데이터를 수집하고 캐시를 업데이트하는 책임이 있습니다. 그림 1은 액션에 있는 캐시 사이드 캐시의 예를 보여줍니다.An application looks up a value from a cache by a caching key, which determines the data the application is interested in. 키가 캐시에 존재한다면, 캐시는 응용 프로그램이 사용할 수 있는 키와 관련된 값을 반환합니다.그러나 키가 존재하지 않거나 캐시에서 만료되면, 응용 프로그램이 처리해야 하는 캐시 미스가 있습니다. 사용자 정보를 캐시하고 검색 키로 사용자 ID를 사용한다고 가정해 보십시오.이 경우 응용 프로그램이 사용자 ID에 의해 사용자 정보를 데이터베이스에서 읽기 위해 쿼리를 수행합니다.데이터베이스에서 반환된 사용자 정보는 그런 다음 캐시에 저장할 수 있는 형식으로 변환됩니다.그런 다음 캐시는 캐시 키로 사용자 ID와 가치로 정보를 업데이트합니다.예를 들어,이 유형의 캐시를 수행하는 일반적인 방법은 데이터베이스에서 반환된 사용자 정보를 JSON로 변환하고 캐시에 저장하는 것입니다. Redis와 같은 캐시 서버를 쉽게 설정하고 데이터베이스 쿼리와 서비스 응답을 캐시하는 데 사용하기 때문에 캐시 옆 캐시가 인기가 있습니다.캐시 옆 캐시와 함께 캐시 서버는 수동적이며 어떤 데이터베이스를 사용하는지 또는 결과가 어떻게 캐시로 매핑되는지 알 필요가 없습니다.캐시 관리 및 데이터 변환을 수행하는 것은 귀하의 응용 프로그램입니다. 많은 경우에, 캐시 사이드 캐시는 응용 프로그램 지연 시간을 줄이는 간단하고 효과적인 방법입니다.You can hide database access latency by having the most relevant information in a cache server near your application. 그러나 데이터 일관성 또는 신선도 요구 사항이 있는 경우에는 캐시 측면 캐시도 문제가 될 수 있습니다.예를 들어, 캐시에서 키를 검색하는 여러 동시에 읽는 리더가 있다면 응용 프로그램에서 동시에 캐시 실패를 처리하는 방법을 조정해야 합니다.For example, if you have multiple simultaneous readers that are looking up a key in the cache, you need to coordinate in your application how you handle simultaneous cache misses; otherwise, you may end up with multiple database accesses and cache updates, which may result in subsequent cache searchups returning different values. 그러나 캐시 사이드 캐시로 인해 캐시와 데이터베이스가 서로를 알지 못하기 때문에 거래 지원을 잃을 수 있으며 응용 프로그램의 책임은 데이터에 대한 업데이트를 조정하는 것입니다. 마지막으로, 캐시 사이드 캐시는 일부 캐시 검색이 캐시 미리 데이터베이스를 읽는 지연을 경험하기 때문에 상당한 꼬리 지연이있을 수 있습니다. 즉, 캐시 히트의 경우 액세스 지연이 빠르기 때문에 가까운 캐시 서버에서 오기 때문에; 캐시 미리 경험하는 캐시 검색은 캐시 미리 경험하는 데이터베이스 액세스만큼 빠릅니다. Read-Through Caching 부근의 호텔 Read-through caching은 캐시 옆에 있는 캐시와는 달리 캐시가 캐시 틈이 있을 때 활성 구성 요소가 되는 전략입니다.Cache 틈이 있을 때, 캐시 틈이 있는 캐시는 백업 스토어에서 키에 대한 값을 자동으로 읽으려고 시도합니다.Latency는 캐시 옆에 있는 캐시와 비슷하지만, 백업 스토어의 검색 지연은 애플리케이션에서 백업 스토어로가 아니라 백업 스토어로의 캐시에서 비롯되며, 이는 배포 아키텍처에 따라 더 작을 수 있습니다. 그림 2은 액션에서 읽기 캐시의 예를 보여줍니다. 응용 프로그램은 키에 캐시 검색을 수행하고, 캐시가 캐시 미스가 있는 경우, 캐시는 키에 대한 값을 얻기 위해 데이터베이스에 캐시를 수행합니다. 캐시는 그 다음 자체를 업데이트하고 응용 프로그램에 값을 반환합니다. 응용 프로그램 관점에서 캐시 미스가 투명하기 때문에 캐시는 항상 키를 반환합니다. 읽기 캐시는 백업 스토어를 읽을 수 있어야 하기 때문에 구현하는 것이 더 복잡하지만, 또한 데이터베이스 결과를 캐시 용 형식으로 변환해야 합니다. 예를 들어 백업 스토어가 SQL 데이터베이스 서버인 경우, 쿼리 결과를 JSON 또는 유사한 형식으로 변환하여 결과를 캐시에 저장해야 합니다. 그러나 캐시가 업데이트를 조정하고 데이터베이스가 읽기 캐시로 읽기 때문에 응용 프로그램에 거래 보증을 제공하고 동시 캐시 실패에 대한 일관성을 보장할 수 있습니다.In addition, although a read-through cache is more complex from an application integration point of view, it does remove cache management complexity from the application. 물론, 꼬리 지연의 동일한 경고는 캐시 사이드 캐시에 적용됩니다. 예외: 활성 구성 요소로서, 캐시 사이드 캐시는 예를 들어, 갱신 전후 캐시로 지연을 더 잘 숨길 수 있습니다. 여기서, 캐시는 값이 만료되기 전에 캐시를 비동기적으로 업데이트합니다. Caching를 통해 작성하기 캐시 사이드 및 읽기 사이드 캐시는 캐시 사이드 캐시에 관한 전략이지만 때로는 캐시가 쓰기를 지원하기를 원합니다. 그러한 경우 캐시는 응용 프로그램이 호출 할 수있는 키의 값을 업데이트하는 인터페이스를 제공합니다. 캐시 사이드 캐시의 경우 응용 프로그램은 백업 스토어와 통신하고 따라서 캐시를 업데이트하는 유일한 응용 프로그램입니다. 그러나 읽기 사이드 캐시와 함께 쓰기를 다루는 두 가지 옵션이 있습니다. 캐시 업데이트가 백업 스토어에 즉시 전파되는 전략입니다. 캐시가 업데이트 될 때마다 캐시가 캐시 값으로 백업 스토어를 동기화적으로 업데이트합니다. 캐시의 쓰기 연속은 백업 스토어에 쓰기 연속에 의해 지배되며, 이는 상당할 수 있습니다. 그림 3에서 보여주는 바와 같이 응용 프로그램은 캐시가 제공하는 인터페이스를 사용하여 키와 값 쌍을 사용하여 캐시를 업데이트합니다. 캐시는 새 값으로 상태를 업데이트하고 데이터베이스를 새 값으로 업데이트하고 응용 프로그램에 캐시 업데이트를 인정할 때까지 데이터베이스가 업데이트를 맡을 때까지 기다립니다. 그러나 비트랜잭션 캐시의 경우 캐시와 백업 스토어는 오류가 있으면 동기화되지 않을 수 있습니다. 예를 들어, 캐시에 쓰는 것이 성공하지만 백업 스토어에 쓰는 것이 실패하면 두 가지가 동기화되지 않을 것입니다. 읽기 캐시와 마찬가지로 글쓰기 캐시는 캐시가 데이터베이스에 연결하여 캐시 값을 데이터베이스 쿼리로 변환할 수 있다고 가정합니다.For example, if you are caching user data where the user ID serves as the key and a JSON document represents the value, the cache must be able to transform the JSON representation of user information into a database update. 글쓰기 캐시와 함께, 가장 간단한 해결책은 종종 데이터베이스에 JSON을 저장하는 것입니다. 글쓰기 캐시의 주요 단점은 캐시 업데이트와 관련된 지연입니다.This can be significant. Caching 뒤에 쓰기 다른 말로하면, 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 뒤에 텍스트 백업 스토어가 비동기적으로 업데이트되기 때문에 쓰기 뒤에 있는 캐시의 쓰기 지연률은 쓰기 뒤에 있는 캐시보다 낮습니다. 즉, 캐시가 응용 프로그램에 즉시 쓰기를 인식하여 낮은 지연 기간을 기록한 다음 백업 스토어 업데이트를 배경에 실행할 수 있습니다. 그러나, 쓰기 뒤에 있는 캐시의 단점은 캐시가 더 이상 캐시와 데이터베이스가 동기화되는 것을 보장할 수 없기 때문에 거래 지원을 잃는다는 것입니다. 클라이언트 사이드 Caching 클라이언트 측의 캐시 전략은 응용 프로그램 내의 클라이언트 레이어에 캐시를 갖는 것을 의미합니다.While cache servers such as Redis use in-memory caching, the application must communicate over the network to access the cache via the Redis protocol. 응용 프로그램이 데이터 센터에서 실행되는 서비스라면, 캐시 서버는 데이터 센터 내에서 네트워크 회전이 빠르고 캐시 복잡성은 캐시 자체에 있기 때문에 캐시하기에 훌륭합니다.그러나 마지막 마일의 지연은 여전히 장치에서 사용자 경험에 중요한 요소가 될 수 있습니다.이 때문에 클라이언트 측의 캐시가 그렇게 수익성이 있습니다.캐시 서버를 사용하는 대신에 응용 프로그램에 캐시가 있습니다. 클라이언트 측의 캐시와 함께 읽기와 쓰기 뒤의 캐시의 조합은 읽기와 쓰기 모두 빠르기 때문에 지연 관점에서 최적입니다.물론 클라이언트는 일반적으로 데이터베이스에 직접 연결할 수 없지만 대신 프록시 또는 API 서버를 통해 데이터베이스에 간접적으로 액세스합니다.Client 측의 캐시는 데이터베이스 액세스 간접 레이어와 지연 때문에 거래를 보장하기가 어렵습니다. 낮은 지연 시간의 클라이언트 측 캐시를 필요로 하는 많은 응용 프로그램의 경우 로컬-first 복제 접근법이 더 실용적일 수 있습니다.그러나 간단한 읽기 캐시의 경우 클라이언트 측 캐시가 낮은 지연 시간을 달성하기 위한 좋은 솔루션이 될 수 있습니다.물론 클라이언트 측 캐시도 보상이 있습니다: 캐시 공간이 필요하기 때문에 응용 프로그램의 메모리 소비를 증가시킬 수 있습니다. 분산된 Caching 예를 들어, 응용 프로그램 내의 캐시 또는 단일 Redis 서버를 사용하여 PostgreSQL 데이터베이스에서 쿼리를 캐시합니다. 이러한 분산 캐시와 함께, 당신은 독립적으로 또는 캐시 클러스터에서 작동하는 캐시의 수많은 인스턴스를 가지고 있습니다. 분산 캐시와 함께, 당신은 복제에 관한 4 장 및 파티션에 관한 5 장에서 논의 된 것과 같은 많은 합병증과 고려 사항을 가지고 있습니다. 분산 캐시와 함께, 당신은 모든 인스턴스에 모든 캐시 데이터를 맞추고 싶지 않지만 대신에 노드 사이에 분할된 캐시 데이터를 가지고 있습니다. 마찬가지로, 당신은 높은 가용성과 감소 된 액세스 지연을 위해 여러 인스턴스에 파티션을 복제 할 수 있습니다. 전반적으로 분산된 캐싱은 캐싱, 파티션 및 복제의 이점과 문제의 교차점이므로 그와 함께 할 경우 조심하십시오. * 계속 읽기 위해서, ScyllaDB 또는 . Download the 3chapter Latency Excerpt 무료 다운로드 Manning의 완전한 책을 구입하세요 Cynthia Dunlop에 대한 리뷰 보기 Cynthia는 ScyllaDB의 컨텐츠 전략 고위 이사이며 20 년 이상 소프트웨어 개발 및 품질 엔지니어링에 대해 글을 쓰고 있습니다.