2016-11-15 8 views
3

Heroku + Rails에서 웹 dyno 1 개와 작업자 dynos 2 개로 아래 설정을했다고 가정합니다.(Heroku + Sidekiq) 연결 풀링의 올바른 작동 방식을 이해하고 있습니까?

다음은 내가 사실이라고 생각하는 것입니다. 나는 누군가가 이러한 진술을 확인하거나 잘못된 가정을 지적하기를 바랍니다.

나는 대부분 이것에 확신하지만 클라이언트와 서버의 사용법에 대해 조금 혼란 스럽습니다. DB와 Redis 연결을 모두 나타내는 "연결 풀"과 퓨마와 heroku dyno 노동자.

나는 맑은되고 싶어하고, 나는 이것이이

감사에 문제가 다른 초보자를위한 통합 가이드 역할을 할 수 있기를 바랍니다! 모든

  • (레일 응용 프로그램이 실행되는) 웹 다이노이 페이지를 봉사하기를 조회 할 필요가있을 때

    • 만 DB와 상호 작용을 상호 작용하는 방법

      enter image description here

      request

    • 은 작업을 Sidekiq 대기열 (Redis에 저장 됨)로 밀어 넣을 때만 Redis와 상호 작용합니다. 그것은 Sidekiq 작업이는 DB를 조회 할 필요를 실행중인 경우
  • 작업자 다이노

    • 만 DB와 상호 작용하는 Sidekiq 클라이언트입니다
    • 단지에서 작업을 끌어 레디 스와 상호 작용 Sidekiq 큐 (Redis에 저장 됨). 그것은 Sidekiq 서버 (25)의 액티브 풀 크기가 각 다이노이 작업 할 25 개 연결이 있음을 의미

    액티브 풀 크기입니다. (이. 내가 가장 확실 해요 무엇 각 다이노 각 푸마/Sidekiq 노동자인가?) 웹 동력계를 들어

  • , 한 번만 (2 퓨마에서 10 일 (스레드)를 실행할 수 있습니다 X 5 스레드), 최대 10 개의 스레드 만 소모합니다. 25는 필요한 것 이상입니다.

  • 작업자 dynos의 경우 15의 Sidekiq 동시성은 15 개의 Sidekiq 프로세스가 한 번에 실행될 수 있음을 의미합니다. 다시 말하지만, 25 개의 연결이 필요 이상으로 길지 만, 오래되지 않거나 죽은 연결이 없어지면 좋은 버퍼가됩니다.

  • 내 Postgres DB는 웹 dyno에서 10 개의 연결을, 15 개의 작업자 dyno에서 총 40 개의 연결을 최대로 연결할 수 있습니다.

레디 스 풀 크기

  • 웹 다이노 (Sidekiq 클라이언트)는 Sidekiq.configure_client 블록에 지정된 연결 풀 size을 사용합니다. 클라이언트가 대기열에 지속적으로 작업을 추가하지 않기 때문에 일반적으로 ~ 3이면 충분합니다. (는인가 다이노 당 3, 푸마 노동자 당 3?)

  • 각 작업자 다이노 (Sidekiq 서버)에 Sidekiq.configure_server 블록에 지정된 연결 풀 size을 사용합니다. 기본적으로는 연결이 각 다이노 나는 Heroku가 + 레일을 알고 있지만 내가 더 일반적인 몇 가지 질문에 대답 할 수 생각하지 않는다

+0

게시물에서 "worker"라는 단어를 삭제합니다. "스레드", "프로세스"및 "dyno"를 사용하십시오. 동시성은 15를 의미합니다. Sidekiq 프로세스에는 15 개의 스레드가 있습니다. –

+1

연결 풀 크기는 프로세스 별입니다. dyno는 여러 프로세스를 실행할 수 있습니다. –

답변

2

에 의해 이동하게됩니다 17 레디 스는, 그래서 여기에 sidekiq 동시성 + 2입니다.

클라이언트의 관점에서 의 설정/해제는 모든 연결이 매우 비쌉니다. 연결 풀링의 개념은 활성 상태로 유지되고 일정 기간 동안 사용할 수있는 일련의 연결을 갖는 것입니다. JDK HttpUrlConnection은 HTTP 1.1을 가정하여 동일한 작업을 수행하므로 동일한 서버로 이동한다고 가정 할 경우 HTTP 연결은 열린 상태로 유지되어 다음 요청 요청을 기다립니다. 동일한 요구 사항이 불필요한 작업을 건너 뛰고 즉시 데이터베이스 서버로 작업을 전달할 수 있도록 매번 JDBC 연결을 닫지 않고 같은 서버 및 인증 자격 증명을 사용하여 연결이 유지됩니다.

클라이언트 측 연결 풀을 유지하는 방법에는 여러 가지가 있습니다. JDBC 드라이버 자체에 포함될 수 있지만 Apache Commons Pooling과 같은 것을 사용하여 풀링을 구현해야 할 수도 있지만, 클라이언트가 서버에 연결하지 못하게하는 네트워크 딸꾹질로 인해 발생할 수있는 오류를 줄이십시오.

대부분의 데이터베이스 공급자는 데이터베이스 서버에서 수용 할 수있는 가능한 연결 수 n 개의 풀로 구성됩니다. 일반적으로 추가 연결마다 풋 프린트가 있습니다. 보통 사용 가능한 메모리에 따라 사용 가능한 최대 연결 수를 계산할 수 있습니다.

대부분의 경우 예상보다 큰 연결을 사용할 수 있기를 원합니다. 예를 들어 포스트그레스에서 구성된 연결 풀 크기는 해당 서버의 모든 데이터베이스에 대한 모든 연결에 대한 것입니다. 개발, 테스트 및 프로덕션이 모두 동일한 데이터베이스 서버 (분명히 다른 데이터베이스)를 가리키는 경우 테스트에서 사용되는 연결로 인해 프로덕션 요청이 수행되지 않을 수 있습니다. 인색하지 않는 것이 좋습니다.

+0

배경 감사합니다! 특히 다른 언어에서 좋은 통찰력을 제공하는 것으로 선정되었습니다. 질문의 핵심은 Rails + Heroku + Sidekiq 설정과 관련이 있기 때문에 받아 들일 수있는 구체적인 답을 기다려야 할 것입니다. 고맙습니다. :) – user2490003