PostgreSQL를 Queue처럼 쓸수 있는 간단한 방법

Heehong Moon
bgpworks
Published in
Sep 23, 2023

웹서버에서 Background Job을 처리하기 위해 Queue가 필요한 경우가 꽤 있다. AWS SQS를 사용하는게 가장 좋지만, SQS에서 보장하는 정도의 Scalability까지 필요하지 않은 경우가 많다.

이미 Postgres를 데이터베이스로 사용하고 있는 마당에 DB를 그냥 Queue처럼 쓸수 없을까?

Queue의 가장 중요한 특성: Exactly-once delivery

  • 여러개의 Worker가 있는 가정하에 Task를 한번씩만 가져갈수 있어야 한다.

SELECTfor 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번까지 재시도등의 동작을 할수도 있다.

--

--