본문 바로가기

분류 전체보기62

[BE] RabbitMQ 장애 - 메시지 중복 처리, 메모리 부족, 디스크 공간 부족 저번 글에서 잠시 다루었지만, RabbitMQ를 쓰다보면 만날 수 있는 대표적인 장애 시나리오이다. 1. 메시지 중복 처리메시지를 최소 한 번 이상 전달을 하기 위해서는 ack 신호를 메시지 브로커에 전달해야 한다.하지만 메시지를 소비한 이후, 장애가 발생하여 ack 신호를 메시지 브로커에 전달하지 못하는 경우가 있다.이런 경우 메시지 브로커는 큐에서 해당 메시지를 제거하지 않는다.서버는 장애에서 회복된 후, 서버에서 메시지를 새로 꺼내서 소비하게되고 이런 시나리오에서 중복 처리가 발생할 수 있다. 2. 메모리 부족큐에 쌓이는 메시지가 처리되는 메시지보다 많을 경우, 특히 non-persistent의 경우많은 수의 연결과 채널이 존재하는 경우 메모리 부족 문제가 발생할 수 있다.메시지를 가능한 한 디스크.. 2025. 6. 5.
[BE] RabbitMQ 장애 - 메시지 유실 RabbitMQ는 설정이 간편하면서도 강력한 성능을 보여주는 메시지 브로커이다. 메시지, 큐의 디스크 저장으로 프로세스에 장애가 발생해도 발행된 메시지를 복원할 수 있다.또한 큐에서 소비자에게 전달된 메시지를 확인하는 메커니즘을 통해 최소 한 번 이상의 메시지 전달을 보장한다.네트워크 문제나 장애 상황 등 다양한 이유로 이 보장이 깨지거나, 실제로는 유실된 것처럼 보이는 상황이 발생한다. 1. 메시지 유실1) Producer(발행자) 측면[시나리오1] Publisher Confirms 미사용 또는 처리 미흡발행자가 메시지를 RabbitMQ 브로커로 전송했지만, 네트워크 문제로 메시지가 브로커에 도달하지 못했다.Publisher Confirms 메커니즘을 사용하지 않으면, 발행자는 이 사실을 알지 못하고 .. 2025. 6. 5.
[BE] Publish & Subscribe 구조 요즘 구현 중인 알림 기능을 만들며 조금 더 자세히 Pub/Sub 구조에 대해 고민하고 있다. 하나의 JVM 프로세스에서 호출되는 함수와 변수들은 메시지를 통해 내부 프로세스의 함수나 변수에 바로 접근할 수 있다.JVM의 Method Area에서 상수와 함수들을, Heap에서 인스턴스들을 호출하고 그 결과를 바로 사용한다. 하지만 MSA와 같이 다른 프로세스로 분리된 서비스에선 이 역할을 네트워크를 통해 수행해야 한다.보통 API 등을 호출하거나 위와 같이 메시지를 발행하고 소비하는 패턴을 사용해서 다른 서비스의 함수를 호출하게 된다. 내가 알림 기능을 이 구조로 변경해야겠다고 마음먹은 것은 과거에 있었던 운영자 기능의 공지사항 생성 시 알림 기능 때문이다.당시에는 서버 사용자가 100명 미만이었기 때문.. 2025. 6. 4.
[알고리즘] 문제 분석 이직을 위해 필수적인 코딩테스트 준비...나는 사고속도와 손이 느린 편이어서... 이런 빠르게 해결해야하는 문제에 상당히 약한 편이다.특히 문제를 풀 때, 초기에 조건을 하나 놓치는 경우 치명적이다. 내가 알고리즘 공부를 위해 선택한 책에서는 문제 분석에 10-15분 투입하는 것을 아까워하지 말라고 가장 처음부터 조언한다.문제를 잘 읽고, 초기에 구상한 해결방안의 시간/공간 복잡도를 계산해서 이렇게 코드를 진행할 것인지 결정한다. 정말 맞는 말인데, 지키기가 가장 어렵다.나는 이런 얘기할 일이 없을 줄 알았는데, 문제를 잘 읽는 것이 무엇보다도 어렵다.나이를 먹을수록 자기 얘기만 하는 경향이 생긴다고 하는데, 내가 벌써 그렇게 되는건가 걱정이 마구마구 샘솟는다. 내가 생각하는 나의 문제풀이 중 가장 큰.. 2025. 6. 3.
[FE] Lazy Loading & Code Splitting & Tree Shaking 프론트엔드 성능 최적화와 관련된 이야기가 나올 때, 자주 언급되는 개념들이다. 1. Lazy Loading필요한 js 파일은 필요할 때 불러오자는 개념이다.스크립트 로드 위의 html에서 스크립트 로드라는 버튼을 클릭했을 때, js파일을 html에 삽입한다.삽입된 js파일은 브라우저에 의해 다운로드되고, 브라우저에서 해당 스크립트 태그가 로드되면 특정 함수를 시작할 수 있다.이처럼 무거운 js나 css 파일, 그 외 무거운 리소스들을 필요할 때 불러오는 개념이 지연 로딩이다. 2. Code Splitting코드 스플리팅은 코드를 기능별, 모듈별로 잘 나눠서 필요할 때 필요한 파일만 불러와서 쓸 수 있게 만드는 기법이다.위의 lazy-script.js 파일처럼 사용자가 필요한 시점에 불러올 수 있는 js .. 2025. 6. 3.