前言

rocketmq是阿里巴巴开源的分布式消息中间件,本文将介绍在使用rocketmq-sdk时遇到的错误以及解决方法。

背景

本身我们公司是有购买阿里云的rocketmq服务的,一些日志数据的消峰填谷,以及一些异步任务的处理都是通过rocketmq来实现的。
然后为了让这个服务继续发光发热,我们打算将一部分laravel框架的项目的 最终一致性 问题的解决方案也用rocketmq去解决。
利用的方法是使用 rocketmq 的 事务消息.
顺便附上 事务消息 解决 最终一致性 问题的流程图。

问题

问题一

php8.0之后,当声明函数或方法时,可选参数(即未指定默认值的参数)必须位于必需参数之后。

问题二

压根就没在MQTransProducer定义过messageTag,为什么在sdk里直接用这个属性?我不理解。

解决

解决方案只有修改源码,给阿里云发了工单,给的回复是:你看上一次更新已经在2023年1月了。
所以只能自己动手了。

其实就目前这2个问题都不难解决,第一个问题因为是php8.0+的php的建议
而且修改的话所有sdk里相关的使用到 MQTransProducer 构造函数的地方都得改。我嫌麻烦就没改。因为不影响运行。

第二个问题其实本质应该也是php的一个警告,但是会影响代码的运行,所以我就改了。

解决的方法也很简单。就是在 MQTransProducer 类里加上 messageTag 属性。
或者使用 $this->messageTag ?? null 来解决。

总结

这个问题其实就是一个警告,不影响代码的运行。但是如果你的代码是严格模式的话,就会报错。

顺便越发觉得阿里云也在走下铺路,至少在phpsdk上是这样的。