좋은 기회로 배달의 민족 우아콘의 입장권을 양도받았다. 백엔드로 가서 들을 예정인데 모르는 내용이 많아 사전공부를 하고 가려고 한다.
이번 사이드 프로젝트에서 채팅을 맡았으므로 채팅 예제로 설명하겠다.
메시지 스트림의 논리적 그룹이며 이를 여러 파티션으로 나눠 저장해 하나의 토픽이 병렬 처리되도록한다.
즉 1개의 채팅방이 1개의 토픽이라 생각하면 된다.
파티션은 토픽안에서 여러 파티션으로 나눠 저장한다고 생각하면 된다. 예를 들어 벨로그 채팅방이 있다면 A사용자는 A파티션을 B사용자는 B파티션, C사용자는 C 파티션을 사용해서 각각의 데이터를 저장하는 병렬처리 방식이다.
또한 각 파티션 안에는 오프셋이라는 고유번호가 있어서 메시지는 순서대로 저장된다.
클러스터는 여러 카프카 브로커로 구성된 서버그룹이다. 데이터를 분산저장하고, 장애발생시에도 데이터의 가용성을 유지하며, 높은 처리량을 확보한다.
즉 5개의 브로커가 있는 클러스터에 토픽 1개가 생성되고 이 토픽에는 3개의 파티션이 있다고 생각하면 3개의 파티션은 5개의 브로커에게 분산 저장된다!
메시지를 생성해서 특정 토픽에 게시하는 역할이다. 예를 들어 백엔드라는 주제에 게시하는 역할을 한다.
원하는 주제를 구독해서 해당 주제의 메시지만 수신한다.
발행자와 구독자 간의 연결고리 역할을 하며, 각 메시지는 특정 주제에 게시된다. 그래서 발행자와 구독자는 서로의 존재를 몰라도 주고받을 수 메시지를 주고받을 수 있다.
이벤트 브로커는 이벤트를 저장하고 관리하는 역할이다. 메시지를 즉시 삭제하지 않고 오랜기간 저장할 수 있다.
그래서 사용자는 장애로 인해 이벤트를 놓쳐도 필요한 시점부터 다시 읽고 처리가 가능하다.
반대로 메시지 브로커는 메시지를 큐에 넣어 소비자가 읽으면 즉시 삭제된다.
특징 | 메시지 브로커 | 이벤트 브로커 |
---|---|---|
데이터 저장 | 메시지를 즉시 큐에서 삭제 | 메시지를 디스크에 저장하여 보관 |
재처리 지원 | 메시지 재처리 어려움 | 특정 시점부터 메시지를 다시 소비 가능 |
대용량 처리 | 제한적, 실시간 전송에 적합 | 대용량 데이터 처리와 저장에 적합 |
사용 예시 | RabbitMQ, Redis | Kafka, AWS Kinesis |
가장 궁금한 부분인데, 분산락은 여러 시스템에서 동시에 접근하는 리소스를 보호하고, 데이터 일관성을 유지하기 위해 사용된다. 동시에 여러 프로세스에서 수행될 때 발생할 수 있는 데이터 충돌과 동시성 문제를 방지할 수 있다.
창고관리 시스템으로, 재고, 입출고, 위치관리 , 작업계획 등 창고 운영을 효율적으로 관리하는 시스템이다.
내가 가장 궁금한건 동시성이다. 예를 들어서 사용자 2명이 한개의 상품을 동시에 결제한다면 ?
예를 들어서 1개의 재고만 있는 상품을 두명이 결제를 성공해버리는 상황은 어떻게 막아야할까
행 레벨 락 : 특정 상품의 재고를 업데이트 할 때 해당 행을 잠그는 방식이다. 예를 들어 결제 과정에서 재고 수량을 업데이트 할 때 데이터 베이스가 해당 행에 락을 걸어 다른 트랜잭션이 접근하지 못하도록 하는 방법이다.
낙관적 락 : 재고를 업데이트할 때 현재 버전 번호를 확인한 후, 업데이트 시 버전 번호가 동일하면 성공하고, 다르면 실패하게 한다. 예를 들어, A와 B가 동시에 재고가 1인 상품에 접근했을 때, A가 먼저 재고를 0으로 업데이트하며 버전 번호를 올린다. B가 이후에 같은 상품에 접근해 업데이트를 시도하지만, 버전 번호가 달라졌기 때문에 업데이트가 실패한다.
마지막으로 0원으로 관리하는 클라우드 비용까지 그동안 궁금했던 내용을 많이 배울 수 있을 것 같다!