Search
Duplicate

#1 분산처리 시스템 구조개선

이미지
tech_push.png
기술 Stack
Kafka
Docker
MSA
안녕하세요, 사람인HR Tech Sourcer 이승빈입니다
앞으로 총 네 편의 개발 큐레이션을 통해 사람인HR의 대표적인 백엔드, 프론트엔드 기술 스택을 소개해드릴 예정인데요. 먼저 비유를 통해 기술의 이해를 돕고 시스템의 역할과 구축을 위해 사용된 기술 스택을 소개하는 순서로 구성하였습니다. 큐레이션을 통해 비개발자분들은 간략하게나마 사람인HR의 기술을 살펴보고 개발자분들의 경우 구체적인 기술스택을 통해 사람인HR을 더 이해할 수 있는 계기가 되기를 희망합니다!
첫 번째 포스팅의 주제는 2019년부터 구조를 개선하고 꾸준히 고도화 중인 서비스인프라개발팀의 ‘대용량 push 메시지 생성 시스템'입니다.

Story

대용량 Push 메시지 생성 시스템은 세 가지 도메인으로 나누어볼 수 있어요.
관리자 기계
스케줄러 기계
에이전트 기계
기존에는 세 기계가 이어져 작동하고 있었지만, 이는 일부의 고장이 전체의 고장을 야기했습니다. 그렇기 때문에 Docker를 사용해 세 기계를 분리하고 분리된 기계의 통신 방법으로는 Kafka를 사용하여 MA → MSA 방식으로 구조를 전환했어요.

대용량 Push 메시지 생성 시스템

대용량 Push 메시지 생성 시스템이란 사용자분들의 필요에 따라 적절하게 알림 메시지를 전송하는 기술입니다. Story의 프로세스처럼 MSA 구조상에서 Docker로 나누어진 엔진 도메인들이 각각 Kafka를 매개체로 다음과 같은 과정을 거치게 돼요.
1.
관리자는 캠페인의 정보를 등록하여 스케줄러에 전달 (관리자 → 스케줄러)
2.
스케줄러는 관리자가 전달한 정보를 수신하고 스케줄을 등록하여 에이전트에게 전달 (스케줄러 → 에이전트)
3.
에이전트는 스케줄러가 전달한 정보를 수신하여 적절한 사용자를 탐색하고 알림 메시지를 생성하여 전송 (에이전트의 주요 업무 수행)
사람인에서는 채용 정보 제공, 커뮤니티, 각종 이벤트 등 다양한 서비스를 운영하고 있는데요. 서비스를 이용하면서 발생하는 알림 메시지의 예시는 다음과 같습니다.
스크랩한 공고가 마감 기한이 얼마 남지 않았을 때
커뮤니티에 등록한 본인의 글에 답글이 등록되었을 때
진행 중인 이벤트의 결과가 발표되었을 때
사용자분들이 자신과 관련된 사람인의 다양한 콘텐츠를 실시간으로 가장 쉽게 받아볼 수 있도록 위와 같은 알림 메시지로 생성, 전송되고 있습니다. 서비스인프라개발팀은 이처럼 사용자분들에게 어떻게 하면 쉽고 편리하게 서비스를 제공하면서 안정적으로 시스템을 동작하고 유지할 수 있는지 끊임없이 고민하고 발전시켜나갈 계획을 연구하고 있어요.

시스템 구축에 사용된 주요 기술 스택

Monolithic Architecture(MA) → Micro Service Architecture(MSA)
Monolithic Architecture(MA)란 모든 로직이 하나의 서비스 내부에 종속되어있는 구조입니다. 하나의 서비스만 개발하면 되기 때문에 서비스를 테스트하고 배포하는 것 역시 간편합니다. 하지만 내부 요소 간 의존성이 강하여 기술의 혼용이 어렵고 일부분의 오류가 전체에 영향을 미칠 수 있습니다. 서비스의 규모가 커질 경우에는 작은 변동사항에도 전체를 테스트해야 하므로 빌드와 배포의 시간이 오래 걸려 비효율적입니다. 코드가 몰려있어 이해하기 어렵고 유지보수가 힘들기 때문에 작은 서비스에 유리한 방식입니다.
Micro Service Architecture(MSA)란 작은 서비스 여러 개가 모여서 하나의 시스템을 제공하는 구조입니다. 각 서비스는 결합성이 낮아 독립적으로 개발하고 배포할 수 있으며 하나의 서비스에 문제가 발생하더라도 전체 시스템에 영향을 끼치지 않습니다. 하지만 분리된 서비스 간에 통신 방법의 필요가 수반되고 관리 및 배포 역시 복잡합니다.
Docker
Docker란 소프트웨어를 서버에 구애받지 않고 실행시키기 위해 필요한 환경을 신속하게 구축하고 배포해주는 플랫폼입니다. 컨테이너화된 각 영역은 프로세스로써 독립적으로 실행되어 한 곳에서 장애가 발생하더라도 서로 영향을 끼치지 않습니다. 시스템을 분리된 서비스로 개발하는 MSA 방식에서 유용한 도구입니다.
Kafka
Kafka란 분산 데이터 스트리밍 플랫폼으로 프로세스 간 데이터 교환 통신 방법인 메시지 큐의 한 종류입니다. Memory를 주로 사용하는 다른 메시지 큐 시스템과 달리 Kafka는 논리적으로 연결된 순서에 따라 블록을 읽어 들이는 방식으로 Seek time을 최소화하면서 Disk를 기반으로 한 데이터 스트리밍 처리 방식이기 때문에 상대적으로 느린 문제점을 보완하면서 동시에 시스템 일부 구성 요소가 작동하지 않더라도 계속 작동할 수 있는 내결함성의 특성을 가지는 메시지 전송의 안정성을 보장하는 기술입니다.
구조 개선의 결과
메시지 전송 손실 비율 0%
Push 생성 시간 감소
빌드, 배포, 구동 시간 약 70% 감소
도메인 별 자유로운 운영 가능
기술의 종류를 막론하고 규모가 커짐에 따라 구조의 전환과 개선은 필수 불가결한 과정입니다. 전통적인 MA 방식에서 MSA 구조로의 전환에 대한 개발 가치관이 있거나 Kafka와 같은 통신, Docker와 같은 배포 오픈소스에 관심이 있는 개발자라면 상단에 표기된 기술블로그를 둘러보는 것을 추천해 드립니다.
개발에 사용되는 기술 스택의 개념을 위주로 비개발자를 포함하여 큐레이션을 읽어주시는 모든 분이 이해하기 쉽도록 작성하기 위해 앞으로도 계속해서 노력하겠습니다. 다음 포스팅에서는 쿠버네티스 인프라를 기반으로 한 CI/CD 운영 방식을 소개해드리겠습니다. 앞으로도 사람인HR 피플팀의 개발 큐레이션 많은 관심 부탁드립니다.

출처 및 참고 사이트

기술블로그에서 더 자세한 내용 확인하기