答1:
这个是历史版本的bug,但是目前不方便修改了,主要的原因是可能已经有用户在使用message id的格式了,突然修改会导致老用户使用体验异常。
推荐你使用自己的业务标识符来做消息ID,举个例子
{"messageID": 1, "message": "hello", "username": "gang1010"}
用自己的业务ID来做消息管理是更推荐的做法,因为原生的mqtt消息是没有这个概念的,emqx的id仅用做内部管理,不推荐依赖他来做业务
答2
消息发布返回仅有ack,没有丰富的错误码来支持(MQTT协议规则),所以消息被别的功能拦截了,发布者是无感知的。并且如果需要加上错误码,那么订阅者也要做一些消息接受的错误码了,业务要对称,这其实会导致错误码逐渐演变成http code,极其复杂又不能完全覆盖所有业务。
推荐的做法仍然是答案1中的方式,给消息加上一个id,类似于主动给数据库加上了主键,业务上联表查询,事务,回滚,都会变得非常灵活且易于控制