RailsEventStore의 배치 매퍼 - 초기 아이디어가 실험적 기능으로 발전한 과정

Batch mapper in RailsEventStore - how initial idea evolved into experimental feature | Arkency Blog

작성자
발행일
2025년 06월 09일

핵심 요약

  • 1 RailsEventStore에서 암호화된 이벤트 처리 시 발생하는 성능 문제를 해결하기 위해 배치 매핑 개념이 도입되었습니다.
  • 2 기존의 단일 이벤트 처리 방식 대신 배치 단위로 이벤트를 처리하여 외부 KMS 호출 횟수를 획기적으로 줄였습니다.
  • 3 이 기능은 RailsEventStore의 실험적 기능으로 추가되었으며, 기존 매퍼와의 하위 호환성을 유지하면서 성능 개선을 이루었습니다.

도입

RailsEventStore를 사용하는 개발자들이 암호화된 도메인 이벤트를 처리할 때 심각한 성능 문제에 직면했습니다. 이 문제의 근원은 RailsEventStore의 `EncryptionMapper`가 각 이벤트를 암호화/복호화하거나 심지어 각 속성을 처리할 때마다 키 저장소에 암호화 키를 요청하는 방식에 있었습니다. 특히, 키 저장소가 외부 KMS(Key Management System)에 위치하여 네트워크를 통한 API 호출이 매번 필요했기 때문에, 수많은 도메인 이벤트를 처리할 때마다 발생하는 빈번한 네트워크 통신이 시스템 전반의 성능 저하를 야기했습니다. 모든 키를 메모리에 미리 로드하거나 캐싱하는 방법도 대규모 이벤트 및 키 수에서는 메모리 오버헤드나 캐시 관리의 복잡성으로 인해 실용적인 해결책이 아니었습니다. 이러한 배경 속에서, 기존의 단일 이벤트 처리 방식의 한계를 극복할 새로운 접근 방식의 필요성이 대두되었습니다.

이러한 성능 병목 현상을 해결하기 위해, RailsEventStore 사용자인 Bert는 배치 매핑(batch mapping)이라는 혁신적인 개념을 제안하며 RailsEventStore에 PR을 제출했습니다. 이 아이디어는 기존 매퍼가 이벤트를 하나씩 처리하는 대신, 이벤트들을 묶음(batch)으로 처리하여 변환 전에 일괄적으로 처리할 수 있도록 하는 것이었습니다. RailsEventStore는 이미 데이터베이스에서 데이터를 배치 단위로 읽어오고 있었으므로, 이 읽어온 데이터를 배치 단위로 변환하는 것은 자연스러운 확장이었습니다. 기존 매퍼의 record_to_event(record)event_to_record(event) 메서드 대신, 새로운 records_to_events(records)events_to_records(events) 메서드가 도입되어 이벤트 배치를 한 번에 처리할 수 있게 되었습니다. 이 아이디어는 내부 테스트를 거쳐 RailsEventStore의 실험적 기능으로 채택되었습니다. 개발팀은 하위 호환성을 최우선으로 고려하여, 기존의 단일 항목 처리 매퍼가 제공될 경우 RubyEventStore::Mappers::BatchMapper로 자동 래핑되도록 구현했습니다. 이 래퍼는 내부적으로 기존 단일 처리 매퍼를 사용하여 실제 작업을 수행하면서도 배치 처리 인터페이스를 제공합니다. 반면, 개발자가 이미 배치 처리를 구현한 매퍼를 제공하는 경우에는 해당 매퍼가 그대로 사용되어 불필요한 래핑을 피합니다. 이러한 유연한 설계 덕분에, CustomEncryptionMapper와 같은 사용자 정의 매퍼는 records_to_eventsevents_to_records 메서드 내에서 배치 단위로 필요한 키를 KMS 시스템으로부터 한 번에 가져올 수 있게 되었습니다. 이는 각 도메인 이벤트마다 API 호출을 할 필요가 없게 만들고, 모든 키를 미리 가져올 필요도 없게 하여, KMS 호출 횟수를 획기적으로 줄이고 전체적인 데이터 처리 성능을 대폭 향상시키는 결정적인 해결책이 되었습니다.

결론

배치 매퍼 기능의 도입은 RailsEventStore에서 암호화된 도메인 이벤트 처리 시 발생하는 고질적인 성능 문제를 성공적으로 해결했습니다. 이로써 외부 KMS와의 통신으로 인한 오버헤드가 크게 줄어들고, 대규모 데이터 환경에서도 효율적인 이벤트 처리가 가능해졌습니다. 현재 이 기능은 실험적 단계에 있으며, RailsEventStore 개발팀은 사용자들의 피드백을 적극적으로 수렴하여 API의 안정성을 확보하고 기능을 더욱 개선해나갈 계획입니다. 개발자들은 이 새로운 기능을 활용하여 기존 시스템의 성능을 최적화하고, 각자의 환경에 맞는 유연한 키 캐싱 전략을 구현함으로써 더욱 견고하고 효율적인 애플리케이션을 구축할 수 있을 것입니다. 이는 RailsEventStore의 발전과 함께 Ruby 기반의 이벤트 소싱 아키텍처를 사용하는 프로젝트에 큰 이점을 제공할 것으로 기대됩니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!