默认
打赏 发表评论 4
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述
阅读(97180) | 评论(4 收藏2 淘帖1 2
微信扫一扫关注!

前言


在基于位置服务的移动应用领域(最典型的是打车应用),移动设备端和服务端之间总是存在大量的交互(用户可实时获取自已附近网约车的实时位置信息)。设备向服务端发送它的位置信息和其它设备信息,服务端接收这些数据,对它们进行处理,并返回给设备端一些命令。设备端根据这些命令执行一些操作,比如GPS数据的收集和发送频率等。

基于以上业务场景,如此频繁的数据交互,要达到数据的实时推送级别,该选用哪种技术?HTTP短轮询还是基于TCP的实时长连接?本文给出的答案是使用MQTT协议,请继续往下阅读。

通信协议选型


设备端和服务端之间可以通过多种通信协议进行交互,比如HTTP(同步)或者基于消息传递的异步协议。因为移动网络的不稳定性,在选择通信协议时要综合考虑它的稳定性和性能。同时,考虑到移动设备对电池使用时间的敏感度,最好能够选择一个相对比较节省资源的协议,这样可以减少对电池的消耗。

HTTP是一种同步无状态的协议,不支持推送,设备端需要通过轮询模拟推送,反复的轮询需要耗费额外的资源。

相比之下,另一种基于消息传递的协议MQTT在这种情况下似乎更有优势:

  • MQTT可以保持设备与服务器之间的长连接,避免反复的轮询,减少资源消耗,所以更加省电;
  • MQTT可以在设备和服务器之间建立双向连接,从而可以使用推送。

有关MQTT协议的入门文章,请看《扫盲贴:认识MQTT通信协议》,更多推送技术的文章点此进入

先简要地了解下MQTT协议


MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

MQTT协议技术文档:点此进入,当然也有PDF版的,百度一下,不过个人感觉还是官网上的字体和排版最舒服。

MQTT是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。

相信在想深入学习这个协议必是奔着解决某个问题而来的,上面给出了适用的场景,我之所以想深入的学习和了解这个协议,理由如下:

  • 可以实现手机消息推送(PUSH)
  • 协议简单,最小的头部只需2个字节,特别适合于嵌入式设备场景中
  • 这是个了解什么是协议绝好的例子。相比于其它复杂的协议例如tcp、http协议,至少说明文档看的下去。

通常,MQTT协议所处的应用场景如下图所示:

从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述_mqtt.jpg

一个实际的应用实践概述


有一个基于位置服务的移动项目,最开始使用的是HTTP协议,但是基于上述的原因,需要使用MQTT来替换HTTP。下节来看看如何实现这个架构的演变。

首先,在EC2(EC2是一种亚马逊云服务器,类似于阿里云的ECS)上安装一个Mosquitto代理(Mosquitto是一个活跃的开源MQTT服务端实现,官网地址是:https://mosquitto.org/)。设备端把原先HTTP里的消息头和消息体合并到一个MQTT消息里,并发送到Mosquitto代理的一个主题上。后端的API端点对这个主题进行订阅,然后处理接收到的消息。API服务对消息进行处理后,把相应的响应消息发回Mosquitto代理,再推送给设备端。

不过在有多个API服务器的情况下,存在重复处理消息的问题。因为多个API服务器同时订阅相同的主题,它们会收到一个消息的多个拷贝。为了解决这个问题,在系统里引入了AWS的IoT(AWS的IoT是亚马逊云提供的物联网云服务)。AWS IoT在它的内部使用了MQTT代理,同时包含了一个强大的规则引擎,可以利用这个引擎对Mosquitto的消息进行处理,比如把它们保存起来,发送通知或者使用lambda函数处理消息的响应。不过这里需要先把Mosquitto和AWS IoT桥接起来,这样消息就可以进入到AWS IoT。然后使用lambda函数对消息进行处理,抽取消息里的消息头和消息体,最后调用后端的HTTP API服务。

使用这套架构会涉及到:

  • QoS - MQTT提供了三层QoS。这个是非常重要的,因为在底层网络不是很稳定的时候,MQTT仍然能通过重试等手段保证消息可以被正确送达。
  • 消息保留 - MQTT可以为每个主题保留最后一个消息。这对客户端来说,可以反应主题的状态。
  • 处理MQTT消息 - 设置一个Mosquitto代理并让消息流入这个代理是很容易的,但因为缺少第三方包,要让一般的规则引擎来出来这些消息有点棘手。所以最后选用了AWS IoT自带的规则引擎。
  • 日志 - 需要对Mosquitto的日志进行捕捉,并保存起来,方便监控和问题定位。可以使用remote syslog来把日志传输到Papertrail(Papertrail是一个易用的日志服务云平台,官网地址:https://papertrailapp.com/)。

除了服务器端,你同样能找到各种在客户端使用的MQTT客户端lib包。MQTT有支持各种语言的开源客户端库,比如支持Android、iOS平台等,具体可查阅相关资料,本文就不深入展开了。

更多技术文章


[1] 更多推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通信协议
一个基于MQTT通信协议的完整Android推送Demo
IBM技术经理访谈:MQTT协议的制定历程、发展现状等
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为何微信、QQ这样的IM工具不使用GCM服务推送消息?
极光推送系统大规模高并发架构的技术实践分享
从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述
>> 更多同类文章 ……

[2] 更多即时通讯技术好文分类:
http://www.52im.net/forum.php?mod=collection&op=all

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:极光推送系统大规模高并发架构的技术实践分享下一篇:魅族2500万长连接的实时消息推送架构的技术实践分享

本帖已收录至以下技术专辑

推荐方案
评论 4
MQTT靠谱的服务端难找
签名: 秋天到了,终于凉快了
学习了,原来还有这么多的学问
签名: 不错!!!!!!!!!!!!!!!
学习了,干货满满的
学习了,看来自己好要努力。
签名: 该会员没有填写今日想说内容.
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部