从 HTTP 到 MQTT:一个移动后端案例概述

简介:

在基于位置服务的移动应用领域,移动设备端和服务端之间总是存在大量的交互。设备向服务端发送它的位置信息和其它设备信息,服务端接收这些数据,对它们进行处理,并返回给设备端一些命令。设备端根据这些命令执行一些操作,比如GPS数据的收集和发送频率等。

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

HTTP是一种同步无状态的协议,不支持推送,设备端需要通过轮询模拟推送,反复的轮询需要耗费额外的资源。相比之下,另一种基于消息传递的协议MQTT在这种情况下似乎更有优势:

MQTT可以保持设备与服务器之间的长连接,避免反复的轮询,减少资源消耗,所以更加省电

MQTT可以在设备和服务器之间建立双向连接,从而可以使用推送

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

首先,在EC2上安装一个Mosquitto代理。设备端把原先HTTP里的消息头和消息体合并到一个MQTT消息里,并发送到Mosquitto代理的一个主题上。后端的API端点对这个主题进行订阅,然后处理接收到的消息。API服务对消息进行处理后,把相应的响应消息发回Mosquitto代理,再推送给设备端。

不过在有多个API服务器的情况下,存在重复处理消息的问题。因为多个API服务器同时订阅相同的主题,它们会收到一个消息的多个拷贝。为了解决这个问题,在系统里引入了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。

除了服务器端,在客户端也需要使用MQTT的客户端包。MQTT有各种语言客户端,并支持Android、iOS平台。

文章转载自 开源中国社区 [http://www.oschina.net]

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
4天前
|
消息中间件 测试技术
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
轻量消息队列(原MNS)以其简单队列模型、轻量化协议及按量后付费模式,成为阿里云产品间消息传输首选。本文通过创建主题、订阅、配置告警集成等步骤,展示了该产品在实际应用中的部分功能,确保消息的可靠传输。
17 2
|
26天前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
51 5
|
5月前
|
消息中间件 数据可视化 Go
Rabbitmq 搭建使用案例 [附源码]
Rabbitmq 搭建使用案例 [附源码]
47 0
|
2月前
|
分布式计算 Hadoop Devops
Hadoop集群配置https实战案例
本文提供了一个实战案例,详细介绍了如何在Hadoop集群中配置HTTPS,包括生成私钥和证书文件、配置keystore和truststore、修改hdfs-site.xml和ssl-client.xml文件,以及重启Hadoop集群的步骤,并提供了一些常见问题的故障排除方法。
77 3
Hadoop集群配置https实战案例
|
2月前
|
Linux Docker Windows
Docker配置https证书案例
本文介绍了如何为Docker的Harbor服务配置HTTPS证书,包括安装Docker和Harbor、修改配置文件以使用证书、生成自签名证书、配置证书以及验证配置的步骤。
163 2
Docker配置https证书案例
|
2月前
|
网络协议 物联网 网络性能优化
物联网江湖风云变幻!MQTT CoAP RESTful/HTTP XMPP四大门派谁主沉浮?
【9月更文挑战第3天】物联网(IoT)的兴起催生了多种通信协议,如MQTT、CoAP、RESTful/HTTP和XMPP,各自适用于不同场景。本文将对比这些协议的特点、优缺点,并提供示例代码。MQTT轻量级且支持QoS,适合大规模部署;CoAP基于UDP,适用于低功耗网络;RESTful/HTTP易于集成但不适合资源受限设备;XMPP支持双向通信,适合复杂交互应用。通过本文,开发者可更好地选择合适的物联网通信协议。
40 2
|
3月前
|
网络协议 物联网 网络性能优化
物联网江湖风云变幻!MQTT CoAP RESTful/HTTP XMPP四大门派谁主沉浮?
【8月更文挑战第14天】本文概览了MQTT、CoAP、RESTful/HTTP及XMPP四种物联网通信协议。MQTT采用发布/订阅模式,轻量高效;CoAP针对资源受限设备,基于UDP,低延迟;RESTful/HTTP易于集成现有Web基础设施;XMPP支持双向通信,扩展性强。每种协议均附有示例代码,助您根据不同场景和设备特性作出最佳选择。
39 5
|
3月前
|
消息中间件 Arthas Java
RocketMQ—一次连接namesvr失败的案例分析
项目组在使用RocketMQ时遇到Consumer连接Name Server失败的问题,异常显示连接特定地址失败。通过Arthas工具逐步分析代码执行路径,定位到创建Channel返回空值导致异常。进一步跟踪发现,问题源于Netty组件在初始化`ByteBufAllocator`时出现错误。分析依赖后确认存在Netty版本冲突。解决方法为排除冲突的Netty包,仅保留兼容版本。
229 0
RocketMQ—一次连接namesvr失败的案例分析
|
3月前
|
移动开发 网络协议 编译器
实战案例3:C语言实现的HTTP服务器
实战案例3:C语言实现的HTTP服务器
182 0
|
5月前
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
156 1