我觉得 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 ,https://www.cnblogs.com/jacklondon/,https://www.zheguisoft.com/staff_blogs/jacklondon_chen 。