2015-01-04 20 views
0

我們正在研究在我們的應用程序中實施審計日誌,我們不確定如何正確執行。
我知道django-reversion的工作原理和運行良好,但是使用它的成本很高。
保存記錄時,即使保存在同一事務中,Web服務器也必須向數據庫創建兩個往返行爲,因爲至少在postgres中將更改寫入數據庫並對事務進行命令以使更改可見。
因此,如果我們不使用當前情況下的異步I/O,那麼這將阻止Web服務器,直到將修訂保存到數據庫。即使我們使用異步I/O生成修訂版的數據也需要CPU時間,這又會阻止Web服務器處理其他請求。我應該使用數據庫觸發器還是使用django-reversion來實現修訂?

我們可以使用數據庫觸發器來代替,但是我們的DBA聲稱將這類工作卸載到數據庫將使用用於處理更多事務的資源。 正在使用數據庫觸發器這種工作是一個壞主意?

我們可以使用負載均衡器和使用讀/寫副本的數據庫來擴展Web服務器。
我們在這裏找不到任何折衷?
什麼可以幫助我們決定?

回答

1

你需要考慮你的網站的數據庫使用模式。

這可能是唯一的你,但是大部分的網絡應用閱讀更往往比他們到數據庫。事實上,看到優化已經很常見了,以幫助擴展一個Web應用程序,從而實現更復雜的「保存」操作以獲得更快的讀取。一個例子是denormalisation,其中來自相關記錄的一些數據在每次保存時被複制到父記錄,以避免重複執行復雜的聚合/連接查詢。

這只是一個例子,但除非你知道你的具體情況不同,否則我不會擔心在保存時做了一些額外的工作。

一個警告是考慮從修訂系統中排除一些模型。例如,如果您使用的是Django數據庫支持的會話,則會話記錄將保存在每個請求中。你想避免在那裏做不必要的工作。

至於通過觸發器VS Django應用程序做......我認爲這裏的主要考慮是不是與性能做到:

  • Django應用程序的解決方案是更多的「明顯」和「維護」 ...該應用程序將位於您的pip需求文件和Django INSTALLED_APPS中,對於其他開發人員來說,它顯而易見並且正在運行,並且不需要別人記住在移動到新服務器時在數據庫服務器上運行自定義SQL
  • 使用db觸發器解決方案,您可以肯定,只要記錄發生變化,就會運行 ...而使用Django應用程序,anyo通過psql控制檯更改記錄將繞過它。即使在Django ORM中,某些批量操作也會繞過模型保存方法/保存信號。但有時候這是可取的。

另一件事我想指出的是,你的生產網絡服務器將是多進程/多線程的......所以,雖然,是的,一個漫長的DB寫入將阻止網絡服務器只會阻止當前進程。您的網絡服務器將有其他進程可以同時處理其他請求。所以它不會阻塞整個網絡服務器。

所以再說一遍,除非你有一個使用模式,你可以預見到併發寫入的高頻率,我可能會說不用擔心。

+0

我們的REST API確實有更高的讀取率,然後寫入,但我們的後端服務卻相反。他們至少寫出90%的時間。我們的後端服務之一不斷寫入數據,數據應該修改,這就是爲什麼我擔心性能。 –

+0

好吧,那麼我猜觸發器可能在數據庫方面效率更高一點,因爲它們將不需要通過客戶端連接發送額外的查詢就可以運行 – Anentropic

+0

數據庫觸發器會比django-reversion更好地擴展嗎?爲什麼? –

相關問題