요구 사항 고려한 기술 선택지 비교 기술 선택 이유
로그 모니터링을 위한 Elastic Stack 구성 **선택한 기술
▶** Beats - Elasticsearch - Kibana

선택지 ▶ Beats - Elasticsearch - Kibana Logstash - Elasticsearch - Kibana Beats - Logstash - Elasticsearch - Kibana | Beats - Elasticsearch - Kibana - 경량화된 로그 파일 수집 에이전트 사용

Logstash - Elasticsearch - Kibana - 다양한 소스에서 직접 수집, 변환 및 전송 가능

Beats - Logstash - Elasticsearch - Kibana - Beats로 수집하고 Logstash로 변환 후 전송

| 본 프로젝트는 로그의 변환 과정이 필요하지 않기 때문에, 자원을 거의 소모하지 않는 경량화된 에이전트인 Beats를 사용하여 로그를 수집하기로 결정하였습니다. | | 실시간 데이터 유저에게 전달 | 선택한 기술 Apache Kafka - Redis(Pub/Sub)

선택지 Apache kafka - RabbitMQ | Kafka-Redis

~~Kafka-RabbitMQ~~

현재 실시간 데이터의 처리를 우선시하며 그 후 유저에게 전달하는 과정을 userId 별 websocket 으로 전달하는 방식으로 구현하고자 하였다.** | | 성능 테스트 | 선택한 기술 Apache Jmeter

선택지 PinPoint | Apache JMeter - 다양한 프로토콜을 지원하여 대규모 트래픽 모방 가능

PinPoint

선택지 ▶ QueryDSL | Elasticsearch Elasticsearch는 분산형 검색 엔진으로, 대용량 데이터를 빠르게 처리하고 텍스트 기반 검색에서 매우 뛰어난 성능을 보입니다. 역색인 구조를 사용해 복잡한 검색 쿼리를 실시간으로 처리할 수 있으며, 확장성이 높아 대규모 데이터셋에서도 높은 성능을 유지합니다.

QueryDSL QueryDSL은 타입 안전한 쿼리 작성을 위한 Java 기반 라이브러리로, JPA와 함께 사용되며 동적 쿼리 작성에 용이합니다. 주로 RDBMS와 결합해 사용되며, SQL과 유사한 방식으로 복잡한 조건 검색을 수행할 수 있습니다. | Elasticsearch는 대용량 데이터를 빠르게 검색하는 데 최적화되어 있으며, 특히 Dart API 를 통한 대용량의 공시 자료를 선택적으로 인덱싱할 수 있기 때문에 선택되었습니다. 대용량 데이터 처리에서 확장성과 성능을 고려할 때, Elasticsearch는 분산 아키텍처를 통해 복잡한 검색 요구 사항을 충족시킬 수 있습니다. | | 종목 조회 성능 개선 | 선택한 기술 ▶ Redis | Redis는 메모리 기반의 비관계형 데이터베이스로, 빠른 데이터 조회와 낮은 지연 시간을 제공하는 키-값 저장소입니다. 캐시로서 자주 사용되며, 데이터가 메모리에 저장되므로 읽기 및 쓰기 속도가 매우 빠릅니다. 또한, Pub/Sub 기능을 통해 실시간 데이터 스트리밍이 가능하고, 단순한 데이터 구조부터 복잡한 데이터 구조까지 지원합니다. | 종목 조회 성능 개선에서 Redis는 메모리 기반의 특성 덕분에 매우 빠른 조회 속도를 제공합니다. 자주 조회되는 종목 데이터를 캐싱함으로써 실시간 응답성을 확보하고, 데이터베이스의 부하를 줄여 대기 시간을 최소화할 수 있습니다. 특히 낮은 지연 시간고성능 캐싱을 통한 성능 개선이 필요한 경우 Redis는 최적의 선택입니다. | | Scheduler 의 데이터 처리 작업 개선 | 선택한 기술 ▶ Spring batch

선택지 ▶ AWS Lambda | Spring Batch 특징: Spring Batch는 대용량 데이터 처리를 위한 프레임워크로, 배치 작업을 효율적으로 관리하고 재사용 가능한 구성 요소를 제공합니다. Tasklet 기반으로 작업을 단순한 단계로 나눠서 처리할 수 있으며, 트랜잭션 관리, 로깅, 재시작 기능을 통해 안정적인 배치 처리가 가능합니다.

AWS Lambda 특징: AWS Lambda는 서버리스로서, 이벤트 기반으로 자동 스케일링되는 무상태 함수를 실행합니다. 설정과 관리가 간단하며, 특정 이벤트 발생 시 코드를 자동으로 실행하고 리소스 사용에 따른 비용만 청구됩니다. | Spring Batch는 트랜잭션 관리대용량 데이터 처리에 강점을 가지고 있으며, 특히 Tasklet 기반으로 작업을 세분화해 단계별로 관리하기가 용이합니다. 데이터 처리 작업이 반복적이고 복잡한 경우, Spring Batch는 재시작 기능상태 관리에서 우수한 성능을 발휘하며, 작업의 복잡성을 효과적으로 제어할 수 있기 때문에 선택했습니다. AWS Lambda는 서버리스의 이점이 있지만, 대용량 데이터 처리 및 세분화된 트랜잭션 관리 측면에서 Spring Batch가 더 적합하다고 판단되었습니다. | | Redis 장애 대응 구축 | 선택한 기술 ▶ Redis Sentinel

선택지 ▶ Redis Clustering | Redis Sentinel

Redis Clustering

선택지 ▶ RabbitMQ | Kafka - 대규모 트래픽 처리와 높은 처리량, 내결함성 및 확장성에 강점을 가진 분산형 메시징 시스템.

RabbitMQ

Prometheus Prometheus는 시간별 데이터 수집 및 모니터링에 특화되어, Pull 방식으로 메트릭을 수집하고 시계열 데이터로 저장해 성능 변화를 추적할 수 있습니다.

Grafana Grafana는 다양한 데이터 소스를 시각화할 수 있는 대시보드 툴로, Prometheus와 Elasticsearch와 연동해 성능 데이터를 직관적으로 표현합니다. | 실시간 성능 모니터링, 시계열 데이터 수집, 그리고 시각화에 특화되어 있어, 시스템 성능을 정확하고 효율적으로 추적하고, 직관적으로 분석 및 대응할 수 있도록 해줍니다. ELK Stack과 Metricbeat로 로그 및 시스템 메트릭을 모니터링하고, Prometheus와 Grafana로 시계열 데이터성능 지표를 상세히 분석하는 것이 최적의 선택이었습니다 | | 클라이언트에게 실시간 데이터 송신 방법 | 선택한 기술 ▶ Websocket

선택지 ▶ SSE | WebSocket

SSE (Server-Sent Events) - 단방향 통신을 통해 서버에서 클라이언트로 실시간 데이터를 푸시하는 프로토콜로, 클라이언트는 수신만 가능. | WebScoket 은 TCP 연결을 사용하여 저지연 전송이 가능하면 SSE 는 HTTP 기반으로 연결을 유지해야 하기 때문에 네트워크 지연이 Websocket 보다 클 수 있으며 대규모 트래픽 처리나 빈번한 데이터 업데이트가 필요한 경우에는 Websocket 이 빠를 수 있기에 선택하였습니다. |