我觉得 MQ 无用的理由

2021-11-12 15:29

 

不喜欢用 MQ。

如果是同一个系统内的不同模块,可以用数据库表,来传递消息;

如果是不同系统间数据接口,可以用 webservice(同步,现在好像是 gRPC 有点热)、SFTP/FTP协议(异步) 进行数据交换。

 

看不出有任何使用 MQ 的需要。除非甲方指定,看在钱的面子上,勉为其难去用一下。

MQ 是异步通讯技术,与之相对的是 SFTP/FTP 。通常视为同步的 webservice, 也可以改成异步(先接收数据到接口表并反馈:数据已收到、后逐个处理)。相比较而言,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://www.zheguisoft.com/staff_blogs/jacklondon_chen/2022, 及 https://my.oschina.net/jacklondon/blog/5308654

 

 

 


请选择网站语言: