Upstash는 네이티브 Redis API 외에도 REST API를 지원합니다. REST API를 활용하면 개발자가 서버리스(Serverless) 및 엣지(Edge) 함수 환경에서 연결 문제 없이 Redis에 접근할 수 있습니다. 다만 하나의 함수 안에서 여러 Redis 명령어를 실행해야 하는 경우, 데이터베이스에 여러 번 호출을 보내야 한다는 비효율이 존재했습니다.
이 문제를 해결하기 위해 커뮤니티 멤버(@MasterGates)가 Discord 채널에서 훌륭한 제안을 해주었고, 그 결과물이 바로 파이프라인(Pipeline) API입니다.
파이프라인 API란?
파이프라인 API는 Redis의 PIPELINE 명령어를 REST API 방식에 맞게 적용한 기능입니다. 여러 개의 Redis 명령어를 단일 HTTP 요청으로 전송하면, 그 결과 역시 하나의 응답으로 한꺼번에 반환됩니다. 이를 통해 RTT(Round Trip Time, 왕복 지연 시간)를 줄이고 소켓 I/O 횟수를 감소시켜 애플리케이션의 전반적인 성능을 크게 향상시킬 수 있습니다.
요청(Request) 형식
curl -X POST https://us1-merry-cat-32748.upstash.io/pipeline \
-H "Authorization: Bearer 2553feg6a2d9842h2a0gcdb5f8efe9934" \
-d '
[
["SET", "key1", "valuex"],
["SETEX", "key2", 13, "valuez"],
["INCR", "key1"],
["ZADD", "myset", 11, "item1", 22, "item2"]
]
'위 예제처럼 각 명령어를 배열 형태로 묶어 요청 본문(body)에 담아 전송합니다. SET, SETEX, INCR, ZADD 등 다양한 Redis 명령어를 조합할 수 있습니다.
응답(Response) 형식
[
{ "result": "OK" },
{ "result": "OK" },
{ "error": "ERR value is not an integer or out of range" },
{ "result": 2 }
]응답은 요청 순서와 동일하게 각 명령어별 결과가 배열로 반환됩니다. 성공한 명령어는 result 필드에 결과값이 담기고, 실패한 명령어는 error 필드에 오류 메시지가 포함됩니다. 위 예제에서 세 번째 명령어(INCR)는 값이 정수가 아니어서 실패했지만, 나머지 명령어들은 정상적으로 실행된 것을 확인할 수 있습니다.
실행 순서 보장과 원자성(Atomicity)
Upstash는 파이프라인 내 명령어들이 전송된 순서대로 실행되는 것을 보장합니다. 하지만 원자성은 보장되지 않습니다. 즉, 다른 클라이언트가 보낸 명령어가 파이프라인 사이에 끼어들어 실행될 수 있으며, 일부 명령어가 실패하더라도 나머지 명령어는 계속 실행됩니다.
또한 파이프라인 API에는 한 가지 제약 사항이 있습니다. 파이프라인 내의 명령어들은 서로 독립적이어야 합니다. 특정 명령어의 응답 결과를 다른 명령어가 필요로 하는 구조로 작성할 수 없습니다. 이러한 경우에는 트랜잭션(MULTI/EXEC) 방식을 고려해야 합니다.
마무리
파이프라인 REST API는 서버리스 환경에서 Redis를 사용할 때 발생하는 네트워크 오버헤드를 획기적으로 줄여주는 강력한 기능입니다. 여러 명령어를 한 번의 요청으로 처리함으로써 지연 시간을 최소화하고 비용 효율성까지 높일 수 있습니다.
Upstash REST API에 대한 자세한 내용은 공식 문서를 참고하시기 바랍니다. Upstash는 사용자 피드백을 바탕으로 API를 지속적으로 발전시키고 있으므로, Twitter나 Discord를 통해 의견을 공유해 주시면 좋습니다.