2017-01-04 1 views
1

저는 RDS Postgres에서 데이터를 스트리밍하고, 비교적 비싼 CPU 작업을 수행하여 다른 데이터베이스에 삽입해야하는 NodeJS 애플리케이션을 보유하고 있습니다. CPU 집중적 인 부분 나는 AWS Lambda로 오프로드하여 Node 어플리케이션이 한 행의 배치를 가져 와서 처리를 위해 즉시 Lambda로 전달합니다. 병목 현상은 Postgres에서 데이터를 수신 할 수있는 속도로 나타납니다.Postgres 테이블의 모든 데이터를 처리하는 가장 빠른 방법은 무엇입니까?

DB에 대한 다중 연결을 활용하기 위해 정렬 된 ID에서 효과적으로 도약하는 알고리즘을 사용하므로 많은 동시 연결을 유지 관리 할 수 ​​있습니다. 예 : 1 개의 연결이 ids 1-100을 가져오고, 두 번째 연결이 ids 101-200을 가져오고, 첫 번째 연결이 ids 1001-1100을 가져 오는 경우가 있습니다. 이것은 비교적 표준적인 관행입니까? 처리를 위해 데이터를 추출하는 더 빠른 방법이 있습니까?

데이터베이스의 max_connections보다 낮 으면 가능한 한 더 많은 동시 응용 프로그램을 추가하는 것이 유익할까요? 응용 프로그램과 RDS 모두 현재 VPC에 있으며 RDS의 CPU 사용률은 약 30 %, 메모리는 60 %입니다.

+0

{constructing + 구문 분석 + 실행} query + 2 * 네트워크 트래픽은 100 행에 대해서만 많은 작업입니다. – wildplasser

+0

100 행을하지 않고, 도약 메커니즘을 보여주기 위해 예제를 제공했습니다. 미안합니다. – ralusek

+0

당신은 데이터 녀석이 아닌 코드 녀석 인 것처럼 보입니다. 게다가 병목 현상이 CPU 집약적 인 것이라면, 왜 비터인가? – wildplasser

답변

1

Postgres 데이터베이스를 CSV 파일로 덤프하거나 플랫 파일로 직접 내보내고, 분할 한 후 플랫 파일을 S3으로 덤프 한 다음 작업자가 각 파일 일괄 처리를 자체적으로 처리하도록하는 것이 더 빠를 것입니다.

Postgres에서 데이터를 스트리밍하는 경우 (특히 수백만 개의 항목을 처리하는 경우) 많은 IO 및 매우 긴 시간이 소요됩니다.

관련 문제