FAQ
일반 질문
섹션 제목: “일반 질문”Actionbase란 무엇인가요?
섹션 제목: “Actionbase란 무엇인가요?”Actionbase는 사용자 인터랙션—좋아요, 최근 조회, 팔로우, 반응—을 제공하는 데이터베이스입니다.
사용자 인터랙션을 누가 무엇을 어떤 대상에 했는지로 모델링하며, 쓰기 시점에 읽기 최적화 구조를 미리 만듭니다. 읽기 작업은 제한된 접근 패턴(GET, SCAN, COUNT)을 사용합니다.
Actionbase는 범용 그래프 데이터베이스가 아닙니다. 예측 가능한 읽기 패턴으로 사용자 인터랙션을 제공하는 데 집중합니다.
왜 Actionbase라는 이름인가요?
섹션 제목: “왜 Actionbase라는 이름인가요?”이름에 담긴 의미는 저장하는 데이터가 바로 사용자 액션, 즉 인터랙션이기 때문입니다.
Actionbase에서 “인터랙션”과 “액티비티”는 무엇을 의미하나요?
섹션 제목: “Actionbase에서 “인터랙션”과 “액티비티”는 무엇을 의미하나요?”인터랙션은 사용자 액션(좋아요, 조회, 팔로우)을 누가 → 무엇을 → 대상의 명시적 관계로, 스키마에 정의된 프로퍼티와 함께 캡처합니다.
내부적으로는 인터랙션이 그래프의 엣지로 표현됩니다. “인터랙션”과 “액티비티”라는 용어는 서로 바꿔 쓸 수 있습니다.
Actionbase가 해결하는 문제는 무엇인가요?
섹션 제목: “Actionbase가 해결하는 문제는 무엇인가요?”- 최근 조회 저장 및 조회
- 좋아요, 반응 및 그 개수 관리
- 팔로우 관계 처리
각 서비스마다 인덱스, 정렬, 카운팅 로직을 다시 구현하지 않고, Actionbase가 쓰기 시점에 미리 계산합니다.
언제 Actionbase를 사용하지 않아야 하나요?
섹션 제목: “언제 Actionbase를 사용하지 않아야 하나요?”- 단일 데이터베이스 인스턴스가 워크로드를 처리할 수 있을 때
- 범용 그래프 쿼리 또는 탐색이 필요할 때
- 귀하의 팀에는 HBase 운영 경험이 없습니다
- 아직 확장성 문제를 겪고 있지 않습니다
Actionbase는 프로덕션 환경에 적합한가요?
섹션 제목: “Actionbase는 프로덕션 환경에 적합한가요?”Actionbase는 수년간 카카오에서 프로덕션 환경에서 운영되어 왔으며, 주로 카카오톡 선물하기 서비스를 제공하고 있으며, 분당 100만 건 이상의 요청을 처리합니다.
그러나 오픈 소스 프로젝트로서 Actionbase는 이제 막 시작 단계입니다. 프로덕션 배포(Kubernetes, HBase 운영)에 대한 문서는 아직 준비 중입니다. 초기 채택자는 일부 불안정성을 예상해야 합니다.
Actionbase의 역사는 무엇인가요?
섹션 제목: “Actionbase의 역사는 무엇인가요?”개발은 2023년 카카오에서 시작되었습니다. 카카오톡 선물하기에 배포된 후, 2026년 1월에 오픈 소스로 공개되었습니다 — 오픈 소스로의 경로를 참조하세요.
데이터 모델
섹션 제목: “데이터 모델”Actionbase는 어떤 데이터 모델을 사용하나요?
섹션 제목: “Actionbase는 어떤 데이터 모델을 사용하나요?”Actionbase는 프로퍼티 그래프 모델을 사용합니다:
- 소스: 누구(예: 사용자)
- 타겟: 무엇(예: 상품, 콘텐츠)
- 프로퍼티: 스키마로 정의된 속성(예:
created_at,reaction_type)
각 인터랙션 유형(좋아요, 조회, 팔로우)은 자체 스키마를 가진 별도의 테이블로 정의됩니다.
unique-edge와 multi-edge의 차이점은 무엇인가요?
섹션 제목: “unique-edge와 multi-edge의 차이점은 무엇인가요?”- Unique-edge: (소스, 타겟) 쌍당 하나의 엣지만 존재합니다. 소스와 타겟으로 식별됩니다.
- Multi-edge: (소스, 타겟) 쌍당 여러 엣지가 존재할 수 있습니다. 각 엣지는 고유한
id를 가집니다.
Unique-edge는 좋아요, 팔로우, 최근 조회에 적합합니다. Multi-edge는 동일한 사용자가 동일한 수신자에게 여러 번 선물을 보낼 수 있는 선물 기록과 같은 경우에 적합합니다.
참고: 현재 문서는 unique-edge에 중점을 두고 있습니다. Multi-edge 문서는 나중에 확장될 예정입니다.
Actionbase는 버텍스(엔터티 데이터)를 지원하나요?
섹션 제목: “Actionbase는 버텍스(엔터티 데이터)를 지원하나요?”현재 Actionbase는 엣지(상호작용)에 집중하고 있습니다. 사용자 프로필이나 상품 정보와 같은 엔티티 데이터는 일반적으로 다른 곳(예: RDB)에 저장됩니다.
버텍스 지원은 향후 릴리스에서 계획되어 있습니다. 그동안에는 소스 = 타겟인 자체 엣지를 간단한 엔티티 저장 방식으로 활용할 수 있습니다.
Actionbase에서 스키마를 지원하나요?
섹션 제목: “Actionbase에서 스키마를 지원하나요?”네. 스키마는 다음과 같이 정의합니다:
- 소스와 타겟 식별자 타입(int, long, string 등)
- 인터랙션 프로퍼티와 해당 타입
스키마는 쓰기 시점에 어떤 읽기 최적화 구조(인덱스, 카운터 등)를 생성할지 결정합니다. 자세한 내용은 스키마와 메타데이터 API를 참고하세요.
몇 가지 인터랙션 모델 예시는 무엇인가요?
섹션 제목: “몇 가지 인터랙션 모델 예시는 무엇인가요?”최근 조회
- 소스:
user_id - 타겟:
product_id - 프로퍼티:
created_at
반응
- 소스:
user_id - 타겟:
content_id - 프로퍼티:
created_at,reaction_type
아키텍처
섹션 제목: “아키텍처”Actionbase는 쓰기를 어떻게 처리하나요?
섹션 제목: “Actionbase는 쓰기를 어떻게 처리하나요?”Actionbase는 상태 기반 뮤테이션 모델을 사용하여 인터랙션을 처리합니다:
- 현재 상태를 읽습니다.
- 들어오는 인터랙션을 상태 전이로 적용합니다.
- 결과 상태와 읽기 최적화 구조를 영속화합니다.
이벤트가 순서가 뒤섞여 도착하더라도 최종 상태는 일관성을 유지합니다.
쓰기 시점 최적화란 무엇인가요?
섹션 제목: “쓰기 시점 최적화란 무엇인가요?”Actionbase는 엣지가 기록될 때 State, Index, Count 구조를 미리 계산합니다. 이를 통해 쿼리 시점의 계산 없이 간단한 GET, COUNT, SCAN 읽기가 가능합니다.
- State — 소스와 타겟 간의 현재 관계
- Index — 프로퍼티(예:
created_at DESC)를 기준으로 한 정렬된 구조 - Count — 카운터(예: 아이템별 좋아요 수)
Actionbase는 순서가 뒤섞인 이벤트를 어떻게 처리하나요?
섹션 제목: “Actionbase는 순서가 뒤섞인 이벤트를 어떻게 처리하나요?”클라이언트가 이벤트에 타임스탬프를 부여합니다. Actionbase는 이 타임스탬프를 사용하여 도착 순서와 상관없이 올바른 최종 상태를 계산합니다. 자세한 내용은 뮤테이션을 참고하세요.
스토리지 및 인프라
섹션 제목: “스토리지 및 인프라”Actionbase는 어떤 스토리지 백엔드를 지원하나요?
섹션 제목: “Actionbase는 어떤 스토리지 백엔드를 지원하나요?”스토리지는 Actionbase에서 추상화되어 있습니다. 인터페이스 요구사항을 충족하는 모든 백엔드를 연결할 수 있습니다. 현재 구현은 HBase이며, 더 가벼운 백엔드도 계획 중입니다. 자세한 내용은 스토리지 백엔드를 참고하세요.
어떤 HBase 버전을 지원하나요?
섹션 제목: “어떤 HBase 버전을 지원하나요?”HBase 2.4 및 2.5에서 테스트되었습니다. 엄격한 버전 요구사항은 없습니다.
왜 HBase를 사용하나요?
섹션 제목: “왜 HBase를 사용하나요?”카카오에서는 이 규모에 맞는 인터페이스 요구사항을 충족하는 두 가지 스토리지 옵션(HBase와 Redis 프로토콜 기반 카카오 분산 KV 스토어인 Redicoke)이 있었습니다.
두 옵션 모두 수평 확장성, 내구성, 저지연 랜덤 읽기/쓰기를 제공합니다. 대량 로딩 기반의 대규모 데이터 마이그레이션에 더 적합했기 때문에 HBase를 선택했습니다.
참고: 대량 로딩은 파이프라인 컴포넌트의 일부입니다. 최초 오픈소스 릴리스는 Actionbase 코어에 집중했으며, 파이프라인 릴리스는 진행 중입니다.
스트리밍 및 데이터 파이프라인
섹션 제목: “스트리밍 및 데이터 파이프라인”WAL과 CDC란 무엇인가요?
섹션 제목: “WAL과 CDC란 무엇인가요?”- WAL(Write-Ahead Log) — 들어오는 이벤트를 그대로 기록하여 재생 및 복구에 사용합니다
- CDC(Change Data Capture) — 변경 후 상태를 기록하여 다운스트림 동기화에 사용합니다
두 가지 모두 Kafka 컨슈머를 통해 접근할 수 있습니다
Actionbase는 어떻게 분석 및 파이프라인을 지원하나요?
섹션 제목: “Actionbase는 어떻게 분석 및 파이프라인을 지원하나요?”WAL 및 CDC 스트림은 분석 시스템, 비동기 프로세서, 백그라운드 작업 또는 데이터 마이그레이션에 공급할 수 있습니다
Actionbase는 높은 쓰기 처리량을 처리할 수 있나요?
섹션 제목: “Actionbase는 높은 쓰기 처리량을 처리할 수 있나요?”고빈도 인터랙션(예: 최근 조회)의 경우 Actionbase는 Spark Streaming을 통한 비동기 처리를 사용합니다:
- 요청이 WAL에 큐에 등록되고, 응답이 즉시 반환됩니다
- 비동기 프로세서(Spark Streaming)가 큐에 쌓인 WAL 항목을 소비하여 Actionbase로 다시 변경을 전송합니다
- 변경 사항은 백그라운드에서 제한(throttle) 및 적용됩니다
이렇게 하면 지연 시간을 최소화하면서 처리량을 유지할 수 있습니다. 데이터는 일반적으로 수십 밀리초 이내에 반영됩니다. 정상 용량을 초과하는 트래픽 상황에서도 안정적으로 유지되도록 설계되었습니다
참고: 파이프라인 구성 요소는 현재 내부용입니다. 오픈 소스 릴리스는 진행 중입니다
Actionbase는 Neo4j와 어떻게 비교되나요?
섹션 제목: “Actionbase는 Neo4j와 어떻게 비교되나요?”Actionbase는 범용 그래프 데이터베이스가 아닙니다
- Neo4j — 범용 그래프 쿼리, 탐색
- Actionbase — 사용자 인터랙션에 대해 제한된 접근 패턴(GET, SCAN, COUNT) 제공
Actionbase는 기존 RDBMS와 어떻게 비교되나요?
섹션 제목: “Actionbase는 기존 RDBMS와 어떻게 비교되나요?”Actionbase는 RDBMS의 대체재가 아닙니다.
- RDBMS — 범용적이고 트랜잭션 처리용
- Actionbase — 대규모 사용자 인터랙션에 특화되어 있으며, 쓰기 시점의 머티리얼라이제이션 지원
대부분의 팀에서는 잘 튜닝된 RDBMS로 충분합니다. Actionbase는 더 이상 RDBMS로 처리가 어려울 때 존재합니다.
사용 사례
섹션 제목: “사용 사례”Actionbase의 일반적인 사용 사례는 무엇인가요?
섹션 제목: “Actionbase의 일반적인 사용 사례는 무엇인가요?”- 좋아요 버튼 및 반응 수 집계
- “최근 본 항목” 목록
- 팔로우/팔로잉 피드
- 사용자별 인터랙션 이력
이러한 데이터가 RDBMS의 한계를 넘어섰을 때—샤딩이 복잡해지거나 캐시가 불일치할 때—Actionbase가 이를 대신할 수 있습니다.
시작하기
섹션 제목: “시작하기”시스템 요구 사항은 무엇인가요?
섹션 제목: “시스템 요구 사항은 무엇인가요?”로컬(개발용) — 빠른 시작을 참고하세요.
- Java 17
- 인메모리 저장소, 외부 의존성 없음
프로덕션 — 문서는 개발 중이며, 로드맵을 참고하세요.
- Java 17
- 4 GB 이상의 메모리 권장(수평 확장 가능)
- 필요 사항: HBase, Kafka, 메타데이터용 JDBC 호환 데이터베이스(통합 예정)
어떻게 시작할 수 있나요?
섹션 제목: “어떻게 시작할 수 있나요?”HBase를 별도로 설정해야 하나요?
섹션 제목: “HBase를 별도로 설정해야 하나요?”네 — 문서는 개발 중이며, 로드맵을 참고하세요.
더 가벼운 백엔드는 향후 릴리스에서 제공될 예정입니다.
어떤 프로그래밍 언어를 지원하나요?
섹션 제목: “어떤 프로그래밍 언어를 지원하나요?”Actionbase는 REST API를 제공합니다. HTTP를 지원하는 모든 언어가 사용 가능하며, 쿼리 API와 뮤테이션 API를 참고하세요.
기여하기
섹션 제목: “기여하기”어떻게 기여할 수 있나요?
섹션 제목: “어떻게 기여할 수 있나요?”(이 문서는 Kanana-2로 번역되었습니다. 번역 기여를 환영합니다!)