Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

17.4. 是否有必要使用消息隊列?

兩個團隊分別負責商品信息和價格還有庫存功能模組的開發,商品信息是靜態化方案,商品價格和庫存是AJAX動態載入,公司重金從杭州淘寶挖了一名架構師,並給了首席架構師的頭銜。

最終架構師給出的方案,更新商品信息時,後通過 ActiveMQ 通知刷新緩存更新價格和庫存,這樣的方案是否可行?我認為是可有可無,這個方案中消息隊列並不是剛需。

出現了 這個需求是因為,商品促銷需要經常調整價格和庫存量。修改商品信息這個後台運營的操作,這種操作分成兩類,一類是臨時單品調價,另一類是批量調價。

我想問是否有必要更新商品價格?換個思路可以嗎?是否還有其他更好的方案?

這裡還有一個故事,於是促銷需要,商品需要統一調價,程序猿給了一條SQL:

		
update goods set price=price+10 where category_id = xxx
		
		

高薪聘用的 DBA 竟然執行了,然後就悲劇了。

讓我們換個思路去解決這個問題,我們專門來建一個促銷打折表 discount 用來存儲需要做促銷的商品:

		
+----------------------------------------+
| discount                               |
+----------------------------------------+
| Id | goods_id | price  | ctime | mtime |
+----------------------------------------+
| 1  | 100      | + 12.5 | xxx   | xxx   |
| 2  | 101      | - 0.5  | xxx   | xxx   |
+----------------------------------------+
		
		

當前價格 = 商品價格 + 折扣價格

相比 goods 表 discount 的數據量是非常小的,這樣一來就無需非同步執行,商品調價在Service 直接更新discount 表即可,刷新緩存也不過是一行代碼,刪除 cache key 在一個實例中完成原子性更好。