RESTful API의 한계를 넘어서는 이벤트 기반 통신의 종류와 특징, 그리고 분산 시스템에서의 장단점과 멱등성에 대해 알아봅니다.
서버에서 클라이언트로 단방향 데이터 전송 방식입니다. 일반적인 HTTP 요청-응답 모델을 사용하며, API와 달리 특정 트리거가 발생하기 전까지 서버가 TCP 연결을 닫지 않고 지속적으로 데이터를 보낼 수 있습니다.
HTTP 프로토콜 위에 동일하게 구현되어 확장된 방식이라서 별도의 복잡한 프로토콜 없이 쉽게 사용할 수 있습니다.
RESTful API는 요청에 필요한 자원을 모두 명세하는, **자원 기반 구조(Resource Oriented Architecture)**를 설계하는 것이다. 클라이언트는 서버가 요구하는 모든 자원을 하나의 요청에 담아서 전송하고, 서버는 이에 대한 하나의 응답을 전달하여 단방향 일대일 연결을 사용한다.
RESTful API의 가장 큰 특징은 Statelessness로 무상태성은 서버가 클라이언트의 요청 상태를 보존하지 않는다는 것을 의미한다. 각 요청은 완전히 독립적으로 처리되며, 처리에 필요한 모든 정보를 요청 자체에서 얻기 때문에 Web환경에서 주요하게 다뤄지는 확장성을 극대화할 수 있다.
이런 장점 덕분에 RESTful API는 클라이언트가 어떤 서버 세션으로 요청을 전송하든 처리할 수 있으며 상태 정보를 관리하고 보관할 필요가 없어진다.
Stateless한 API 요청-응답 모델은 실시간 통신을 구현하기 어렵다는 한계를 갖고 있다. Polling 방식이 많이 사용되지만, 이는 불필요한 네트워크 비용을 늘릴 우려가 있기 때문이다.
이런 한계를 극복하기 위해 탄생한 프로토콜이 WebSocket 방식이다.
이는 클라이언트의 숫자가 늘어날수록 서버에 상당한 부담을 줘 최근 네트워크 트래픽이 기하급수적으로 늘어나 몇몇 개발자들은 기피하는 케이스가 발생하고 있다.
소프트웨어의 구조가 복잡해지고 비용을 고려하여 서비스를 보다 더 작은 단위로 모듈화하고 확장하다보니 확장성이 떨어지는 이벤트 기반 통신 방식이 중요한 패러다임으로 다가왔다.
현재는 MSA, IoT 환경에서 이벤트 기반 통신방식은 매우 중요한 역할로 부상했다.
분산시스템 아키텍처의 근간에는 Pub/Sub 모델이 있다. 이벤트 생산자(Publisher)는 특정 이벤트를 이벤트 버스, 메시지 브로커에 게시하고 이벤트의 소비자(Subscriber)는 자신이 관심있는 이벤트를 구독한다.
분산 시스템 아키텍처는 RESTful API에 비해 여러 이점을 제공하지만 단점도 존재한다.
**멱등성(Idempotency)**은 동일한 작업을 여러번 시도하더라도 한번만 실행한 것 처럼 동일한 결과를 보장하는 속성을 의미한다.
EDA(분산 시스템 아키텍처) 환경에서 네트워크 불안정으로 인해 다음과 같은 상황이 발생할 수 있다.
이런 경우 클라이언트가 요청이 실패했다 판단하고, 동일한 요청을 다시 보내게 되는 경우를 고려해야 한다. 멱등성이 보장되지 않을 경우 서버의 상태가 여러번 변경되어 데이터 불일치가 발생할 수 있다.
일반적으로 멱등성은 Key를 가지고 구현한다. 클라이언트가 생성하여 요청에 포함한 뒤, 서버의 MQ나 캐시 저장소에 요청과 함께 저장한다. 그리고 동일한 요청을 다시보내게 되었을때. 이미 해당하는 Key가 저장소에 존재하면 이전 요청의 성공 결과를 반환하는 방식이다.