2012-12-11 55 views

回答

2

但是觸發將是理想的解決方案

絕對不是。有很多原因,這是一個壞主意,但我會給你主要的:

  • 因爲您需要等待RPC調用完成,所以每個DML都會增加延遲。
  • 當ActiveMQ有可用性問題時(RPC調用失敗,帶着DML和原始應用程序事務處理),隨機和不穩定行爲的操作失敗
  • 存在回滾時的正確性。這僅僅是一個完整的表演塞。無論出於何種原因,如果運行觸發器的應用程序事務回滾,則無法撤銷ActiveMQ操作。

其中一些可以通過在分佈式事務(2PC)中與應用程序事務一起在隊列系統中註冊來解決, XA for ActiveMQ。這解決了最後一個問題,但代價是增加了嚴重的延遲並將吞吐量降低了幾個數量級。

提倡的解決方案是讓觸發器在本地排隊在table used as a queue中,並有一個外部應用程序從此表中解除並推送到ActiveMQ。不要偷工減料並將你的應用程序狀態用作「隊列」(即輪詢狀態並將其標記爲「已處理」),這就是爲什麼99%的'數據庫隊列'嘗試失敗的原因。

你仍然不能夠解決一些當你從隊列存儲(無法在故障切換HA/DR做一致的備份/恢復,「分裂大腦」拆分您的數據存儲所固有的問題因爲排隊不會遵循數據庫故障轉移等),但是隻有在數據庫中嵌入排隊和消息傳遞時才能解決這些問題,如Service Broker

相關問題