feature-flags

4 개의 포스트

netflix3분 읽기큐레이션 요약

분석을 위한 디바이스 기능 모델링

넷플릭스는 다양한 기기의 하드웨어·플랫폼 차이로 인해 기능 지원 여부가 달라지므로, 기기별 역량을 정교하게 모델링해야 한다고 설명합니다. 이를 위해 최신 기기 상태를 저장하는 누적 테이블과 최근 28일간의 활성 기기 분포를 집계하는 히스토그램 테이블을 구축했습니다. 이 데이터는 4K, 공간 음향, 클라우드 게임, 최신 UI 등의 기능 도달 범위를 분석하고 기기별 기능 활성화 여부를 안전하게 결정하는 데 활용됩니다. ## 기기 역량 모델링의 필요성 - 넷플릭스는 4K 스트리밍, 몰입형 오디오, 라이브 스트리밍, 클라우드 게임 등 다양한 기능을 제공합니다. - 기기마다 다음과 같은 하드웨어 및 플랫폼 제약이 존재합니다. - RAM 용량 - CPU 코어 수 - 화면 해상도와 외부 디스플레이 지원 - 비디오·오디오 프로필 - 운영체제 및 플랫폼 기능 지원 여부 - 따라서 모든 기기에 동일한 기능을 활성화하면 성능 저하나 사용자 경험 악화가 발생할 수 있습니다. - 기기 역량 데이터를 바탕으로 기능 지원 가능 여부를 세밀하게 판단하면 기능 확산의 병목을 찾고 출시 속도를 높일 수 있습니다. ## 최신 상태를 저장하는 누적 테이블 - 누적 테이블은 각 기기 모델의 최신 역량 상태를 저장하도록 설계되었습니다. - 기기별로 다음과 같은 정보를 기록할 수 있습니다. - 화면 너비와 높이 - 지원되는 비디오 프로필 - 서라운드 사운드 지원 여부 - RAM 크기 - 기타 하드웨어 및 플랫폼 기능 - 예시 데이터는 한 기기가 1280×720 해상도와 `playready`, `hevc` 비디오 프로필을 지원함을 나타냅니다. ```json { "Screen Height": ["720"], "Screen Width": ["1280"], "Video Profiles": ["playready", "hevc"] } ``` - 최신 상태 중심으로 데이터를 관리하기 때문에 분석 및 리포팅 시스템에서 현재 기기 환경을 효율적으로 조회할 수 있습니다. ## 최근 활성 기기 분포를 보여주는 히스토그램 테이블 - 집계 분석에는 최근 28일 동안 활성 상태였던 기기 수를 기록하는 히스토그램 테이블을 사용합니다. - 데이터는 다음 기준으로 세분화됩니다. - 기기 모델 - 소프트웨어 버전 - 특정 기능 또는 역량 지원 여부 - 전체 활성 기기 중 특정 역량을 지원하는 기기의 비율을 계산할 수 있습니다. - 예를 들어 스트리밍 스틱에 연결된 외부 디스플레이 역량을 분석할 때 다음과 같이 확인할 수 있습니다. - 전체 기기의 100%가 HD용 `playready` 프로필 지원 - 전체 기기의 20%만 UHD용 `hevc` 프로필 지원 - 단순히 “기기 모델이 기능을 지원한다”는 정보가 아니라, 실제 사용 중인 기기 집단에서 해당 기능이 어느 정도 보급되어 있는지 파악할 수 있다는 점이 중요합니다. ## 기능 플래그와 분석 제품의 결합 - 기기 역량 데이터는 내부 시스템의 기능 플래그와 통합됩니다. - 이를 통해 특정 기기 모델이나 소프트웨어 버전에만 기능을 활성화하는 세밀한 제어가 가능합니다. - 분석 제품은 다음 기능의 도달 범위를 파악하는 데 활용됩니다. - 4K Ultra HD - Netflix Spatial Audio - 클라우드 게임 - 최신 사용자 인터페이스 - 실제 기기 지원률과 성능 데이터를 기반으로 기능을 활성화하므로 안정성과 성능을 함께 고려할 수 있습니다. ## 기대 효과 - 기능이 지원되지 않는 기기에 잘못 배포되는 문제를 줄일 수 있습니다. - 특정 기기나 소프트웨어 버전에서 발생하는 기능 확산의 병목을 식별할 수 있습니다. - 기능 출시 전 지원 가능한 사용자 규모를 예측할 수 있습니다. - 전 세계의 다양한 기기 생태계에 맞춰 기능을 점진적이고 안전하게 확장할 수 있습니다. 실무적으로는 기기별 최신 상태와 실제 활성 기기 분포를 분리해 관리하고, 이를 기능 플래그와 연결하는 방식이 효과적입니다. 특히 기능 지원 여부뿐 아니라 실제 사용자 기기 중 지원 기기의 비율까지 함께 분석해야 기능 출시 범위와 우선순위를 정확하게 결정할 수 있습니다.

원문 읽기(새 탭에서 열림)
gitlab5분 읽기큐레이션 요약

AI 에이전트를 활용해 GitLab의 레이트 리미팅을 마이그레이션한 방법

GitLab은 3명의 엔지니어와 AI 에이전트를 활용해 레거시 애플리케이션·Rack 기반 레이트 리미팅을 `labkit-ruby` 단일 구현으로 통합했다. 에이전트는 코드 탐색, 사양 작성, 반복적인 구현과 테스트에는 효과적이었지만, 아키텍처 결정·점진적 롤아웃·관측성 설계·최종 판단은 여전히 사람의 책임이었다. 프로젝트의 성공을 결정한 것은 에이전트 자체보다 명확한 작업 루프, 작은 변경 단위, 점진적 배포, 그리고 실패를 되돌릴 수 있는 운영 체계였다. ## 레거시 레이트 리미팅 통합의 목표 - GitLab에는 다음 두 가지 레이트 리미팅 경로가 수년간 공존했다. - 애플리케이션 수준의 `Gitlab::ApplicationRateLimiter` - Rack 수준의 별도 레이트 리미터 - 목표는 두 시스템을 `labkit-ruby`의 단일 구현으로 통합하는 것이었다. - 새로운 구현은 다음 조건을 만족해야 했다. - 모든 요청에 적용될 만큼 안정적일 것 - 동작을 관측하고 테스트할 수 있을 것 - 장애 발생 시 되돌릴 수 있을 것 - 모놀리스와 다른 환경에서 동일하게 운영할 수 있을 것 - 기존 시스템에는 121개의 레이트 리미팅 키가 존재했다. ## 3명으로 구성된 포드와 AI 에이전트의 역할 - 포드는 세 명의 GitLab 엔지니어를 중심으로 구성됐다. - 모놀리스 측 구현과 롤아웃 담당 - `labkit-ruby`와 아키텍처 담당 - 범위 관리와 초기 gem 코드 작성 담당 - AI 에이전트는 다음 작업을 수행했다. - 코드와 기존 맥락 분석 - 기술 사양 초안 작성 - 범위가 제한된 변경 구현 - 테스트 작성 - 머지 리퀘스트 사전 검토 - GitLab Duo Code Review도 머지 리퀘스트의 품질 검토에 활용됐다. - 사람은 다음을 직접 맡았다. - 작업 범위 결정 - 아키텍처 설계 - 배포 및 롤아웃 판단 - 최종 리뷰와 승인 ## 사양-구현-검증 반복 루프 - 팀은 다음과 같은 엄격한 순서를 적용했다. 1. 에픽과 기존 코드 읽기 2. 사양 작성 3. 적대적 리뷰로 사양의 문제점 검토 4. 차단 이슈가 해결된 뒤 구현 5. 명시적인 증거를 바탕으로 검증 6. 머지 리퀘스트에 대한 적대적 리뷰 7. 필요 시 사람에게 에스컬레이션 8. 머지 - 적대적 리뷰는 최대 두 번의 해결 라운드까지만 허용하고, 이후에는 사람의 판단을 받도록 했다. - 프로젝트에서는 14개의 번호가 매겨진 사양과 30개가 넘는 `labkit-ruby` 머지 리퀘스트가 만들어졌다. - 레거시 코드처럼 맥락 파악과 반복 검증이 중요한 작업에서는 이처럼 제한된 루프가 에이전트 활용에 적합했다. ## 단계적 롤아웃과 에이전트가 잘한 작업 - 첫 번째 코호트에서는 트래픽이 많은 5개 키를 다뤘다. - `pipelines_create` - `notes_create` - `user_sign_in` - 그 외 주요 키 - 트래픽 비율을 `1% → 10% → 50% → 100%`로 단계적으로 높였고, 2026년 5월 5일 100% 배포를 완료했다. - 기존 `ApplicationRateLimiter`와 새 구현의 결과가 일치하는지 확인했지만, 단순히 불일치가 없다는 사실만으로 성공을 판단하지 않았다. - 실제로 제한에 걸릴 정도의 트래픽이 발생하지 않았을 가능성도 있기 때문이다. - 두 번째 코호트에서는 모놀리스 83개와 EE 12개를 포함한 95개 호출 지점을 두 개의 기능 플래그로 통합했다. - 이 작업을 수작업으로 했다면 약 95개의 플래그 변경과 190개의 YAML 수정이 필요했을 수 있지만, 에이전트는 이런 반복적인 코드베이스 전반의 변경에 특히 강했다. ## 관측성은 있었지만 실패 유형을 구분하지 못함 - 두 번째 코호트는 며칠간 섀도 모드에서 기존 구현과 비교되었고, 대체로 일치했다. - 그러나 강제 적용 모드로 전환한 뒤 인증되지 않은 일부 경로에서 식별자가 조용히 유실되는 문제가 발생했다. - 원인은 세 개의 `String` 값이 두 개의 원시 슬롯에 압축되면서 잘못된 값이 식별자를 덮어쓴 구조적 충돌이었다. - 일부 사용자는 짧은 시간 동안 일반적인 오류 메시지를 받았다. - 비교 시스템은 해당 키의 불일치를 이미 감지했지만, 대시보드가 다음을 구분하지 못했다. - 정상적인 동작 차이 - 데이터 구조 충돌 - 사용자에게 영향을 줄 수 있는 치명적 불일치 - 팀은 즉시 강제 적용 플래그를 끄고, 이틀 뒤 긴급 수정 사항을 배포했다. - 문제는 사양, 적대적 리뷰, 구현, 코드 리뷰, 점진적 롤아웃을 모두 통과했으므로, 단순히 “에이전트가 위험하다”기보다는 관측성이 충분히 세분화되지 않았던 것이 핵심 교훈이었다. ## 전체 키 인벤토리 관리의 실패 - 처음에는 다섯 개 코호트로 마이그레이션을 끝낼 계획이었다. - 마스터 브랜치 감사 과정에서 누락된 항목이 발견되어 여섯 번째 코호트를 추가했다. - Claude가 놓친 항목에는 다음이 포함됐다. - EE 전용 `notification_emails` - 일부 EE 레지스트리 항목 - 웹훅 관련 키 3개 - 1초 미만 주기의 `partner_*` 키 3개 - 고립된 어댑터 행 - 총 121개 키 중 17개가 초기 코호트에서 빠져 있었다. - 각 항목이 특정 코호트에 쉽게 들어가지 않는 이유는 있었지만, 목록에서 보이지 않아도 될 이유는 없었다. - 근본적인 실수는 에이전트와 사람이 전체 키 인벤토리 대비 진행 상황을 지속적으로 집계하도록 요구하지 않았다는 점이다. ## Redis 인프라 병목과 운영 판단 - `redis-cluster-ratelimiting`은 4개 샤드 클러스터로 운영됐다. - 마이그레이션으로 사용량이 증가하면서 기존에 알려져 있던 인프라 병목이 다시 나타났다. - 팀은 `maxclients`를 단계적으로 높였지만, 연결 수를 100,000까지 밀어붙이지 않고 75,000에서 중단했다. - 더 많은 연결을 허용하면 각 프라이머리의 CPU가 포화될 수 있었기 때문이다. - 각 샤드는 명령 실행에 하나의 코어를 사용했고, 수직 확장으로 해결할 여지도 제한적이었다. - 따라서 에이전트가 코드를 생성하더라도, 실제 배포 속도와 범위는 인프라 용량과 운영자의 판단에 의해 결정됐다. ## AI 에이전트가 바꾼 병목 - 에이전트 덕분에 코드 작성 자체는 더 이상 가장 느린 단계가 아니었다. - 대신 병목이 다음 영역으로 이동했다. - 사람의 리뷰 처리 용량 - 롤아웃 시점과 범위에 대한 판단 - 운영 중인 시스템을 주의 깊게 관찰하는 능력 - 에이전트는 요청하면 95개의 기능 플래그 같은 반복 작업도 만들어내지만, 그런 설계가 실제로 필요한지는 판단하지 못한다. - 예를 들어 코호트 1 이후 팀은 레이트 리미트마다 별도 기능 플래그를 두는 방식이 과도하다고 판단해 이후 마이그레이션에서는 적용하지 않기로 했다. - 에이전트와 협업하는 방법 자체도 학습이 필요했으며, 때로는 에이전트와 반복적으로 막혀 직접 처리하는 편이 빠르다고 느끼는 순간도 있었다. ## 최종 상태와 실용적인 교훈 - 2026년 6월 중순 기준으로 여섯 개 코호트가 모두 100% 롤아웃됐다. - `ApplicationRateLimiter`의 121개 키가 새 프레임워크를 통해 동작하게 되었고, 감사로 결과를 확인했다. - 이 사례에서 권장할 만한 방식은 다음과 같다. - 에이전트에는 반복적이고 범위가 명확한 변경을 맡긴다. - 아키텍처, 위험 허용 수준, 배포 중단 기준은 사람이 결정한다. - 전체 마이그레이션 대상을 인벤토리로 관리하고 누락 여부를 자동 검증한다. - 단순한 불일치 감지를 넘어 실패 원인과 심각도를 구분하는 관측성을 구축한다. - 기능 플래그와 점진적 롤아웃으로 즉시 되돌릴 수 있게 한다. - 코드 생성 속도가 빨라져도 리뷰와 운영 관찰에 필요한 사람의 시간을 충분히 확보한다.

원문 읽기(새 탭에서 열림)
cloudflare원문

Flagship을 소개합니다: AI 시대를 위해 구축된 피처 플래그 (새 탭에서 열림)

Cloudflare가 발표한 'Flagship'은 AI가 코드를 직접 작성하고 배포하는 시대에 대응하기 위해 설계된 네이티브 피처 플래그(Feature Flag) 서비스입니다. 이 서비스는 배포와 출시를 분리함으로써 AI 에이전트가 안전하게 기능을 테스트하고 롤아웃할 수 있는 환경을 제공하며, Cloudflare의 에지(Edge) 인프라를 활용해 지연 시간 없는 성능을 보장합니다. 결과적으로 Flagship은 개발자와 AI가 속도와 안전성을 동시에 확보하며 프로덕션 환경에 기여할 수 있도록 돕는 핵심 인프라 역할을 합니다. ### AI 자율 코딩 시대의 안전장치 * AI 에이전트가 코드를 작성, 검토, 병합, 배포하는 자동화된 워크플로우에서 피처 플래그는 필수적인 '안전 그물' 역할을 수행합니다. * AI가 작성한 신규 코드를 플래그 뒤에 숨겨 배포한 뒤, 에이전트가 프로덕션 환경에서 직접 기능을 테스트하고 지표에 따라 노출 범위를 조절하거나 즉시 비활성화할 수 있습니다. * 이를 통해 인간의 개입을 줄이면서도 배포로 인한 장애의 영향 범위를 최소화(Blast Radius Control)할 수 있습니다. ### 기존 방식의 성능 및 관리 문제 * **하드코딩의 한계:** 코드 내에 플래그 로직을 직접 작성하면 초기에는 빠르지만, 플래그 개수가 늘어날수록 중앙 집중적인 가시성이 사라지고 감사 추적(Audit Trail)이 어려워집니다. * **외부 서비스 호출의 지연:** 외부 피처 플래그 서비스를 API로 호출할 경우, 에지에서 동작하는 애플리케이션의 응답 속도가 외부 네트워크 지연 시간에 종속되는 문제가 발생합니다. * **서버리스 환경의 제약:** 기존의 '로컬 평가' SDK는 메모리에 규칙을 상주시켜야 하지만, Cloudflare Workers와 같은 서버리스 환경은 프로세스가 짧게 유지되므로 매번 SDK를 초기화해야 하는 비효율이 있습니다. ### Flagship의 동작 원리 및 아키텍처 * **네이티브 인프라 활용:** 외부 데이터베이스 없이 Cloudflare의 Durable Objects와 KV(Key-Value)를 기반으로 구축되었습니다. * **데이터 동기화:** 플래그 설정 변경 시 Durable Object에 원자적으로 기록되며, 수 초 이내에 전 세계 Cloudflare 에지의 KV 스토리지로 복제됩니다. * **에지 로컬 평가:** 플래그 평가 로직이 사용자의 요청을 처리하는 동일한 에지 위치(Worker Isolate)에서 실행되므로 외부 네트워크 호출이 발생하지 않습니다. ### 구현 및 표준 준수 * **Worker 바인딩:** `wrangler.jsonc`에 설정을 추가하면 HTTP 라운드트립 없이 Workers 런타임 내부에서 직접 플래그 값을 읽어올 수 있습니다. * **OpenFeature 표준 지원:** CNCF의 오픈 표준인 OpenFeature를 준수하여 Node.js, Bun, Deno 및 브라우저 환경에서도 일관된 방식으로 사용할 수 있으며 벤더 종속성을 줄였습니다. * **타입 안정성:** Boolean, String, Number, Object 등 다양한 타입의 접근자를 제공하며, 평가 결과와 함께 선택 이유(Reason) 등의 상세 정보도 함께 확인할 수 있습니다. 현재 Flagship은 클로즈 베타로 제공되고 있으며, Cloudflare Workers 생태계를 사용하는 팀에게 네트워크 지연 없는 고성능 피처 플래그 솔루션으로서 강력한 선택지가 될 것으로 보입니다. 특히 AI 기반의 자동화된 배포 파이프라인을 구축하려는 조직이라면 Flagship의 에지 기반 평가 모델이 제공하는 속도와 안정성을 적극적으로 검토해 볼 가치가 있습니다.

gitlab원문

Python에서 GitLab 기능 플래그 시작하기 (새 탭에서 열림)

GitLab 피처 플래그(Feature Flags)는 소프트웨어의 배포와 출시를 분리하여 운영 환경에서의 리스크를 최소화하는 핵심 기술입니다. Python Flask 앱과 Unleash SDK를 통합하면 별도의 서버 없이도 GitLab UI에서 실시간으로 기능을 제어하고, 특정 사용자 그룹에게만 점진적으로 기능을 노출할 수 있습니다. 이를 통해 예상치 못한 버그 발생 시 코드 재배포 없이 즉각적으로 기능을 차단하고 안전하게 장애에 대응할 수 있는 유연한 릴리스 환경을 구축할 수 있습니다. **GitLab과 Unleash SDK의 작동 방식** * GitLab은 Unleash 호환 API를 내장하고 있어 별도의 Unleash 서버 구축 없이도 다양한 언어의 SDK와 직접 연결이 가능합니다. * SDK는 애플리케이션 시작 시 모든 플래그 정의를 가져오며, 설정된 간격(예: 15초)마다 이를 업데이트하여 로컬에 캐싱합니다. * 플래그 상태를 확인하는 `is_enabled()` 함수는 네트워크 호출 없이 로컬 캐시를 즉시 평가하므로, 성능 저하가 거의 없고 일시적인 네트워크 장애에도 탄력적으로 대응합니다. **정교한 기능 노출을 위한 배포 전략** * **All users:** 모든 사용자에게 기능을 즉시 켜거나 끄는 단순 토글 방식으로 사용됩니다. * **Percent rollout:** 사용자 ID나 세션 ID를 기반으로 트래픽의 특정 비율(예: 10%)에게만 기능을 노출하여 점진적인 릴리스를 수행할 수 있습니다. * **User IDs 및 User list:** 특정 사용자 ID나 정의된 리스트에 포함된 내부 QA 팀, 베타 테스터에게만 기능을 우선적으로 공개하는 데 유용합니다. **Python Flask 애플리케이션 통합 절차** * **GitLab 설정:** 프로젝트 설정에서 Feature Flags 기능을 활성화하고, 사용할 플래그 이름(예: `dark_mode`, `new_layout`)과 배포 전략을 정의합니다. * **인증 정보 확보:** GitLab UI의 Configure 패널에서 제공하는 API URL과 고유한 Instance ID를 복사하여 애플리케이션의 환경 변수로 등록합니다. * **SDK 구현:** `UnleashClient`를 사용하여 API URL과 Instance ID를 설정하고 클라이언트를 초기화합니다. 이후 코드 내에서 플래그 활성화 여부에 따라 로직이 분기되도록 작성합니다. * **환경 관리:** 보안을 위해 Instance ID와 같은 민감한 정보는 `.env` 파일에 저장하고 버전 관리 시스템(Git)에 포함되지 않도록 주의해야 합니다. **실무를 위한 권장 워크플로우** 새로운 기능을 배포할 때는 먼저 'User IDs' 전략을 사용하여 내부 팀원들에게만 기능을 노출해 최종 점검을 수행하십시오. 문제가 없다면 'Percent rollout' 전략으로 변경하여 트래픽의 10%부터 점진적으로 확대해 나가는 것이 안전합니다. 만약 운영 지표에 이상이 발견되면 GitLab UI에서 즉시 플래그를 비활성화하는 것만으로 몇 초 안에 전체 서비스를 정상화할 수 있습니다.