1. 목적
트래픽과 사용자 증가에 대응 가능한 시스템을 설계하고자 합니다.
2. 로드 밸런서 사용
ELB와 ALB는 다릅니다. ELB는 TCP/IP 계층과만 통신하는 L4지만 ALB는 L7입니다. 따라서 IP와 포트뿐 아니라 HTTP 등의 프로토콜도 인식할 수 있습니다. 특히 ALB를 사용하면 특정 경로에 대한 요청을 특정 서버로 라우팅할 수 있습니다.
ALB에 대해 보다 자세히 얘기하면 API 요청을 분리하여 개별 서비스로 갈 수 있도록 할 수 있습니다.
3. 오프라인 & 비동기 처리
실시간으로 처리하지 않도록 변경하는 것이 핵심입니다. 대표적인 예는 좋아요 버튼입니다. 좋아요 버튼을 누르면 클릭 아이콘의 색상이 바로 변경되지만 그 외의 작업(게시자에게 본인에게 좋아요가 클릭되었다는 사실 전달, 게시물의 내부 점수 상승 등)은 나중에 발생할 수 있습니다. 앱 내부에서는 관련된 메시지를 큐에 전달하게 되고, 다른 시스템은 큐의 내용을 읽어 관련 정보를 처리하게 됩니다. DB 작업도 응용과 DB 중간에 큐를 두면 일정한 패턴을 유지할 수 있습니다.
AWS에서 큐를 사용하기 위한 옵션은 SQS와 키네시스 등이 있습니다.
SQS | 키네시스 |
완전 관리형 Pull 방식 서비스 | 대규모 데이터의 실시간 처리 (스트리밍 수집 서비스) |
신뢰성 (여러 AZ에 걸친 메시지 저장 확장성 (수백만의 메시지를 저장, 대응) 처리량 (메시지 증가에도 지속적인 처리량) 비용 (매월 무료 제공 + 종량제) |
대규모 데이터의 실시간 처리 (스트리밍 수집 서비스) 처리량 (데이터 스트림 내 샤드 수 증가로 확장 가능) 비용 (샤드 당 시간당 비용 + 페이로드) |
메시지의 순서 보장은 없음 적어도 한번은 메시지 전달이 보장되지만 두번 이상도 전달 가능 단, FIFO 대기열 사용하면 순서 보장 + 1회 전달 보장 |
기본적으로 24시간 보관, 최대 7일 보관 가능 리전당 샤드 수 소프트 리밋 기타 샤드 당 용량 제한 존재하니 확인 필요 |
메시지마다 확인/실패가 필요한 경우 수신자에게 Push 기능은 없으므로 Pull 처리 필요 하나의 메시지가 여러 수신자에게 전달 불가 |
로그, 모바일, 클릭 스트림 수집/분석 실시간 분석 처리된 메시지를 다른 앱이 다시 처리 |
4. 서버리스
EC2는 가상화된 호스트 서비스이기 때문에 운영체제 및 확장에 대한 고민이 필요하다. 그러나 람다는 가상화이긴 하나 그런 고민을 할 필요가 없다. Node.js, 파이썬, 자바, C# 등 함수(펑션)라고 불리는 코드를 생성한 후 실행할 수 있다. 그리고 람다는 코드 파이프라인, S3, 키네시스 등 많은 서비스와 통합된다.