RTB 애플리케이션 권장사항

이 가이드에서는 애플리케이션 개발 시 고려해야 할 권장사항을 설명합니다. RTB 프로토콜에 따라 이루어집니다.

연결 관리

연결 유지

새 연결을 설정하면 지연 시간이 늘어나고 사용하는 것이 유리합니다 종료 횟수 감소 열어야 하는 연결 수를 줄일 수 있습니다. 다시 시도합니다.

첫째, 새 연결을 할 때마다 목적지까지 추가 네트워크 왕복이 수립합니다. 요청 시 연결을 설정하기 때문에 연결의 유효 기한이 더 짧고 시간 초과가 발생할 가능성이 알 수 있습니다. 시간 초과가 발생하면 오류율이 높아져 영향을 받을 수 있습니다

둘째, 많은 웹 서버가 각 연결에 대한 전용 작업자 스레드를 생성함 있습니다. 다시 말해 연결을 닫고 다시 만들려면 스레드를 종료하고 폐기하고, 새 스레드를 할당하고, 실행 가능하게 만들어야 하고, 마지막으로 요청을 처리하기 전에 연결 상태를 구축합니다. 너무 많음 발생할 수 있습니다

연결 종료 방지하기

먼저 연결 동작을 조정하세요. 대부분의 서버 기본값은 많은 수의 클라이언트가 있는 환경이며, 각 클라이언트는 소수의 클라이언트에게 요청을 처리합니다 반면 RTB의 경우 소규모 컴퓨터 풀은 할 수 있습니다. 이 연결을 최대한 많이 재사용하는 것이 합리적입니다. 다음과 같이 설정하는 것이 좋습니다.

  • 유휴 상태 제한 시간은 2.5분입니다.
  • 연결의 최대 요청 수 가능한 값입니다.
  • RAM이 사용할 수 있는 가장 높은 값에 대한 최대 연결 수 한 번에 여러 개의 연결이 가능한지 이 값에 너무 가깝게 접근하지 않습니다.

예를 들어 Apache에서는 KeepAliveTimeout~150, MaxKeepAliveRequests~ 0으로 설정하고 MaxClients를 서버 유형에 따라 다른 값으로 설정합니다.

연결 동작을 조정한 후에는 연결을 불필요하게 닫지 않습니다. 예를 들어 기본 '입찰가 없음'을 반환하는 프런트엔드 코드 백엔드가 실패하는 경우의 응답 오류가 발생하면 코드가 연결 이렇게 하면 입찰자가 연결이 닫히기 시작하며, 시간 제한 횟수가 늘어나면 입찰자가 조절될 수 있습니다

균형 유지

Authorized Buyers에서 입찰자의 서버에 연결하는 경우 시간이 지나면서 연결이 불균형해질 수 있습니다. 왜냐하면 Authorized Buyers는 프록시 서버의 IP 주소만 알기 때문에 는 각 콜아웃을 수신하는 입찰자 서버를 확인할 수 없습니다. 시간이 지나면서 Authorized Buyers가 입찰자의 서버가 다시 시작되어 매우 가변적이 될 수 있습니다

일부 연결을 많이 사용하는 경우 열려 있는 다른 연결은 이러한 포드는 당시에 필요하지 않기 때문에 대부분 유휴 상태로 유지됩니다 따라서 Authorized Buyers의 트래픽 변경, 유휴 연결이 활성화 및 활성화될 수 있음 연결이 유휴 상태가 될 수 있습니다 이로 인해 입찰자 서버에 고르지 않은 로드가 발생할 수 있습니다. 문제가 발생할 수 있습니다 Google은 이러한 문제를 방지하기 위해 핫스팟을 자동으로 재분산하기 위해 10,000개 요청 후에 모든 연결 종료 달라진다는 사실을 기억하실 겁니다 만약 귀하의 사이트에서도 트래픽이 불균형하고 추가로 취할 수 있는 조치가 있습니다.

  1. 연결당 한 번이 아닌 요청별로 백엔드를 선택하세요. (프런트엔드 프록시를 사용하는 경우)
  2. 다음과 같은 경우 연결당 최대 요청 수를 지정하세요. 방화벽을 통해 연결을 프록시하고 매핑은 연결이 설정되면 수정됩니다. 참고: Google 이미 연결당 요청 상한을 10,000개로 지정했으므로 여전히 뜨거운 것으로 보이는 경우에만 더 엄격한 값을 제공해야 합니다 사용자 환경에 클러스터링됩니다 예를 들어, Apache에서 MaxKeepAliveRequests를 5,000으로 설정
  3. 요청 비율을 모니터링하고 일부 입찰을 종료하도록 입찰자의 서버를 구성합니다. 한 번에 너무 많은 요청을 처리하는 경우 자체 연결의 수를 .

과부하를 단계적으로 적절하게 처리

이상적으로는 입찰자가 모든 요청을 수신할 수 있도록 할당량을 그 이상은 안 됩니다. 실제로는 할당량을 최적의 수준을 유지하는 것은 어려운 작업이며, 다양한 상황에서 과부하가 발생합니다. 피크 시간대에 백엔드가 다운되고, 트래픽 혼합이 요청별로 더 많은 처리가 필요하거나 할당량 값이 방금 설정됩니다. 너무 높습니다. 따라서 입찰자가 설정한 입찰 금액에서 너무 많은 트래픽이 들어올 수 있습니다

일시적인 트래픽 변화를 수용하기 위해 (최대 1주일) 리전 간 (특히 아시아 및 미국 서부와 미국 동부 및 미국 서부 간) 7일 최고점과 거래당 QPS 사이에 15% 의 쿠션을 권장합니다. 위치.

과부하 시의 작동 방식 측면에서 입찰자는 크게 카테고리:

'전체 응답' 입찰자

이 입찰자는 구현하기 쉽지만 있습니다. 들어오는 모든 입찰 요청에만 응답하려고 하지만 즉시 게재할 수 없는 모든 광고를 대기열에 추가하는 것입니다. 시나리오 대개 다음과 같습니다.

  • 요청 비율이 증가하면 요청 지연 시간도 증가하여 타임아웃 시작
  • 콜아웃 비율이 최고치에 가까워지면 지연 시간이 급격히 증가합니다.
  • 제한이 시작되어 허용되는 콜아웃 수가 급격히 감소함
  • 지연 시간이 복구되기 시작하여 제한이 줄어듭니다.
  • 이 주기가 다시 시작됩니다.

이 입찰자에 대한 지연 시간 그래프는 지나치게 가파른 학습합니다. 또는 대기열에 추가된 요청으로 인해 서버에서 페이징이 시작됩니다. 장기적 속도 저하를 유발하는 다른 작업을 수행할 수 있으며, 지연 시간은 피크 시간이 끝날 때까지 전혀 회복되지 않아 우울한 콜아웃으로 이어짐 전체 성수기 동안 높은 전환율을 유도할 수 있습니다 두 경우 모두 콜아웃이 더 적게 실행되거나 할당량이 단순히 낮은 값으로 설정된 경우보다 더 많이 응답한 경우입니다.

'과부하 시 오류' 입찰자

이 입찰자는 일정 비율까지 콜아웃을 수락한 후 일부 콜아웃에 오류가 있습니다. 이는 내부 시간 초과를 통해 수행될 수 있으며, 연결 큐 (Apache에서 ListenBackLog로 제어) 사용률 또는 지연 시간이 너무 길어지면 확률적 드롭 모드 구현 또는 다른 메커니즘으로 자동 변환될 수 있습니다. Google의 오류율이 15%를 넘으면 제한이 있습니다 '전체 응답'과 달리 이 입찰자 "손실을 줄이며," 이를 통해 요청 속도가 바뀌는 즉시 감소합니다.

이 입찰자의 지연 시간 그래프는 허용 가능한 최대값을 중심으로 한 국소적인 오류를 있습니다.

'과부하 시 입찰 없음' 입찰자

이 입찰자는 일정 비율까지 콜아웃을 수락한 후 '입찰 없음' 자동으로 전송합니다 'Error on overload'(과부하 시 오류)와 유사 입찰자 이는 여러 가지 방법으로 구현할 수 있습니다. 여기서 다른 점은 신호가 Google로 반환되므로 콜아웃을 다시 제한하지 않습니다. 이 프런트엔드 시스템에 의해 과부하가 흡수되어 백엔드로 계속 진행할 수 있습니다

이 입찰자의 지연 시간 그래프는 (인위적으로) 피크 시간에 요청 비율 병렬 처리를 중단하고 입찰이 포함된 응답의 비율입니다.

'과부하 시 오류' '과부하 시 입찰 없음' 접근합니다.

  • 프런트엔드를 과도하게 프로비저닝하고 과부하 시 오류로 설정하여 어떤 형태로든 응답할 수 있는 연결 수를 최대화합니다.
  • 과부하 시 오류가 발생하면 프런트엔드 머신은 미리 준비된 '입찰 없음' 요청을 전혀 파싱할 필요가 없습니다.
  • 가용 용량이 충분하지 않을 경우 '입찰 없음'을 반환하도록 백엔드의 상태 점검 구현 있습니다.

이렇게 하면 일부 과부하가 흡수되고 백엔드가 정확히 가능한 한 많은 요청에 응답할 수 있습니다. Kubernetes가 '과부하 시 입찰 없음'으로 표시 '오류 발생'으로 돌아가는 과부하가 발생함" 요청 수가 예상보다 현저히 높을 때

'모든 질문에 응답'할 수 있는 경우 입찰할 경우 입찰할 수 있는 '과부하 시 오류' 영향을 미치도록 연결 동작을 조정하여 과부하가 걸리지 않습니다 이로 인해 더 많은 오류가 반환되지만 제한 시간을 줄이고 서버가 어떤 요청에도 응답할 수 없습니다.

핑에 응답

입찰자가 연결이 아닌 핑 요청에 응답할 수 있는지 확인 사실, 관리 자체는 디버깅에 매우 중요합니다. Google은 핑을 사용하여 입찰자 상태의 온전성 확인 및 디버깅 요청, 연결 종료 동작, 지연 시간 등을 모니터링할 수 있습니다 핑 요청의 형식은 다음과 같습니다.

Google

id: "\3503cg\3023P\364\230\240\270\020\255\002\231\314\010\362\347\351\246\357("
is_test: true
is_ping: true

OpenRTB JSON

"id": "4YB27BCXimH5g7wB39nd3t"

OpenRTB Protobuf

id: "7xd2P2M7K32d7F7Y50p631"

예상과 달리 ping 요청에는 광고 슬롯 위에서 설명한 자세한 내용처럼 핑 요청에 응답한 후에는 연결을 닫아서는 안 됩니다.

피어링 고려

네트워크 지연 시간 또는 변동성을 줄이는 또 다른 방법은 Google과 피어링하는 것입니다. 피어링을 사용하면 트래픽이 입찰자에 도달하는 경로를 최적화할 수 있습니다. 이 연결 엔드포인트는 동일하게 유지되지만 중간 링크는 변경됩니다. 자세한 내용은 자세한 내용은 피어링 가이드를 참조하세요. 이 피어링을 권장사항으로 간주하는 이유는 다음과 같이 요약할 수 있습니다.

  • 인터넷에서 대중교통 링크는 주로 '핫 포테이토'를 통해 선택됩니다. 라우팅'을 이 명령어는 네트워크 외부에서 가장 가까운 링크를 찾아 해당 링크를 통해 패킷을 라우팅합니다. 날짜 트래픽은 Google이 보유하고 있는 제공업체가 소유한 백본의 한 부분을 통과합니다. 많은 피어링 연결이 있는 경우, 선택한 링크가 사용자가 실제로 접속한 시작됩니다 그 시점부터는 패킷의 경로를 제어할 수 없습니다. 다른 자율 시스템으로 반송될 수 있으므로 (네트워크)을 살펴보게 됩니다

  • 반면에 직접 피어링 계약이 체결되면 패킷은 항상 피어링 링크를 통해 전송됩니다 패킷이 어디에서 시작되든 Google이 소유하거나 임대한 링크를 통해 피어링 지점이며 입찰자 위치에 가까워야 합니다. 역방향 여행 Google 네트워크로 짧게 홉하는 것으로 시작하여 계속 연결하는 것입니다. 이동 대부분을 Google에서 관리 패킷이 지연 시간이 짧은 경로를 취하도록 하고 가능성이 매우 큽니다.

정적 DNS 제출

구매자는 항상 단일 정적 DNS 결과를 Google에 제출하고 Google에 요청하여 트래픽 전송을 처리합니다

입찰자가 흔히 사용하는 두 가지 방법은 DNS 서버가 로드 시도 중 사용 가능 여부 관리:

  1. DNS 서버는 응답으로 하나의 주소 또는 주소의 하위 집합을 전달합니다. 어떤 방식으로든 이 응답을 순환시킵니다.
  2. DNS 서버는 항상 동일한 주소 집합으로 응답하지만 응답의 주소 순서입니다.

첫 번째 기법은 부하 분산에서 좋지 않습니다. 다중 레벨의 스택이며 캐싱을 우회하려는 시도는 원하는 결과를 얻을 수도 있습니다. Google은 DNS 확인 시간을 있습니다.

두 번째 기법은 부하 분산을 전혀 달성하지 못합니다. 왜냐하면 Google은 DNS 응답 목록에서 IP 주소를 무작위로 선택하므로 중요하지 않습니다.

입찰자가 DNS를 변경하면 Google은 TTL(수명)을 설정되어 있지만 새로고침 간격은 불확실합니다.