PostgreSQL를 Queue처럼 쓸수 있는 간단한 방법
Published in
Sep 23, 2023
웹서버에서 Background Job을 처리하기 위해 Queue가 필요한 경우가 꽤 있다. AWS SQS를 사용하는게 가장 좋지만, SQS에서 보장하는 정도의 Scalability까지 필요하지 않은 경우가 많다.
이미 Postgres를 데이터베이스로 사용하고 있는 마당에 DB를 그냥 Queue처럼 쓸수 없을까?
Queue의 가장 중요한 특성: Exactly-once delivery
- 여러개의 Worker가 있는 가정하에 Task를 한번씩만 가져갈수 있어야 한다.
SELECT
의 for update skip locked
를 이용하면 Exactly-once delivery처럼 동작한다.
begin;
select * from task_queues order by id limit 10
for update skip locked;
Task를 실행하고 성공한 Task의 경우 삭제 처리 한다.
delete from task_queues where id in (완료된 task id);
commit;
retry 숫자도 기록해두면 실패시 최대 3번까지 재시도등의 동작을 할수도 있다.