疯狂吐槽mqtt组件,使用mqtt的需要注意

2019-11-5 16:30 [复制链接] 28 366

准备使用mqtt开发产品,于是先进行mqtt组件的评估,例子跑起来没问题,但是例子跑完读了下源码,目测出几个严重的问题,该组件基本不能商用。现将问题列举如下:' J/ l% ]0 i8 ]
1.mqtt发送是通过pipe或udp回环方式,udp方式没什么问题,但是要多使用一个回环网卡,多少令人不爽。
3 X/ ]; V* |* C* |3 {2.pipe模式下,就有严重问题了。mqtt消息发布时,如果消息大小大于pipe容量,则消息会被截断,前一部分会正常发送,后一部分找不pipe的mqtt头部,会发送不成功。对于一个消息,要么发布失败,要么发布成功,截断发送显然是不合理的。当然pipe是阻塞模式的,不会丢弃数据,所有发送数据都放入了pipe里,但因为容量限制会被截断。6 D, e4 O: l7 M0 P) R
3.pipe模式下,如果发布消息过快,那么pipe接收数据可能会将2个消息合并为一个发送,这显然就是严重的错误了。这2个消息可能都是不同的主题,他擅自合并。要解决的话,只能每条消息写入pipe的话增加头尾和长度,读出来的时候头尾和长度的整包读出来在发送。) E2 Q9 p- [% }, {
4.不能忍受的是因为使用pipe或者udp要发布一个消息,数据要来回多拷贝4次,大家可以去读源码看。
8 Z8 |8 M1 V0 |: `1 c/ L2 i5.mqtt组件写的只支持Qos1,但是事实上并未对MQTT ACK做处理,他只是等待信号量,保证pipe拿走数据,并且已经通过网络发走,发送成功失败与否都没做处理,这谈不上Qos1。
2 D$ \. A: x& P! C0 L    鉴于以上问题,mqtt组件根本无法实际商用,本人已经重写,近期会重新上传一个能够商业应用的mqtt组件。
) T! E3 E6 r, c9 ?2 V) C
2 o, g* W9 P2 i1 W% U0 B4 |* b0 e; x/ z% \3 U
5 d/ p, \' J; v$ N
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-5 16:33:44 | 显示全部楼层
期待大佬的 PR
使用道具 举报 回复
发表于 2019-11-5 16:37:47 | 显示全部楼层
本帖最后由 aozima 于 2019-11-5 16:40 编辑
7 E* f% J! l4 _' B9 ~4 H6 F: Q$ u. R
楼主说得对,楼主V5,点个赞!
使用道具 举报 回复
发表于 2019-11-5 16:39:04 | 显示全部楼层
先确认下问题,描述是否有误,是否是真实存在的问题!也欢迎吐槽本人
使用道具 举报 回复
发表于 2019-11-6 08:56:16 | 显示全部楼层
膜拜大佬,期待大佬的PR
使用道具 举报 回复
发表于 2019-11-6 09:18:31 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 2019-11-6 10:17:21 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 6 天前 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 6 天前 | 显示全部楼层
大神,膜拜大佬!
使用道具 举报 回复
发表于 6 天前 | 显示全部楼层
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主说的pipe问题,需要竞争的资源肯定是要互斥操作的,如果官方没实现这个机制,那真是解释不通了……而缓存大小,这个需要根据自己项目来综合考虑;ACK机制自己在业务层实现;
使用道具 举报 回复
发表于 5 天前 | 显示全部楼层
sean 发表于 2019-11-8 16:480 h3 P  r5 o% P3 f& v
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...
# F: r* `1 C; |& V7 w% `
这么说就有点以偏概全了
使用道具 举报 回复
发表于 5 天前 | 显示全部楼层
最近用mqtt在项目上 也出来很多问题 等待大佬的仓库
使用道具 举报 回复
发表于 5 天前 | 显示全部楼层
sean 发表于 2019-11-8 16:48
/ j8 P4 M# @! j6 t: jRTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...

# d! L# \5 a0 v7 wRTT 的装机量都超过两亿台了
使用道具 举报 回复
发表于 4 天前 | 显示全部楼层
的确有很多不合理的东西,所以我用啊里的在改造 改成我们公司商业用途
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
只适合学习,这个确实有些以偏概全了。9 u, T( M  V% M! K
1 y1 w7 y) Y2 B( J# w. _8 f6 K  d
mqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样的问题,或许是pipe用法的不对,或者例如说只传递过去指针可能更合理。不过pipe确实是类似于stream的模式,能发的就都先发了。0 _! N2 T8 A( a, o8 v9 a% p

& I; g6 x( r8 V另外RT-Thread中有不合理的地方大家可以多提提,RTT也一直在持续进化中,RTT平台本身会遵循“小而美”的原则来小心谨慎添加 & 更改代码、功能。而在维护好RTT平台本身的情况下,也会优先处理好核心软件包的事情。不过对软件包这边确实会相对松些,因为也希望大家多多参与,把自己的想法、组件分享出来,所以基本上任何社区开发者的任何软件包都可以提、添加到软件包索引中。
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
期待大佬的PR,使用RTT这么多年,内核一直很稳定,没出过问题,组件是近几年刚发展起来的,有些许问题,需要大家一起完善
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
bernard 发表于 2019-11-11 08:45
. m8 F+ a, h: C3 n, x只适合学习,这个确实有些以偏概全了。# z, `6 T8 Z. s" C$ `
( V0 T+ |/ v$ {( i# V
mqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样 ...

1 M1 s& I- q$ D8 f: v9 d/ n. F快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针对stm32的库更新问题,针对log的输出问题,makemenuconfig配置问题,这些当你实际来使用的时候,你会发现问题不是一点点的多……
. W2 i, n2 X- Q7 D/ t3 \吐槽不是想说系统不好,只是希望不要光将虚头的东西,多做点实际的,号称可以使用menuconfig界面轻松配置,log系统多么完善易使用,系统多么容易裁剪……这些东西说出来好听,但是实际拿来用却不是那么回事,实在是大跌眼镜!
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
yqiu 发表于 2019-11-9 11:45: [! _1 z* O9 d
RTT 的装机量都超过两亿台了
; [' H2 R; J; A' I5 y" m* P
装机量多更应该把一些基本的东西而且已知的不合理的东西改掉了……现在看来并不是这么回事……
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
sean 发表于 2019-11-11 12:064 ~" `+ A* q3 s$ _% t; u
快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...

2 X3 e/ U7 [4 R8 y) M. T; U- r发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人使用。
# V" y* Q; B! C7 t. j0 T: G3 @# i) v: m2 e# j7 ^
如果说有很多修改的,做为一份开源中立的系统,没能合并在一起,是悲哀的(我不希望给大家的感受是:中国的一个人是一条龙,合在一起是一条虫,真的)。我在做这个系统之初,就希望它开源开放,让它应用得更多更广,而不是依赖我的力量。git上的PR永远都是打开的,可以多提补丁、建议,在遵循“小而美”,不会干扰到其他组件代码或其他BSP代码的前提下,都欢迎。
7 w( V/ ^# q1 O$ u2 }
  E9 ]+ j& T* x7 w1 z3 `1 a) bstm32的库更新,这部分是跟着ST的步伐走,也是一种无奈。太多人吐槽 HAL 不好用了……这个能怎么说,是跳坑了,还是趟坑了?不过stm32新BSP用的人还是更多,比原来的好很多。原来的stm32 bsp,驱动不全,问题也挺多,现在都得到长足的改观。( ^/ l/ i' E/ C2 ]
" V! t/ i+ {$ {1 T2 T
log输出问题,poll?指的是什么?rt_kprintf?或者ulog系统?rt_kprintf实现得简陋些,但是却是在中断中可用的非常好的一种方式。要异步,不poll,请看ulog,而且ulog可以对接不同的后端,同步或异步方式都很灵活。. X8 J4 R- u2 y- U5 q5 @% N' u
3 @& N  ^! P" l$ f+ N6 \
menuconfig,这个是什么问题?没发现有什么问题,RTT平台(也就是RTT每次发布的代码,不包括软件包)的Kconfig一直在完善中,软件包则有些超出我们的管辖范围了。确实也会面临到一些问题,例如查找一个配置项不容易;英文的文本描述信息等。所以在这点上,我们期望通过图形化界面的配置器来解决<什么时候有?那还请想像下,把Kconfig翻成图形化配置的并且好用的,这个工作量啊>。
, K- H6 V" K, ~
2 z/ n8 X$ \0 |6 d# j; q! I如果说都是虚头的东西,我也不会在这里回复你,还投入很多时间到代码,到社区中,直接删帖就好了。希望大家多吐槽,我们以及您一起多来完善,改观。
使用道具 举报 回复
发表于 前天 12:14 | 显示全部楼层
bernard 发表于 2019-11-11 15:03
8 _( ]* X, A2 ?$ R9 J发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人 ...

3 {& s- C; Z  n7 k2 K9 E3 k谢谢超级版主的关注!
$ D/ _. J8 j. m4 i  N* v. l( A4 J6 c3 F; P9 T- D& V( N1 ^1 x
吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支持国产的态度来的!吐槽也只是希望社区能把系统做的更好更方便使用,如果本人有能力也会提交一些PR的……2 F  f6 r' D) t
7 U+ }; L9 U# N8 u& p
至于ulog的输出,我大概看了下底层的源码:1 |( ?% ^2 G  a$ y8 C) Y

8 Y# d( j# f, z$ m8 W5 O) Q# h: X% D, _虽然ulog支持多后台模式输出,但是在调用串口输出的时候还是使用轮询的方式发送,虽然是异步处理,但是串口的这种发送方式还是没有DMA的方式效率高,中断发送的话如果log数据较大,对于实时系统来说也是不小的开销……本人尝试修改log发送为DMA发送,可能能力有限,还没有成功……
. ]5 b2 Y4 g: k  C- @, @' W3 Y1 _) d' S. h! W" ~/ t
至于menuconfig这块,做好了确实工作量巨大,需要社区成员慢慢提交pr集成起来,如果menuconfig上集成了MCU选项,然后自动导入相关HAL或者扳机支持,只需修改类似设备树概念的板级信息,那么menuconfig就又大进一步了;' B+ `- U0 w+ A% b, o4 x" C# Z/ I( F% b

! r" y) C: f) u4 V  U! P希望RTT越做越好,本人也会持续关注,最近在尽力移植到项目中,吐槽不少,有些可能过于夸大问题,望见谅!
使用道具 举报 回复
发表于 昨天 10:04 | 显示全部楼层
大佬,你的MQTT组件上传了吗
使用道具 举报 回复
发表于 昨天 10:06 | 显示全部楼层
大佬,你的组件上传了吗
使用道具 举报 回复
发表于 昨天 10:30 | 显示全部楼层
光吐槽只应是第一步,下一步要贡献正能量,让rtt能完善更强大才时真正有意义的事情!
使用道具 举报 回复
发表于 昨天 11:29 | 显示全部楼层
sean 发表于 2019-11-12 12:14
0 e7 _" l9 G9 ~谢谢超级版主的关注!
( Y' x, }# V3 r7 G& n7 E( R( B/ X3 `. Z9 V- T% d/ Z2 Z2 P
吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...

+ }0 `, k" m: x) sRTT好像快要发布自己的IDE了,这个可选MCU的功能到时候会不会支持,可以期待一下。
使用道具 举报 回复
发表于 14 小时前 | 显示全部楼层
sean 发表于 2019-11-11 12:06! R& H% W+ J1 E# F& _/ X
快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...

" M6 R- t# P# w+ _我想问,你真的有用心去研究使用rtt吗,碎片化的开发方式搞惯了吧
使用道具 举报 回复
发表于 13 小时前 | 显示全部楼层
看完这里的评论,内心五味陈杂,说说自己的感受。4 _4 A- s# k; ]& j

* U$ C. ?# i  {, s+ ]一个 RTOS 的核心就是系统调度,以及多任务的互斥与通讯,只要这些是稳定的,那么整个项目就有了基本的确定性。
9 s; h, b: @4 y* |; [: \
5 C/ m! d( S" C( W8 f2 E, H后面,增加了异常处理,日志系统,各种组件,设备框架,驱动框架,第三方软件包,那么为什么会增加这些东西?- H7 |1 t% X, ?/ d0 f  B
) i: A( X* F8 @" }4 D: d4 [
我想,出发点就是为了开发更简单。
3 j/ o+ `' v( y  Y9 v
0 ]' C( [4 U4 x+ t1 j嵌入式开发真的是太碎片化了,不同的芯片,不同的硬件,不同的系统资源,不同的应用方式(中断、DMA),等等,这些都会因为不同的业务,不同的硬件,导致不一样的软件需求。- S! W' b, {8 u( o, ^' E
+ c; }3 I5 U& `  [
为了能够让碎片化的代码有那么一丝丝的重用性和确定性,RTT 抽象了设备框架、驱动框架,并将基本需求抽象为组件(如日志组件 ulog、网络组件 SAL)。这些努力,都是希望更多的代码复用,希望能够一次开发多处应用。) g) X9 Z  f1 r* ?" n0 r5 m

3 }) v: V" T# t* u  b8 \关于 menuconfig。每一块嵌入式代码模块都或多或少存在一些配置,要么是平台适配,要么是功能设置,要么就是资源配置。这些自定义的内容放到哪里,怎么样才能让软件开箱即用,又能让用户自由配置,灵活裁剪?我想 menuconfig 已经是非常有效的解决方式,以至于标准化的 Linux 依旧使用这种方式。为了让配置更简单,开发者用起来没那么难受,从该代码配置走向 menuconfig 的命令行界面,再到后面 IDE 里的可视化图形界面配置,这每一步都是为了简化开发者工作。但,不要妄想着自己啥都不用做了。作为项目代码开发维护者,你应当清除每一个功能组件的依赖关系,因为配置工具并不知道谁依赖谁,工具只能简化操作,并不能替代操作。
7 G% H) i) }6 y4 v* _( O6 G& C; Z6 z9 y' ]1 O/ L; {. r$ G
最后,RTT 提供的是通用代码,所有的组件、软件包都可能仅仅适应一定的场合,并不能全业务场景适用,即使是高级语言,也无法解决这个问题,不然哪来的性能优化与运维(尽管 RTT 在努力减少这部分工作)。当然,我们每一个人可能都是某个领域的大佬,如果你在应用 RTT 相关代码的时候,当它不能满足你的需求,或者它本身设计存在问题,如果你不能忍受,那就动手优化(就像这个帖子的作者一样)。
. v5 V. S# S" V
使用道具 举报 回复
发表于 4 小时前 | 显示全部楼层
新写的组件已经提交,等合并了大家就可以用了。为了和以前的区分,我命名为mymqtt。函数名和以前的paho-mqtt保持兼容,但是为方便应用,也增加了一些函数,比如判断连接是否断开的。
使用道具 举报 回复
发表于 4 小时前 | 显示全部楼层
gnail092 发表于 2019-11-13 10:04
; k# ]0 P, v, |8 K3 J6 y大佬,你的MQTT组件上传了吗
! V$ V* {1 H& D% e* s
已经上传了哈,等待合并
使用道具 举报 回复
发表于 22 分钟前 | 显示全部楼层
海神出马 一个顶仨
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表