我覺得 MQ 無用的理由
不喜歡用 MQ。
如果是同一個系統內的不同模塊,可以用數據庫表,來傳遞消息;
如果是不同系統間數據接口,可以用 webservice(同步,現在好像是 gRPC 有點熱)、SFTP/FTP協議(異步) 進行數據交換。
看不出有任何使用 MQ 的需要。除非甲方指定,看在錢的面子上,勉為其難去用一下。
MQ 是異步通訊技術,與之相對的是 SFTP/FTP 。相比較而言,MQ 毫無優勢。
速度、簡易性、穩定性、標準化等各方面,MQ 完敗。
SFTP/FTP 也能輕松削峰與限流(MQ 介紹文檔常說的優點)。發送方快速發,接收方慢速處理、即時或滯后處理,都可以。
使用接收方webservice,也可以收到數據后先保存在接口表中,后慢速處理。整體也相當于異步了,也能削峰與限流。
MQ 起初就是幾個 Java 軟件廠商弄出來,只為賣錢。雖然后來微軟與開源社區跟進,微軟甚至把它做進 Windows 自帶組件,實際上沒有必要用這種技術。
微軟現在也不怎么提了。Java /C#書籍提的也少了。
但執迷于其中的人,仍舊不少,特別是 Java 圈的。而 C# 圈的基本不用它。
我覺得,有時候多學幾門開發語言,交叉對比,對于技術選型,很有幫助。
比如,我做軟件項目,java-web 與 asp.net 反復交叉,時間長了,就知道 web 后端 MVC 領域,用 Apache Velocity (java-web) 與 NVelocity (asp.net) 是最優解,而微軟官方推的各種 MVC 技術、Sun/Oracle 官方推的各種 MVC 技術,包括 Google Web Toolkit (以純后端 java 代碼寫程序,之后部分代碼將編譯、轉換行成前端 html/js, 思路古怪),都可以扔在一邊了。
----2022/01/20,基于答復來補充:
補充一下,用 mq 的人,往往期望,借助 mq, 做到接口數據"不重復、不遺漏"地發到另一個系統。
一旦使用了 MQ, 理論上講,無論如何,都是做不到數據"不重復、不遺漏"的。
考慮 system_a 發數據到 mq_x, 而 system_b 從 mq_x 收數據,分析如下:
1) system_a 發數據到 mq_x, 正常情況下,mq_x 收到數據、反饋"收到",system_a 更改本系統某個數據狀態為已發送。
極端情況下,mq_x 反饋"收到"、system_a 更改本地數據狀態失敗。然后再來一次,數據就發重復了。
2) system_b 從 mq_x 收數據, 正常操作,有兩類可能:
2.1, 從 mq_x 彈出一個數據,system_b 保存數據。
極端情況下, mq_x 彈出數據成功、system_b 保存數據失敗,數據丟失。
2.2 從 mq_x 隊列頂部/底部取一個數據,system_b 保存數據,system_b 通知 mq_x 刪一個數據。
極端情況,mq_x 取數據成功、system_b 保存成功、system_b 通知 mq_x 刪數據時網絡斷開。之后 system_b 會收到重復數據。
根源是 mq 操作,與數據庫操作,合在一起無法做成一個技術上的 transaction(整個流程多個操作,要么一起成功、要么一起失敗)。
---- 歡迎轉載,轉載請注明出處。此博客同時發表于 https://my.oschina.net/jacklondon ,http://www.rzrgm.cn/jacklondon/,https://www.zheguisoft.com/staff_blogs/jacklondon_chen 。

浙公網安備 33010602011771號