由于公司的产品涉及到软件和硬件,同时,也用到了mqtt服务。我负责的这个产品从诞生到现在,mqtt服务也经历了好几次的更替。这个主要是从并发角度去考虑的。
1,Apache ActiveMQ,这个mqtt服务是我们最早使用的也是使用时间最长的一款mqtt服务软件,这个mqtt服务有很多有点,但是,它的缺点最终让我决定把它替换掉。那我就简单地列举一下缺点。最核心的缺点就是占用CPU比较高。举例说明,例如一个服务器的CPU是12个核,32G内存,当并发数量增加到2000以上的时候,CPU的使用率瞬间就会飙升到100%,也有可能会持续很长时间。占用这么高的CPU,最终就会导致整个系统无法正常使用。占用CPU过高最核心的问题就是Java这个虚拟机导致的,所以,这个没有办法从根本上解决问题。
2,mosquito,这个是c语言实现的一个轻量级的mqtt服务,相比于activemq它会减少很多的CPU资源,进而降低整个服务器的压力。总体来讲这个软件还是比较不错的。但是,最近一个项目上发现这个mosquito进程占用的CPU并不高,高峰期使用率只有14%左右,始终维持在2000左右的并发数量,项目现场的终端在3000台左右。每一台终端都会建立一个mqtt客户端连接。这样就会导致将近700台左右的设备无法正常连接服务器。没办法只能替换。最后终于找到原因了,这是因为网卡是百兆网卡,现场工程说是因为网线问题导致服务器的千兆网卡变成了百兆网卡。
3,emq,这个是erlang编程语言实现的一个mqtt服务,erlang编程语言的优势就是对并发的处理。可以这么说,erlang语言就是为并发而生。从这一点不能看出,到目前为止,emq是我使用过的所有mqtt服务性能最优的一款软件。尽管erlang也是以虚拟机的方式在运行,但是它占用的CPU资源要远比Java少的多,可以与mosquito相媲美。使用erlang既解决了并发问题,同时也解决了CPU使用率过高的问题。erlang编程语言里面的线程叫做协程,它可以用更少的资源来处理并发请求。
https://www.emqx.io/docs/zh/v4.4/getting-started/cluster.html#%E8%8A%82%E7%82%B9%E5%8F%91%E7%8E%B0%E4%B8%8E%E8%87%AA%E5%8A%A8%E9%9B%86%E7%BE%A4