9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

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

  • 2016-11-23
  • 本文字数:1268 字

    阅读完需:约 4 分钟

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


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2016-11-23 18:0010870
用户头像

发布了 321 篇内容, 共 129.1 次阅读, 收获喜欢 139 次。

关注

评论

发布
暂无评论
发现更多内容

Pr视频剪辑师如何选笔记本?华硕灵耀Pro16 2022带你玩转内容创作

科技热闻

Starfish OS:以现实为纽带,打造元宇宙新范式

西柚子

怎样才能让企业知识管理发挥出它的真正价值?

Baklib

vue.js 多种方式安装

恒山其若陋兮

7月月更

从一线开发到技术总监,你就差一个赶鸭子上架

融云 RongCloud

程序员

专业创作本华硕ProArt 创16 2022预售,高效创作新旗舰

科技热闻

【刷题记录】16. 最接近的三数之和

WangNing

7月月更

Web3流量聚合平台Starfish OS,给玩家元宇宙新范式体验

鳄鱼视界

Web3流量聚合平台Starfish OS,给玩家元宇宙新范式体验

威廉META

let's go——2022年读书活动招募书(第1期)

codists

Starfish OS:以现实为纽带,打造元宇宙新范式

BlockChain先知

Docker安装Mycat中间件 | 实现主从&读写分离

宁在春

Docker 读写分离 mycat 7月月更

阿里云联合平行云推出云XR平台,支持沉浸式体验应用快速落地

阿里云弹性计算

视觉计算 云XR平台

Spark Sql编译模块-词法、语法分析器Antlr4(一

飞哥

架构训练营模块七作业

融冰

王者荣耀商城异地多活架构

intelamd

如何设计业务异地多活架构 - 作业

阿拉阿拉幽幽

数据仓库和数据中台的关系

奔向架构师

数据仓库 7月月更

8 月亚马逊云科技培训与认证课程,精彩不容错过!

亚马逊云科技 (Amazon Web Services)

架构师 培训 认证

活动报名|揭露 Apache Doris 数据湖分析技术内幕?稀土开发者大会免费报名中!

SelectDB

数据库 数据湖 云原生 Doris 技术分享

【盲盒APP商城系统】在线拆盒后的功能介绍

WDL22119

盲盒小程序开发 盲盒APP开发 盲盒源码 盲盒H5开发 盲盒系统开发

如何实现随叫随到的客户服务

Baklib

从去IOE到CIPU,中国云计算要走出自己的路径

B Impact

Okaleido tiger NFT即将登录Binance NFT平台,后市持续看好

西柚子

【Docker 那些事儿】初始 Kubernetes 容器管理平台(上)

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

架构实战营模块 7 作业

Naoki

架构实战营

那一年,春晚拓荒牛背后的故事

优必选科技

机器人

Okaleido tiger NFT即将登录Binance NFT平台,后市持续看好

小哈区块

如何搭建一个知识库网页?

Baklib

数据散列算法

技术小生

7月月更 散列算法

更智能!AIRIOT加速煤炭行业节能减排升级

AIRIOT

低代码 物联网 低代码,项目开发

  • 扫码添加小助手
    领取最新资料包
从HTTP到MQTT:一个移动后端案例概述_移动_薛命灯_InfoQ精选文章