2015-09-15 32 views
1

我們正在Elastic Beanstalk上運行一個servlet,我們連接到ElastiCache並運行得相當好,但現在我們在高峯期獲得高CPU負載(50%)並正在優化它。Jedis - 高性能servlet - 設置

在我們使用Jedis這樣的時刻:

try (Jedis jedis = new Jedis(Global.CLUSTER_ENDPOINT, 6379, 10000);) {    
    jedis.hset(f.dayOfFile, "content", f.xmlFile); 
} 

的一個問題,我們已經是活動連接的數量一下子漲到了8400,而不是下降。似乎沒有影響任何東西,但仍然想知道它是如何變得如此之高,如果這影響了性能。

所以我的問題是:

  1. 我們應該使用像生菜另一個庫(https://github.com/mp911de/lettuce)這似乎更好地維持?
  2. 或者我們應該使用連接池?我們每天有數以百萬計的請求,所以如果在池中引入其他問題(如連接最大連接數),有點害怕切換到連接池?
  3. 還有什麼我們應該調整?
+0

而不是害怕它,你可以嘗試#2 [在一些測試environemnt]。對於我來說,有一個不受限制的(非連接的)連接數似乎是一個壞主意。或者,你是否也有一定數量的新線程()? – zapl

+0

@zapl難以模擬300萬用戶,以確保它在高峯期不會失敗。但如果這是建議的方式,我會改變它,看看一些規模測試解決方案,以確保它按預期工作。 –

+0

是的,這很困難。但是如果你不想長時間停留在大量沒有人想再次觸摸的代碼上,那麼就必須事先驗證變更的方法(以及緊急回退的方式)。不幸的是,據我所知,Beanstalk沒有像http://www.programmableweb.com/news/google-app-engine-now-supports-ab-testing/2012/02/29等版本的A/B測試功能,但您應該能夠在負載平衡器級別做類似的事情。還有幾個負載測試服務和框架。 – zapl

回答

3

Jedis是一個小巧而漂亮的圖書館,如果你想做「只是」一些Redis。它的速度很快,因爲它只是它的工作。 Jedis的可伸縮性受到線程/連接的限制,並且連接不是線程安全的。您可以使用連接池,我堅信,這將有助於解決您的問題。

上面的代碼每次調用時都會從Redis連接/斷開/連接到Redis。合併可能有所幫助。 jedis使用commons-pool2,這是一個相當不錯的連接池實現,但與其他框架相比較慢。

您可以自己實現連接池,以改善高連接數問題。

你問到生菜:生菜,你只有一個連接需要,因爲生菜連接是線程安全的(只要你不使用阻塞操作[BLPOP]或交易[EXEC/DISPATCH])。生菜比jedis略慢,但提供:

  • 線程安全
  • 自動重新連接,當連接中斷
  • 異步API指令緩衝

生菜不提供只讀使用Redis Standalone(或Redis Master/Slave)時,從 - 從(從)。 ElastiCache也沒有故障轉移/服務發現(只有Redis Sentinel支持故障轉移)。

一個缺點可能是萵苣的命令模式,因爲萵苣會爲您發出的每個命令創建一個命令。根據使用情況的不同,命令可能會佔用你記憶中的重要部分。但是,這取決於你的觀點。

心連心,馬克

+0

是的,Jedis的連接池功能非常好,性能卓越。簡單而好看,它_「只是工作」_。 也Jedis完美的與哨兵,重新連接到奴隸。到目前爲止沒有問題。 – dasniko

0

嘗試Redisson它支持AWS Elasticache服務,並提供連接池,最方便的Java API來Redis的。