category

Design

10개의 글

Opinionated Zanzibar

Zanzibar

Zanzibar 개요 Zanzibar(이하 잔지바)는 구글에서 실제 사용하고 있으며, 수년 전에 논문을 통해 공개된 권한 관리 시스템입니다. 잔지바는 주로 관계 튜플이란 것에 의해 권한 관계가 정의됩니다. 각각의 사용자, 권한 관계, 객체에 대해서 튜플 이용하여 아래와 같이 정의합니다. document:roadmap#owner@user:alice document:roadmap#viewer@user:bob …

ElasticSearch/OpenSearch에서 ClickHouse로의 로그 마이그레이션: 성능과 경제성의 전환점

개요

개요 실시간 로그 수집과 분석은 현대 소프트웨어 시스템에서 필수적인 요소가 되었습니다. 많은 팀이 ElasticSearch나 OpenSearch를 로그 데이터 웨어하우스로 사용해 왔고, 이는 합당한 선택이었습니다. 전역 인덱싱(full-text search)과 유연한 스키마는 로그 탐색에 매우 유용했습니다. 하지만 로그 데이터의 규모가 기하급수적으로 증가하면서 ES/OS 기반 아키텍처의 한계가 명확해지고 있습니다. 메모리 사용 …

문맥 기반 로깅

배경

배경 왜? 이 또한 제가 조직에서 기본적으로 사용하고 있던 로그 자체에 대한 불합리에 의거하여 설계한 내용입니다. 기존 로그는 단순히 필요에 따라 에러를 남기거나, 스냅샷을 남기는 정도에 불과 했습니다. 그 때문에 매번 예상치 못한 경우에 대한 추적이 불가능에 가까웠죠. 또한 명확한 관측성을 확보하지 못 하다보니 어떤 부분을 개선해야하고, 어떤 부분이 실제로 많이 쓰이고 있는지, 장애가 발생했을 때 어떤 상황이었는지에 대한 정 …

폴리글랏이란 무엇인가

아니 근데

아니 근데 왜 다들 요즘 서비스 아키텍처 구상하면서 큰 의문이 들었습니다. 규모가 조금이라도 큰 조직이면 자바나 스프링 강박증이라도 없었다면 높은 확률로 각자가 쓰고 있는 기술 스택이 다를 것입니다. 제가 느낀 위화감이 그것이었습니다. NodeJS, PHP, Java, Go, C++(?) 등으로 이루어진 API 및 웹소켓 서버들이 있습니다. 이 서버들에 대한 공통된 모듈에 대해 항상 큰 의문이 있었습니다. 같은 솔루션에 대한 …

요청 수를 줄이고, 캐시 수용량은 늘리기

valkey?

valkey? 여전히 valkey보다 redis가 더 익숙한 분들이 계실 겁니다. valkey는 Redis Inc.의 redis에 대한 라이센스 변경 및 독점적 지위 확보 시도에 대한 반발로 redis 7.2.4를 베이스로 추가 개발되고 있는 레디스 대체제입니다. 현재는 레디스보다도 먼저 8.0 버전을 출시하는 등 굉장히 활발하게 개발 및 유지보수 되고 있습니다. 당연한 이야기로 레디스의 포크인 만큼 레디스와 동일하게 다양한 …

로그 스트리밍으로 서비스 구성하기

배경

배경 로그도 남기고, 이벤트도 남겨? 서비스를 쭉 구성하다보니 이런 생각을 했습니다. 어차피 로그는 남긴다. 필요한 유저 행동에 대해 이벤트르 발행한다. 그러면 각 서비스가 로그에서 필요한 걸 가져가서 상태 변화를 기록하면 되는 것 아닐까? 뭣하러 굳이 이벤트를 별도로 발행하지? 어차피 모두 kafka같은 메시지 브로커를 탈텐데? 왜 굳이 2개를 중복으로 메시지 브로커에게 남겨야 하는가가 매우 큰 궁금증이었습니다. 기본적으로 …

대는 소를 포함한다

?

? 대는 소를 포함한다는 말은 법률상으로 상위 개념과 하위 개념이 존재할 경우, 상위 개념에 대한 법을 하위 개념에도 적용하는 것입니다. 쉽게 이야기하면, 법률적으로는 자전거가 자동차의 하위 개념이니 자동차에 적용하는 다양한 법을 자전거에도 같이 적용하는 것입니다. 하지만 제가 법률 전문가도 아니고, 법과 관련된 이야기를 하고 싶은 건 아닙니다. 소프트웨어 설계에서 범용은 전용을 포함한다 저희는 때때로 범용으로 무언가를 만들고 …

빠르게 메시지를 전파하고 싶어

배경

배경 NATS는 정말 아름다워 NATS는 Go 언어로 작성된 메시지큐입니다. 그리고 제가 개인적으로 좋아하는 오픈소스 프로젝트이기도 합니다. 한때 NATS에서 서브스크립션이 메시지를 받는 방식이 단순 채널이 아닌 독특한 자료구조가 따로 있는 걸 봤었던 적이 있습니다. 이 자료구조는 연결리스트를 통해 특정 서브스크립션에 전달될 메시지를 저장합니다. 그리고 sync.Cond를 이용하여 별도의 대기 중인 서브스크립션을 위한 고루틴에 …