2014-09-30 50 views
1

我們正在嘗試在Azure env上構建一個OpenRtb出價工具。我們使用部署在Linux VM上的redis實例來存儲實時數據(跟蹤密鑰,請求/ bidwins計數等)。我們使用基於WebApi的網站(標準計劃/大型實例/按性能縮放)作爲終點。在webapi投標人控制器中,我們使用異步方法,所有對數據庫的請求以及redis也是異步的。 Json.net到ser/der json req/resp。Azure上的OpenRtb競價者,是真的嗎?

目前我們遇到延遲問題。我們應該有可能獲得每秒10000次以上的響應,並且延遲應該是100ms 100ms。

有人可以與我分享經驗嗎?這個技術堆棧是否適用於構建像rtb競標者這樣的應用程序。目前我試圖找到最佳策略來存儲每個請求的請求上下文(查詢,請求正文,頭文件等)。所以,我需要以非常快的速度插入大量(> 10000)大消息。我在想:

  1. 存儲日誌文件,並將它們複製到HDFS和使用一些隊列如AzureQueue或ServiceBus或可能的RabbitMQ和發送REQ消息隊列中的Hadoop MapReduce任務的(HDInsight)
  2. 解析,並且一些服務(自制或諸如LogStash)將接收它們並存儲到某些存儲。

也許有人會告訴我如何優化延遲和性能,因爲目前我們遇到了問題。也許有一些基本的陷阱?

+1

你能描述你的系統的工作流程。就像從收到出價請求到迴應的時候發生的一樣。以更詳細的方式。 – Vishnu667 2014-11-05 11:03:09

回答

0

有趣。 我對Azure沒有多少經驗,但是如果涉及諸如隊列或任何類型的IO之類的事情,構建具有高吞吐量和低延遲的rtb競標者可能會非常棘手。只有在必要時才使用這些標記,並且最好在出價路徑之外。緩存所有內容或在內存存儲中使用高速(Aerospike,Couchbase等等,如果你對此很聰明,甚至可以使用redis)。 異步非常好,但要小心計劃太多的線程。如果您可以使用epoll,非阻塞IO,則會導致高延遲。 我建立了一個在aws上運行的競標者,在Twitter的Finagle(twitter RPC系統)上封裝了netty(異步非阻塞io在jvm上),編年史地圖作爲模型緩存和用於數據服務的aerospike。我們可以在一盒m4.2xlarge(8個核心/ 32個Go)上處理20k req/sec,其中99%的尾部延遲約爲45 ms,平均爲16 ms。 您傾向於瞭解到,您應該只對投標人使用裸機,但更多的是關於虛擬化與否的體系結構。

0

我們與我們的實施有同樣的問題,實際上我們決定檢查可能的替代方案。我們對不同的langs和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。實際上,它足以處理單個實例中的40k rps,並且99百分位數小於11 ms。其實目前asp.net 5顯示速度好,你可以檢查here

相關問題