2014-10-27 66 views
1

我正在研究一個高性能的實時應用程序,其中node.js和mysql作爲後端。處理mysql db連接

爲了提高性能,我有一個單獨的node.js進程更新底層的mysql bd。更新請求被排隊以保證順序執行(必須)。

我在考慮在這個過程中保持一個永久打開的數據庫連接,以避免在每個請求上打開它。

其他DB請求(更新或讀取)直接從web-server node-js實例中並行提供。這些數據庫連接當然是在每個請求中創建/釋放的。

你看到這種方法的一些缺點嗎?

UPDATE:

重要的附加信息。 我選擇了這種獨立的流程解決方案,基本上是因爲以下原因...

在每次更新之前必須執行的邏輯相對複雜且取決於數據庫中的數據結構。在每次更新之前,還需要多次其他查詢。這個獨立的進程具有完整的內存數據結構,並且可以非常快速地執行這些檢查,並且無需db訪問(性能提升)。

回答

3

您的方法的另一個轉變。

MySQL以超時爲基礎關閉已經打開很長時間的連接是臭名昭着的。

Lost connection to MySQL server during query

@duffymo是正確的:使用短期連接從池中更可能保持數百小時較長期打開的連接工作。

node.js + mysql connection pooling

我想知道:你說的順序執行是必須的。大規模DBMS(包括大型服務器上的MySQL)非常有能力處理來自多個連接的併發查詢而不會破壞數據。如果您可以精確計算更新的順序,您的系統可能會更加強大。如果您可以在SQL本身或可能在某些事務中實現這種排序,那麼與堅持只有一個進程執行更新相比,您將擁有更多的防故障系統。單一用途的流程(如您提到的流程)在系統測試中不易調試:它們因出於各種原因而在數百小時後失敗而臭名昭着。當他們在生產中失敗時,每個人都在爭先恐後地恢復它們,所以沒有人有時間來排除故障。

+0

謝謝,關於獨立過程的好處。請參閱問題更新,瞭解更多細節和我的推理。 – Aleks 2014-10-28 09:24:04

2

我看到缺點。

交易是最大的一個。如果UPDATE失敗會發生什麼?你回滾並再試一次?把消息放回隊列中?

我認爲更好的方法是在儘可能最窄的範圍內打開,使用和關閉連接。創建並維護一個連接池,以分攤許多交易的創建成本。

我建議看看vert.x而不是node.js.它是JVM的node.js。它使用非阻塞I/O和環形緩衝區事件總線來保證順序,快速的操作。

+0

交易不是問題。如果一個失敗了,它就會被拒絕,調用者會收到異步通知。 – Aleks 2014-10-28 09:21:08