동일한 시간대에 여러개의 병렬 ecs 테스크를 실행하는데
해당 테스크 내부에서 데이터 벌크로 적재시 데드락이 발생하는 경우가 종종 있음
해당 문제로 일부 데이터가 적재 누락되는 현상 발생
2개 이상의 트랜젝션이 서로의 락을 기다리는 상태 즉, 교착상태를 말함.
risk.to_sql('RISK_IDX', con=engine, if_exists='append', index=False)
기존 insert코드를 보면 row별 트랜잭션으로 insert되고있음
이와 같은 로직의 문제점은 아래 두가지 문제점을 야기할 것으로 예상됨
기존 레거시 코드에서 row by row 로 insert되고있던 로직을
벌크로 한번에 insert되도록 수정
to_sql 함수의 옵션 검토 후 알맞은 파라미터 추가하여 테스트 후 적용
| 옵션 | 기본값 | 설명 |
|---|---|---|
name | (필수) | 저장할 테이블 이름 |
con | (필수) | 데이터베이스 연결 객체 (engine) |
if_exists | 'fail' | 테이블이 이미 존재할 경우 처리 방식 |
index | True | DataFrame의 인덱스 포함 여부 |
method | None | 데이터 삽입 방식 (multi, execute_many, None) |
chunksize | None | 데이터 분할 크기 지정 (batch insert) |
dtype | None | 컬럼별 데이터 타입 지정 |
risk.to_sql('RISK_IDX', con=engine, if_exists='append', index=False, method='multi')
쿼리 실행 감소
트랜잭션 수 감소로 인한 효율 증가
그로 인한 데드락 방지 효과 기대
데이터의 규모가 커지면서 이런 숨어있던 문제들이
들어나기 시작하고있다.
항상 데이터의 규모가 확장될 수 있다는 가정하에 아키텍쳐와 코드로직을 설계해야겠다고 다시 한번 다짐하는 계기가 되었다.