JanusGraph의 핵심 이점 ① / 트랜잭션 처리 중심으로
JanusGraph의 핵심 이점 ①
대규모 그래프와 동시 트랜잭션 처리
JanusGraph는 오픈소스 분산 그래프 데이터베이스로, 복잡한 데이터 관계를 효과적으로 저장하고 분석할 수 있는 강력한 기능들을 제공합니다. 이번 글에서는 JanusGraph의 대표적인 장점들을 하나씩 살펴봅니다.
✅ 1. 매우 큰 그래프를 지원하는 확장성
JanusGraph는 클러스터 기반으로 운영되며, 클러스터에 포함된 머신 수에 따라 처리할 수 있는 그래프의 크기 역시 확장됩니다.
- 정점(Vertex)과 간선(Edge)의 수가 수천만 개에 이르는 초대형 그래프도 무리 없이 지원
- 예를 들어, 정점이 60개, 간선이 60개 이상인 복잡한 그래프도 분산 구조를 통해 안정적으로 저장 및 처리 가능
💡 큰 그래프는 하나의 서버에서는 처리하기 어렵기 때문에, 여러 머신이 협력하는 클러스터 환경이 중요합니다.
✅ 2. 수많은 동시 트랜잭션을 처리 가능
또한 JanusGraph는 동시성 측면에서도 뛰어난 성능을 보여줍니다.
- 동시에 여러 사용자가 데이터 삽입, 수정, 삭제 등을 요청하더라도 병렬로 트랜잭션이 처리됨
- 머신 수가 늘어날수록 동시에 처리 가능한 트랜잭션 수 역시 증가
💬 트랜잭션이란?
트랜잭션은 "완전히 성공하거나, 전혀 적용되지 않아야 하는" 작업의 논리 단위입니다.
예: 은행 이체 → A 계좌에서 출금되고 B 계좌에 입금되어야 완전한 성공. 둘 중 하나라도 실패하면 전체 취소(rollback)
💬 동시 트랜잭션이란?
여러 개의 트랜잭션이 동시에 실행되는 것을 의미합니다.
JanusGraph는 이를 무리 없이 처리할 수 있도록 설계되어 있어 높은 실시간성이 요구되는 환경에도 적합합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
++ 트랜잭션 설명
① 트랜잭션 분기 흐름 (commit / rollback)
💡 개념 요약:
활동(작업) 수행 후, 일부 성공 또는 실패 여부에 따라 커밋 또는 롤백 결정
✅ JanusGraph와의 관계:
- JanusGraph는 기본적으로 트랜잭션 범위 내에서 여러 작업을 모아서 실행한 뒤에,
- 성공: tx().commit()
- 실패: tx().rollback()
- 이는 사용자 코드에서 선택적으로 적용할 수 있습니다.
예시 (Java):
Gremlin 콘솔에서도 같은 구조로 동작:
- 자동 커밋 설정 여부에 따라 달라지며, 명시적 g.tx().rollback() 또는 .commit()도 가능
📌 부분 성공 상태는 최종 커밋이 이루어지기 전까지는 "비영속 상태"로 처리됩니다.
② 트랜잭션의 원자성 + 롤백 처리
💡 개념 요약:
하나의 트랜잭션이 여러 단계로 구성되어 있고, 하나라도 실패하면 전체가 롤백됨
✅ JanusGraph와의 관계:
- JanusGraph는 Gremlin 쿼리 단위로 트랜잭션을 구성합니다. (예: g.addV().property(...))
- 각 쿼리는 내부적으로 여러 단계를 포함하고 있으며, 이 중 하나라도 실패하면 전체 작업이 롤백됨.
- 예를 들어 정점 추가 → 간선 연결 → 속성 추가 중 하나가 실패하면 전체 작업은 무효화됩니다.
기술적으로:
- JanusGraph는 자체적으로 트랜잭션 객체 (JanusGraphTransaction)를 관리하며,
- 커밋(commit) 또는 롤백(rollback)은 다음과 같이 명시함:
-
graph.tx().commit(); // 성공 시
-
graph.tx().rollback(); // 실패 또는 예외 시
📌 데이터 일관성을 보장하며, 복잡한 Gremlin 쿼리를 안전하게 실행할 수 있는 기반입니다.
③ 트랜잭션 직렬화 처리
💡 개념 요약:
여러 트랜잭션이 동시에 들어오더라도 내부에서는 직렬화하여 하나씩 처리됨 (2번, 3번, 1번 순 등)
✅ JanusGraph와의 관계:
- JanusGraph는 멀티 유저 환경에서 트랜잭션을 처리할 수 있도록 설계되어 있음.
- OLTP 쿼리(Gremlin) 실행 시, 그래프의 정점/간선에 대한 쓰기 연산은 직렬화(Serialize) 되어야 함.
- 내부적으로는 락(lock) 기반 혹은 버저닝 기반의 직렬화 전략을 통해 일관성을 유지.
- BerkeleyDB, Cassandra, HBase와 같은 백엔드가 병렬성을 제공하지만, JanusGraph는 그 위에서 직렬성 보장 메커니즘을 구현함.
📌 동시에 여러 사용자가 Gremlin 쿼리를 실행해도 정합성 있는 결과를 보장하는 핵심이 이 구조입니다.
✅ 보너스 팁: OLTP와 OLAP의 트랜잭션 처리 차이
- OLTP (Gremlin 실시간 쿼리):
- 위의 트랜잭션 구조와 동일하게 적용됨 (ACID 보장)
- OLAP (Spark/Hadoop 기반 분석):
- 트랜잭션이 아니라 일괄 처리(batch processing) 기반 → 롤백 불가
- 대신 읽기 일관성과 분석 정확성에 중점