MSA와 모놀리틱은 서비스의 구조와 관리 방식에서 차이가 있다고 생각합니다.
우선, 모놀리틱 아키텍처는 하나의 애플리케이션 안에 모든 기능이 통합된 구조로
초기에 개발 속도가 빠르고 배포와 테스트가 간단하다는 장점이 있지만
소스코드가 커질수록 유지보수가 어렵고, 일부 수정 사항이 있다면 전체 애플리케이션이 재배포되어야 한다는 단점이 있습니다.
MSA는 애플리케이션을 독립된 작은 서비스들로 나누어 관리되는 구조로
서비스 단위로 독립 배포 및 확장이 가능하고, 특정 서비스에 대한 문제 해결이 빠르다는 장점이 있지만
서비스 간의 통신이 복잡하고, 배포와 모니터링의 도구가 필요하다는 단점이 있습니다.
모놀리틱과 MSA는 애플리케이션의 확장성과 유지보수성을 고려하여 아키텍처를 선택하는 것이 좋습니다.
Eureka는 Netflix에서 제공하는 MSA 환경에서 서비스간 통신을 효율적으로 관리하기 위해 사용되는 서비스 디스커버리 도구입니다.
각각의 서비스는 Eureka 서버에 등록되어 필요한 서비스의 위치를 동적으로 검색할 수 있어 하드코딩 없이 서비스 간의 통신이 가능합니다.
서비스를 여러개의 인스턴스로 나누어 많은 요청들을 균등하게 분산할 수 있기 때문에 부하를 줄일 수 있습니다.
Eureka만의 차별점으로는 우선 Netflix의 MSA 사례를 기반으로 설계되어있기 때문에 Java, Spring 환경에 최적화되어 있고, 간단하고 경량화된 구조로 Spring Cloud와의 호환성이 좋습니다.
경쟁 상태(Race Condition)는 예를들어 두 사용자가 동시에 같은 상품을 구매할 때 재고가 잘못 줄어드는 상황과 같이 여러개의 프로세스 또는 스레드가 동시에 공유 자원에 접근하여 예상치 못한 결과가 발생하는 상황을 말하며
트랜잭션과 락을 활용하여 문제를 해결할 수 있습니다.
교착 상태(Deadlock)는 예를들어 프로세스 A는 자원 1을 점유하고 자원 2를 기다리고, 프로세스 B는 자원 2를 점유하고 자원 1을 기다리는 상황처럼 서로의 자원을 기다리면서 영원히 실행되지 못하는 상태를 말하며
자원 요청 순서를 정하거나 타임아웃을 설정해 교착 상태를 방지하고, 교착 상태가 감지되었다면 트랜잭션을 롤백하여 해결할 수 있습니다.
동시성 문제는 여러 프로세스나 스레드가 동시에 공유 자원에 접근할 때 발생하는 충돌 문제를 말하며 두 개 이상의 프로세스가 동일한 데이터를 동시에 읽거나 쓰게되면 발생하는 데이터 경쟁과, 트랜잭션의 일부만 실행되고 중단되어 데이터의 불일치가 발생하는 원자성 문제가 있습니다.
이를 해결하기 위해 락(Lock)을 사용하여 공유 자원에 대한 동시 접근을 제어하거나, 트랜잭션의 ACID 특성을 활용하여 원자성을 보장하는 등의 여러가지 방법들이 있습니다.
DB의 인덱스란 데이터를 빠르게 검색하기 위해 사용되는 데이터 구조를 말하며 특정 데이터를 찾는데 필요한 시간을 효과적으로 줄여주고 WHERE, JOIN, ORDER BY와 같은 쿼리의 성능을 개선시킵니다.
복합 인덱스(Composite Index)는 두 개 이상의 열을 기반으로 생성된 인덱스를 말하며 ORDER BY first_name, last_name
과 같이 두개의 컬럼을 묶어서 인덱스를 생성하기 때문에 다중 열로 검색할 때 효율적입니다.
커버링 인덱스(Covering Index)는 쿼리에 필요한 모든 데이터가 인덱스에 포함되어 테이블을 추가로 조회하지 않아도 되는 인덱스를 말하며 SELECT문에서 조회하는 모든 열이 인덱스에 포함된 경우 디스크 I/O를 줄여 쿼리의 성능을 극대화 시킬 수 있습니다.
인덱스는 성능을 향상시키지만, 너무 많은 인덱스를 생성하게되면 쓰기 작업이 느려지고, 저장 공간을 많이 차지할 수 있기 때문에 균형 잡힌 설계가 필요합니다.