아키텍처는 세 개의 계층으로 구성된 분산 Zanzibar 영감을 받은 권한 서비스에 중점을 둡니다: 무상태 검사 엔진 평가 노드, 전 세계적으로 분산된 그래프 저장소 스냅샷 데이터베이스, 캐시 무효화를 위한 이벤트 기반 관찰 파이프라인. 이 디자인은 읽기 중심의 권한 검사와 쓰기 중심의 권한 업데이트를 분리하여 평가 용량의 독립적인 확장을 가능하게 하면서 관계 변형에 대한 강한 일관성 보장을 유지합니다. 시스템은 Google의 zookie 패턴을 사용하여 성능 이점을 희생하지 않고도 부패성을 제한합니다.
가장자리 위치에 배치된 검사 엔진 노드는 지역 인메모리 캐시와 축소된 권한 비트맵을 사용하여 권한 쿼리를 평가합니다. 이 노드는 복제된 etcd 클러스터에서 네임스페이스 구성을 로드하고 지리적으로 분할된 CockroachDB 또는 Spanner 인스턴스의 관계 튜플을 해결하며, 이는 TrueTime 또는 하이브리드 논리 클럭을 통해 외부 일관성을 제공합니다. 각 노드는 관계가 확실히 존재하지 않을 때 데이터베이스에 캐시 누수를 방지하기 위해 Bloom 필터를 유지합니다.
최신 해제된 권한이 가장자리 캐시에서 보이지 않을 수 있는 '새로운 적 문제'를 처리하기 위해 시스템은 zookie 토큰—스냅샷 일관성을 인코딩한 불투명한 타임스탬프—을 구현하여 구성할 수 있는 불확실성 창 내에서 민감한 작업의 캐시 누수를 강제합니다. 클라이언트는 초기 검사와 함께 이러한 토큰을 수신하며 고가치 자원에 접근할 때 이를 재전송해야 하며, 이는 최근에 해제된 권한이 전 세계 캐시 무효화를 요구하지 않고 즉시 보이도록 합니다. 이 메커니즘은 낮은 대기 시간의 필요성과 즉각적인 해제 가시성의 보안 요구 사항 사이의 균형을 유지합니다.
캐시 무효화는 Apache Kafka 기반의 관찰 파이프라인을 활용하여 튜플 변경 사항을 모든 가장자리 검사 엔진에 전파하며, 일관된 해싱을 사용하여 해제 폭풍이 동기화된 데이터베이스 폭격이 아닌 격차 있는 캐시 새로 고침을 촉발하도록 보장합니다. 파이프라인은 인기 있는 객체의 권한 변경이 발생할 때 허둥대는 무리 현상을 방지하기 위해 지터 형태의 지수 백오프를 사용합니다. 이 아키텍처는 시스템이 캐시 적중에 대해 10ms 미만의 지연을 유지하고, 지리적으로 분산된 노드 간의 권한 업데이트에 대해 인과적 일관성을 보장하도록 설계되었습니다.
50만 기업 사용자에게 서비스를 제공하는 글로벌 문서 협업 플랫폼은 복잡한 공유 계층을 평가하는 동안 정점 시간에 재앙적인 지연이 발생했습니다. 각 문서 접근은 중첩된 그룹 구성원 권한 및 상속된 권한을 통해 이동해야 하며, 이는 단일 PostgreSQL 클러스터에 저장되어 500ms 이상의 쿼리 시간과 팀의 부서나 프로젝트를 변경할 때 빈번한 시간 초과를 초래했습니다. 엔지니어링 팀은 중첩된 폴더 구조에서의 권한 해제 간의 강력한 보안 보장을 유지하면서 10ms 미만의 지연이 가능한 솔루션이 필요했습니다.
첫 번째 접근법은 공격적인 Redis 물질화된 뷰 캐싱 권한 경로를 사용하여 중앙 집중식 PostgreSQL 클러스터를 유지하는 것을 평가했습니다. 장점으로는 해제가 즉시 가시성을 보장하는 강한 ACID 보장이 있으며, 복잡한 다중 테이블 업데이트에 대한 간단한 거래 의미론이 있습니다. 단점은 대량 권한 변경 동안 심각한 쓰기 병목 현상이 발생하고, 인기 있는 문서가 업데이트 될 경우 불가피한 캐시 허둥대기 위험이 있으며, 보안이 중요한 결정에 대한 허용할 수 없는 복제 지연을 초래하는 복잡한 읽기 복제본 없이는 지리적으로 읽기 처리량을 확장할 수 없습니다.
두 번째 접근법은 응용 프로그램 측 권한 해제와 TTL 기반 캐시 만료가 있는 완전 비정규화된 Apache Cassandra 배포를 제안했습니다. 장점으로는 관계의 변형에 대한 뛰어난 쓰기 처리량과 단일 실패 지점 없이 본질적인 다중 지역 가용성이 포함되었습니다. 단점은 해제된 권한이 소문 프로토콜 지연으로 인해 몇 분 동안 가시성으로 남아 있는 수용할 수 없는 최종 일관성의 거래가 revealed되었으며, 원래 그룹에서 제거된 후 사용자가 리소스에 대한 액세스를 유지하게 만드는 보안 허점을 생성하는 원자적 연결 삭제 부족이 있었습니다.
팀은 결국 분산된 관계 튜플 스토리지에 CockroachDB를 사용하고, 정책 실행 점으로서 Envoy 사이드카를 사용하며, Bloom 필터가 전면에 나선 최신 사용된 수 캐시와 수평으로 확장 가능한 확인 엔진 노드를 활용한 Zanzibar 스타일 아키텍처를 선택했습니다. 이 선택은 직렬화된 기본 격리를 통한 권한 쓰기의 강한 일관성 요구와 로컬 평가 캐시 및 Apache Kafka 기반 무효화 스트림을 통한 엣지 성능 요구 간의 균형을 유지했습니다. 결과적으로 p99 권한 부여 지연이 500ms에서 4ms로 줄어들었으며, 전 세계에서 초당 1500만 건의 검사를 지원하고, 모든 가장자리 노드에 150밀리초 내에 권한 해제가 전파되면서 99.99%의 가용성을 유지했습니다.
권한 해제 직후 권한 검사에서 오래된 "허용" 결정이 반환되지 않도록 하려면 어떻게 해야 하며, 분산 캐싱의 성능 이점을 희생하지 않고 이를 달성할 수 있나요?
후보자들은 종종 zookie 패턴이나 버전 벡터를 간과하고, 대신 글로벌 캐시 무효화 또는 모든 체크에 대한 데이터베이스 읽기를 제안합니다. 해결책은 각 결정과 함께 일관성 토큰을 반환하여 사용된 데이터의 스냅샷 타임스탬프를 인코딩하도록 권한 서비스를 요구합니다. 민감한 작업이나 최근 해제 사건 후에는 클라이언트가 이 토큰을 제시해야 하며, 이는 체크 엔진이 로컬 캐시가 토큰 타임스탬프 이전인지 확인하기 위해 중앙 저장소에 대해 확인하도록 강제합니다. 이는 글로벌 캐시 무효화나 대부분의 요청에 대한 읽기 성능을 희생하지 않으면서 인과적 일관성을 보장합니다.
광범위하게 공유된 객체의 권한이 수정될 가능성이 있는 경우 수백만 개의 동시 캐시 새로 고침이 발생하지 않도록 캐시 무효화 메커니즘을 어떻게 설계하시겠습니까?
핵심 기술은 캐시 키의 일관된 해싱과 지터형 지수 백오프 및 가장자리 노드에서의 요청 응축을 결합하는 것입니다. 관찰 파이프라인이 튜플 변경 사항을 전파할 때, 가장자리 노드는 즉시 무효화하지 않고 대신 객체 ID의 해시를 사용하여 새로 고침을 일정 기간에 걸쳐 분산시킵니다. 또한 각 체크 엔진은 진행 중인 체크에 대한 비행 그룹을 유지하여 동일한 객체에 대한 동시 요청이 단일 백엔드 쿼리 결과를 공유하도록 하여 인기 있는 객체 업데이트 동안 데이터베이스 과부하를 방지합니다.
단순한 방향 그래프 탐색을 사용한 ReBAC 정책 모델링이 충분하지 않은 이유는 무엇이며, 분산 평가 환경에서 교차 및 배제 제약을 어떻게 처리합니까?
단순한 그래프 탐색은 "사용자가 그룹 A에 있고 그룹 B에는 없는 경우만 허용"과 같은 정교한 정책에 필요한 집합 작업을 포착하지 못합니다. 해결책은 네임스페이스 구성이 결정 트리로 컴파일되는 재작성 시스템을 구현하여 음수 및 양수 관계 튜플을 명시적으로 저장하게 됩니다. 교차 제약의 경우 시스템은 두 집합을 쿼리하고 교차점을 확인 엔진에서 계산하며, 배제는 조기 종료로 짧은 회로 평가를 사용하여 처리됩니다. 이 접근 방식은 여러 번의 데이터베이스 왕복 전달을 요구하지 않고도 복잡한 불리언 논리를 효율적으로 평가하도록 보장합니다.