진행중인 프로젝트에서 일정을 추가하고 일정에 대한 정보를 API 요청을 통해 서버에 저장하려고 해요. 그런데 일정을 추가했을 때 네트워크 연결 상태 등 에러가 발생할 수 있잖아요?
이때 어떻게 할 지 고민을 하다가 UX 관점에서는 유저가 일정을 추가했는데 프로그레스바를 보여주면서 다른 작업을 못하게 막는 것은 안 좋다 생각했어요. 그래서 앱에서는 일정이 추가된 것처럼 보이고 나중에 네트워크 연결 등의 문제가 해결됐을 때 API를 요청하게끔 짜면 되겠다 생각을 했죠.
프로젝트를 같이 진행중인 지인에게 이에 대해 말했을 때 DLQ(Dead Letter Queue)를 구현해보면 되겠다 해서 이번에는 DLQ에 대해 알아보려고 해요
DLQ는 처리되지 못한 메시지를 보관하는 큐로 메시지 큐 시스템에서 실패한 메시지나 반복적인 오류가 발생한 메시지를 따로 저장해서 재처리할 수 있도록 도와주는 역할을 합니다. 지금 저의 상황에 필요한 기능이에요
DLQ는 위에서도 말했듯이 메시지가 정상적으로 보내지지 않았을 때 필요한데 예시 상황으로는 다음과 같아요
DLQ의 구조는 다음과 같이 메인 큐에서 작업하다 실패한 메시지를 저장하는 단순한 구조에요
[Producer] → [Main Queue] → [Consumer]
↓ (처리 실패)
[Dead Letter Queue (DLQ)]
DLQ를 사용했을 때 장점은 다음과 같아요
장점이 있으면 단점이 있겠죠? 단점은 다음과 같아요
2,4번을 제외한 1,3번의 경우 개발자가 번거로운거 뿐이지 성능에 영향을 끼치진 않는 거 같아요
위에서도 언급했듯이 DLQ는 실패한 메시지를 저장하는 공간이기 때문에 정해진 구현 방법은 없어요.
현재 저의 프로젝트는 Core Data를 사용하기로 해서 Core Data에 실패한 메시지를 저장할 것 같아요. 특히 네트워크 연결 상태로 인해 실패한 메시지만 저장할건데 나중에 네트워크가 연결 되면 Core Data에 저장된 실패 메시지들을 API 요청을 하는 식으로 구현하고, 성공하면 Core Data에서 실패 메시지를 제거해서 불필요한 데이터를 제거할 거에요.
이러려면 네트워크 상태를 확인해주는 기능이 있어야겠죠? 그래서 다음에는 네트워크를 감지해주는 NWPathMonitor에 대해 공부해보려고 해요