求解答--客户端如何获取messageid

环境信息

  • EMQX 版本:4.4.2
  • 操作系统及版本:CentOS 8.2.2004 x86_64
  • 其他

问题描述

微信截图_20220507155309

客户端发布消息后能否获取到上图中的消息id,客户端用的是mqtt.js连接
文档中:ignore_loop_deliver 这个参数使用了默认值false

这个 messageid 是内部的消息id,仅用作管理session与对话,你需要拿到 messageid 直接 selecet id 即可。可以问下你的业务是什么吗?需要使用到messgageid的场景是什么呢?

你好,目前开发的是IM即时通讯项目,
问题一:在单聊群聊场景中,会存在类似微信消息撤回,消息引用等,需要找到对应的消息id,做相应的操作;测试前端从返回的报文中拿到messageid和后端通过规则引擎获取的id不同,不知道以哪个为准?
问题二:单聊有删除好友,加黑名单;群聊存在全体禁言、单人禁言功能;测试使用ACL权限验证,只是后端日志显示消息发布失败,而客户端显示的发布成功,怎么让客户端直接接收发布失败呢?
以上问题有什么别的思路方案,帮忙解答,感谢 :::

答1:
这个是历史版本的bug,但是目前不方便修改了,主要的原因是可能已经有用户在使用message id的格式了,突然修改会导致老用户使用体验异常。
推荐你使用自己的业务标识符来做消息ID,举个例子

{"messageID": 1, "message": "hello", "username": "gang1010"}

用自己的业务ID来做消息管理是更推荐的做法,因为原生的mqtt消息是没有这个概念的,emqx的id仅用做内部管理,不推荐依赖他来做业务
答2
消息发布返回仅有ack,没有丰富的错误码来支持(MQTT协议规则),所以消息被别的功能拦截了,发布者是无感知的。并且如果需要加上错误码,那么订阅者也要做一些消息接受的错误码了,业务要对称,这其实会导致错误码逐渐演变成http code,极其复杂又不能完全覆盖所有业务。
推荐的做法仍然是答案1中的方式,给消息加上一个id,类似于主动给数据库加上了主键,业务上联表查询,事务,回滚,都会变得非常灵活且易于控制

把mqtt当作传输层协议,不要把它当作业务协议

明白了,谢谢