Netflix는 사용자들이 오랫동안 스트리밍을 계속하길 바라지만, 넷플릭스는 90초 안에 우리의 관심을 끌어야 합니다.
느린 인터넷 연결이나 DB 병목으로 인해 90초는 생각보다 빠르게 소모될 수 있습니다.
넷플릭스는 이를 위해 EVCache를 사용하여 대기 시간을 줄이고 애플리케이션 성능을 향상시키고 있습니다.
EVCache는 AWS에 최적화되어있고 Netflix가 필요에 맞게 조정한 Memcached 기반의 분산 키-값 저장소입니다.

클라이언트 라이브러리를 통해 EVCache 클라이언트에 액세스합니다. 이는 TCP 커넥션을 이용하여 캐시와 직접 통신 합니다. 또한 이 Evcache와 직접 통신하지 못하는 클라이언트를 위해 Evache의 클라이언트를 대신할 수 있는 사이드카 프로세스인 Prana가 함께 올라갑니다.
확장성을 지원하기 위해 EVCache는 다양한 AWS 가용성 영역에 걸쳐 3개의 전체 데이터 복사본을 유지하도록 구축되었습니다. 모든 클라이언트는 가용성 영역 및 지역에 걸쳐 클러스터의 모든 서버에 연결됩니다.

캐시에서 읽을 때 클라이언트는 기본 또는 가장 가까운 클러스터에서 읽기를 시도합니다.
읽기에 실패하면 다른 지역에서 읽기를 시도합니다.
쓰기의 경우 클라이언트는 세 영역 모두에 쓰기를 수행하여 지역 간 데이터 복제를 시행합니다.
애플리케이션이 일부 데이터를 요청하면 먼저 EVCache 클라이언트에 조회를 시도하고 데이터가 없으면 Cassandra로 이동하여 데이터를 가져옵니다.

재생 세션 정보를 EVCache에 임시 데이터로 저장합니다.
한 어플리케이션에서 세션을 시작하는 동안 다른 어플리케이션이 세션을 업데이트 하너나, 세션을 닫을 수 있도록 공유된 임시 데이터 저장소를 제공합니다.

기본 저장소는 Netflix에서 EvCache를 사용하는 가장 큰 공간입니다.
넷플릭스는 사용자들에게 보여줄 새로운 홈페이지를 매일 사용자들이 적은 시간에 대규모 배치 작업을 통해 계산합니다. 해당 데이터들은 모두 Evache에 저장됩니다.
온라인 서비스는 데이터를 언제 접근하던지 요청할 수 있지만, 오프라인에서는 아닙니다. 넷플릭스는 이를 오프라인에서도 게시하기 위해 Evache를 오프라인에서 애플리케이션과 온라인 애플리케이션 사이의 버퍼 역할을 하게 됩니다.

Netflix에는 대용량이면서도 높은 가용성을 유지해야하는 데이터가 있습니다.
그 예시로 Netflix 홈페이지에 표시되는 UI 문자들입니다. UI 문자열이 누락되면 사용자 경험이 매우 저하될 수 있습니다.
이 데이터를 처리하기 위해 애플리케이션은 로컬 캐시를 사용합니다. 그러나 로컬 캐시에 데이터가 없는 경우에는 EvCache에서 데이터를 조회해올 수 있습니다. 이는 또한 백그라운드에서 주기적으로 새로 고침해줄 수 있습니다.

넷플릭스의 캐시는 Memcached 기반으로 되어있다.
요즘들어 계속 Redis가 만능이다 라는 이야기를 들어왔기 때문에
왜 Memcached로 되어있을지 의문이 들어서 이에 대해 찾아봤다.
결론적으로 Redis가 Memcached 에 비해서 지원하는 기능이 더 많다.
한 마디로 좀 더 무겁다.
반면에 Memcached는 가볍다.
Redis는 단순히 캐시로 사용되기 보다 다양한 용도로 사용되지만, Memcached는 일반적으로 단순히 캐시의 목적으로 사용된다.
하지만 Netflix는 Memcached를 단순히 캐시의 용도로 사용하지 않는다.
Google에서 UDP 기반으로 HTTP/3.0 을 직접 구현해서 사용하듯이 직접 최적화할 수 있는 여지가 더 남아있기 때문에 가벼운 Memchaced를 사용한 것인가 하는 생각이 들었다.