2016-11-15 46 views
3

假設我在Heroku + Rails上使用了下面的設置,使用一個網絡測試儀和兩個工人測試儀。(Heroku + Sidekiq)我瞭解連接池如何工作正確嗎?

以下是我認爲是真實的,我希望有人可以確認這些陳述或指出一個不正確的假設。

我對這個大部分都很有信心,但是我對客戶端和服務器的使用,指向DB和Redis連接的「連接池」以及指的是puma和「worker」 heroku dyno工人。

我想一清二楚,我希望這也可以作爲有這個

感謝麻煩任何其他初學者綜合指南!

enter image description here

一切如何相互作用

  • 的Web測功機(在Rails應用程序運行)

    • 只能用DB時,需要查詢其服務的網頁交互請求
    • 只有在將作業推送到Sidekiq隊列(存儲在Redis中)時才與Redis交互。這是Sidekiq 客戶
  • 工人賽道

    • 如果Sidekiq工作,它的運行需要查詢數據庫僅與數據庫進行交互
    • 只有Redis的交互拉工作從Sidekiq隊列(存儲在Redis中)。這是Sidekiq 服務器

ActiveRecord的池大小

  • 25一個ActiveRecord池大小意味着每個賽道有25個連接的工作。 (這是我最不確定的。它是每個賽道或每個彪馬/ Sidekiq工人?

  • 對於Web DYNOS,它只能一次(2美洲獅跑的10件事(線程)X 5個線程),所以它只會消耗最多10個線程。 25超出了它的需求。

  • 對於工作者動態,15的Sidekiq併發意味着15個Sidekiq進程可以一次運行。同樣,25個連接超出了它所需要的範圍,但是如果存在無法清除的過時或死亡連接,這將是一個很好的緩衝區。

  • 總的來說,我的Postgres DB可以預計來自Web dyno的10個連接和來自每個工人dyno的15個連接,總共最多連接40個連接。

Redis的池大小

  • 該網站DYNO(Sidekiq客戶端)將利用其在Sidekiq.configure_client塊中指定的連接池size。一般來說〜3是足夠的,因爲客戶端不會不斷地向隊列中添加作業。 (它是3元測功機,或3%彪馬工人?

  • 每個工人DYNO(Sidekiq服務器)將利用其在Sidekiq.configure_server塊中指定的連接池size。默認情況下,它的sidekiq併發+ 2,所以這裏17個Redis的連接將通過每個賽道

+0

從帖子中消除「worker」一詞。使用「線程」,「過程」和「動態」。 15的併發意味着1個Sidekiq進程有15個線程。 –

+1

連接池大小是每個進程。測功機可以運行多個進程。 –

回答

2

我不知道的Heroku的Rails +,但相信我可以回答一些更一般的問題進行討論。

從客戶的角度來看,任何連接的設置/拆卸都非常昂貴。連接池的概念是有一組連接保持活動狀態並可以使用一段時間。 JDK HttpUrlConnection執行相同的操作(假設HTTP 1.1),因此 - 假設您要訪問同一個服務器 - HTTP連接保持打開狀態,等待下一個預期的請求。這裏同樣適用 - 不是每次都關閉JDBC連接,而是保持連接 - 假設服務器和認證憑證相同 - 所以下一個請求跳過了不必要的工作,可以立即向數據庫服務器發送工作。

維護客戶端連接池有許多方法,它可能是JDBC驅動程序本身的一部分,您可能需要使用Apache Commons Pooling之類的方法來實現池,但無論您做什麼,它都會增加您的行爲並減少可能由網絡打嗝造成的錯誤,這些錯誤可能會阻止您的客戶端連接到服務器。

服務器端,大多數數據庫提供程序都配置有數據庫服務器可能接受的n個可能連接池。通常每個附加連接都有一個佔位面積 - 通常很小 - 所以根據可用內存,可以計算出可用連接的最大數量。

在大多數情況下,您將希望獲得大於預期的連接。例如,在postgres中,配置的連接池大小適用於該服務器上任何數據庫的所有連接。如果開發,測試和生產都指向同一個數據庫服務器(顯然是不同的數據庫),則測試使用的連接可能會阻止生產請求得到滿足。最好不要小氣。

+0

感謝您的背景!通過提供一些很好的見解,特別是從另一種語言。雖然問題的核心是關於Rails + Heroku + Sidekiq的設置,但我必須等待更具體的答案才能接受。欣賞它:) – user2490003