IT/대용량 데이터&트래픽 처리

외부 서비스 연동 시 비동기 처리에 대해서

캥거루 2023. 1. 27. 22:35
728x90
반응형

외부 서비스 연동 시 발생할 수 있는 상황

외부 서비스와 연동 시 외부 서비스에 대한 요청이나 응답에 지연이 생길 경우 운영하는 서비스의 전체적인 성능에 영향이 생기게 된다. 이 때 클라이언트의 요청 많아질 경우 서버에서는 해당 요청들에 대해 대기하는 상황이 발생하게 된다. 그렇게 되면 클라이언트는 응답이 빠르게 오지 않아 재요청을 발생시킬 수 있고 그렇다면 더 많은 대기가 발생할 수 있다.

외부 서비스 연동 결과를 즉각적으로 처리해야 하는가?

예를 들어 로그인을 하면 포인트를 적립하는 요구사항이 있다면, 로그인 로직에서 외부 포인트를 적립하는 서비스를 호출한다. 이후 로그인에 성공한 뒤 수 초 이내 포인트를 적립하는 서비스를 호출한다.

다른 예로 주문을 취소하면 푸시알림을 발송하는 요구사항이 있다. 주문 취소 로직에서 외부 푸시 발송 API 를 호출하고, 주문 취소 후에 수 초 이내에 외부 푸시 발송 API 를 호출한다.

--> 이러한 예시들은 사실상 즉각적으로 처리하지 않아도 큰 문제가 되지 않는다.

외부 서비스 연동에 비동기를 고려해보자

그렇다면 별도 쓰레드나 별도 프로세스로 외부 서비스를 연동하여 비동기로 처리하는 것도 고려해보자. 외부 서비스 연동을 비동기로 하게 되면 외부 서비스의 성능 저하가 운영하는 서비스에 영향을 주는 것을 줄일 수 있다. 그렇게 되면 사용자에게 일정 수준의 품질을 제공할 수 있게 된다.

비동기 처리 방식 3가지

  1. 별도 쓰레드를 사용하는 방법
    외부 연동 코드를 별도 쓰레드로 실행하는 것이다. 구현이 쉽지만 트랜잭션 처리에 대한 방법을 강구해야 한다. 보통은 트랜잭션이 커밋된 후에 비동기 처리를 하게 된다.
    서버를 재시작하게 되면 비동기로 처리하던 작업이 유실될 수 있다. 즉, 외부 서비스 연동에 실패했을 때 재처리를 어떻게 할 것인지
    외부 서비스 연동이 많으면 처리하는 시간을 줄이기 위해 쓰레드 풀 크기를 늘리고, 쓰레드 풀에서 사용하는 큐의 크기를 늘려야 한다.
    그래서 별도 쓰레드를 사용하는 방법은 재처리의 필요성이 낮은 외부 서비스 연동에 적합할 것이다.

  2. 연동 데이터를 DB에 저장하고 별도 쓰레드나 프로세스로 처리하는 방법
    이 방법은 별도 쓰레드나 프로세스로 DB에 저장된 연동 데이터를 조회한 후 외부 연동 서비스를 처리하는 방법이다. 그래서 DB 트랜잭션 처리가 쉬우며, 외부 서비스 연동에 실패했을 경우 재처리하기가 쉽다. 그래서 이 방법은 외부 서비스 연동에 누락이 없어야 할 경우 적합하다.

  3. 연동 데이터를 메시징 시스템에 저장하고 별도 쓰레드나 프로세스로 처리하는 방법
    연동 데이터를 메시징 시스템에 저장하고 연동 모듈이 이 데이터를 수신해서 처리하는 방법이다. 메시징 시스템은 대량의 데이터를 처리하는데 이점이 있고, 외부 서비스 연동 실패시 비교적 재처리에 용이하다. 하지만 데이터 유실 가능성을 고려해야 한다. 왜냐하면 DB에는 외부 서비스 연동에 대한 상태 등의 데이터를 저장했지만, 이후 메시징 시스템에 문제가 있거나 연결 등의 상황에서 문제가 발생할 경우가 생길 수 있다.

정리

모든 외부 서비스 연동을 비동기로 할 필요는 없다. 하지만 외부 서비스 연동이 운영하는 서비스의 성능에 영향을 준다면 고려해볼 사항이다. 다만 비동기를 사용하게 되면 방법에 따라 복잡도가 증가하게 된다.
외부 서비스와의 연동에서 비동기 처리가 필요할 때 재처리나 트랜잭션 등의 제약이 약하다면 별도 쓰레드로 비동기 처리를 고려하는 것이 좋을 것이고, 연동이나 성능에 대한 요구사항이 높다면 DB 와 메시징 시스템 조합을 고려해보는 것도 방법일 것이다.

728x90
반응형