미지정

php로 제한 시간내에 많은 양의 데이터 처리하기

1) 프로젝트 요구사항

약 800개의 데이터가 DB에 저장되어 있는 상태

해당 데이터를 조회하고 API로 상태를 체크한 다음 상태값을 DB에 업데이트

3분마다 상태값 체크하고 DB에 입력필요

3분전의 데이터를 기반으로 상태값을 체크하기 때문에 3분안에 모든 데이터의 상태가 업데이트되어 있어야 함

2) 기술 스텍

php7.2 (Laravel 6)

MariaDB

3) 요구사항 분석

하나의 데이터의 상태값을 업데이트 하기위해 API를 호출하는데 소모하는 시간은 0.8~1초 좌우

800개의 데이터를 순차적으로 업데이트하기에는 시간이 부족

동시 다중 처리가 필요

4) 구현

1) 라라벨에 3분에 한번씩 실행하는 Cron로직 등록

1
2
3
for ($i = 0; $i < 800; $i += 100){
$schedule->command('updateDataStatus', [$i, 100])->cron('*/3 * * * *')->runInBackground();
}

해당 로직에서 runInBackground()함수는 현재 프로세스에서 독립된 프로세스에서 실행되며 동시 처리가 가능

그말은 즉 해당 로직이 실행되면 8개의 프로세스가 각각의 파라미터를 가지고 실행됨

2) updateDataStatus라는 Command를 생성하며 전달 받은 [$i, 100]을 이용하여 데이터를 조회

만약 [0, 100]을 전달받았다면 DB조회 쿼리에서 LIMIT 0, 100으로 제한함으로 800개의 데이터를 한 프로세스당 100개씩 8개 프로세스에서 처리하게 됨

조회된 데이터를 기반으로 API를 호출하여 상태값 체크와 업데이트 실행

5) 결론

php로 동시성 업무라면 먼저 떠오르는 것이 Laravel의 Queue기능을 이용해서 처리하는 것이지만 이렇게 Command만 이용해서 runInBackground함수를 사용해서 어느정도의 처리가 가능하다.

공유하기