2014-09-30 1 views
1

우리는 Azure env에서 OpenRtb 입찰자를 구축하려고합니다. Linux VM에 배포 된 redis 인스턴스를 사용하여 실시간 데이터 (추적 키, 요청/입찰 개수 등)를 저장합니다. 우리는 WebApi 기반 웹 사이트 (표준 계획/대규모 인스턴스/성능 별 확장)를 엔드 포인트로 사용합니다. webapi bidder 컨트롤러에서는 비동기 메서드를 사용하며 DB 및 redis에 대한 모든 요청은 async입니다. Json.net에게 ser/der json req/resp.Azure에 OpenRtb 입찰자가 있습니까?

현재 대기 시간 문제가 있습니다. 우리는 초당 10000 req 이상을받을 수 있어야하고 대기 시간은 < 100ms이어야합니다.

저와 경험을 공유 할 수있는 사람이 있습니까? 이 기술 스택은 rtb 입찰자와 같은 앱을 구축하는 데 적합합니다. 현재 각 요청에 대한 요청 컨텍스트 (쿼리, 요청 본문, 헤더 등)를 저장하는 최상의 전략을 찾으려고합니다. 그래서, (> 10000) 많은 큰 메시지를 매우 빨리 삽입 할 방법이 필요합니다.

  1. 가 로그 파일에 저장하고 HDFS에 복사하고 큐 REQ 메시지를 AzureQueue 또는 ServiceBus 아니면 RabbitMQ과 같은 몇 가지 큐를 사용하여 보내 하둡 맵리 듀스 작업 (HDInsight)
  2. 에 의해 구문 분석 : 나는 생각 해요 일부 서비스 (자체 제작 또는 LogStash와 같은)는 해당 서비스를 받아 일부 저장소에도 저장합니다.

대기 시간과 성능을 최적화하는 방법을 보여줄 수있는 사람이있을 수 있습니다. 현재 문제가 있으므로 어쩌면 몇 가지 기본적인 함정일까요?

+1

당신의 시스템 워크 플로를 설명 할 수 있습니까? 당시의 상황과 마찬가지로 응답 요청 응답을받습니다. 조금 더 자세하게. – Vishnu667

답변

0

흥미 롭습니다. Azure에 대한 경험이 거의 없지만 대기열이나 모든 종류의 IO와 관련된 경우 처리량이 높고 대기 시간이 짧은 rtb 입찰자를 작성하는 것은 까다로운 작업 일 수 있습니다. 필요하면 입찰가 경로를 벗어나는 것이 바람직합니다. 모든 것을 캐시하거나 메모리 저장소 (Aerospike, Couchbase 등등 .. 고속도를 사용하십시오. 비동기는 좋지만 예약 할 스레드가 너무 많으면주의하십시오. epoll을 사용할 수 있다면 높은 대기 시간을 유발할 수 있습니다. 트위터의 Finagle (트위터 RPC 시스템)에 포장 된 netty (jvm의 async non blocking io), 데이터 캐싱의 모델 크로싱 맵 및 데이터 제공을위한 에어로 스페이스와 함께 aws에서 실행중인 입찰자를 구축했습니다. 우리는 m4.2xlarge (8 코어/32 Go)의 한 상자에서 약 45ms와 평균 16ms의 99 백분율 테일 대기 시간으로 20k req/초를 처리 할 수있었습니다. 입찰자에게는 베어 메탈 만 사용해야한다고 생각하는 경향이 있지만 가상화 또는 그렇지 않은 아키텍처에 관한 것입니다.

0

우리는 구현시에 동일한 문제가 있었지만 실제로 우리는 가능한 대안을 확인하기로 결정했습니다. 우리는 다른 lang과 libs를 벤치 마크했습니다.

source Yandex.Tank response per second(ubuntu vm 8 cores) 
target ubuntu vm 8 cores 
golang fast http 30k+ 
nginx 20k 
golang http 20k- 
haskell wai warp 15k+ 
clojure http-kit 15k- 
node.js 7k 
rust hyper 10k+ 
rust iron 10k- 
fsharp suave.io 4k+ (best result ever for .net web servers) 
asp.net 5 kestrel coreclr/mono ??? 400- 

그 후 우리는 golang + fasthttp + redis를 사용하기 시작했습니다. 실제로 99 % 백분위 수는 11ms 미만으로 단일 인스턴스에서 40k rps를 처리 할 수있었습니다. 사실 현재 asp.net 5 확인할 수있는 속도로 좋은 결과를 보여줍니다 here