从 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]

时间: 2024-11-16 18:24:53

从 HTTP 到 MQTT:一个移动后端案例概述的相关文章

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

在基于位置服务的移动应用领域,移动设备端和服务端之间总是存在大量的交互.设备向服务端发送它的位置信息和其它设备信息,服务端接收这些数据,对它们进行处理,并返回给设备端一些命令.设备端根据这些命令执行一些操作,比如GPS数据的收集和发送频率等. 设备端和服务端之间可以通过多种通信协议进行交互,比如HTTP(同步)或者基于消息传递的异步协议.因为移动网络的不稳定性,在选择通信协议时要综合考虑它的稳定性和性能.同时,考虑到移动设备对电池使用时间的敏感度,最好能够选择一个相对比较节省资源的协议,这样可以

数据挖掘的常用方法、功能和一个聚类分析应用案例

在今天的博文中,笔者整理了数据挖掘的常用方法和数据挖掘的重要功能(出自MBA智库百科).当然,横看成岭侧成峰,这些常用方法和重要功能也许并不完全正确或完整.除此以外,笔者尝试学习了SMARTBI公司中的Smart Mining软件,并跟随其提供的示例教程进行了学习.为方便阅读,将其示例教程结合自己的体会作为文章的第三部分. 一.数据挖掘的常用方法 利用数据挖掘进行数据分析常用的方法主要有分类.回归分析.聚类.关联规则.特征.变化和偏差分析.Web页挖掘等,它们分别从不同的角度对数据进行挖掘. 分

一个MySQL优化案例的初步思路

今天想起这件同事处理的一个性能优化案例,当时虽然解决了,但是还是留下了几个未解的问题,和大家一起讨论一下. 首先,这个问题是根据反馈sql响应很慢,已经开始影响前端应用的登录了.稍后DBA介入,发现是由于CPU使用率过高导致,为了能够延缓问题和进一步分析,因为数据库中的数据量不大,直接就迁移到了另外一台配置不错的服务器上,但是迁移之后,CPU配置好了很多,问题依旧,同时也在进行问题的诊断和分析. 得到的慢日志如下,发现大多数的响应时间都耗费在了两个SQL上,其实出自同一个存储过程. 1.慢日志

市场判断失败剖析一个失败创业案例

2007年上半年即将结束的时候,传来一个消息,原来从公司出去的几个同事合伙创业的一个建筑软件企业解散了,这个企业是在2006年初,公司中以老王为主的一些销售人员禁不住这个市场的诱惑组建起来的,做一些关于施工技术类产品的同质化竞争. 建筑软件市场也许还能算得上是国内商品化软件市场的运作得比较成功的一块市场,全国有众多的软件企业在这个领域中打拼,并扶持着这个算得上是国内软件市场中的一块净土.在这个领域中,大部分企业的竞争力还不强,软件研发管理模式.软件创新能力与一些软件巨头相比,还相差甚远. 国内不

如何搭建一个物联网商业案例的解读

我们中的很多人都经历过没有互联网的时代,但是现在正是技术变革的时候,尽管我们还不如这一切是怎么发生的.可以说今天的互联网也刚刚开始,它还将不断的向各方面扩展,成本不断降低的传感器每天会产生大量的数据,这会推动网络的指数级壮大,并且影响我们的日常生活. 网络设备制造商Cisco公司认为物联网(IoT)充分利用了互联网各种通信协议,在家里或者办公室的设备如PC.机顶盒和智能仪表,移动网络中的智能手机和M2M调制解调器会产生数以亿计的数据包,这些形成了一个使用公共基础设施的包括万亿终端设备的网络.但是

一个完整的案例

我们现在要做一个杂志订阅系统,要用户输入Email,输入两次密码,密码要一样,密码要求安全,所以必须包括(!@#$%^&*+;:),输入用户的电话,最长20位,必须选择信用卡,输入卡号,卡号为15位,程序如下,好简单的,大家看看. <% public sub OnSubmit(source as Object, e as EventArgs) if Page.IsValid then "数据入库等操作 end if end sub%><h3><font fa

一个HBase优化案例分析:Facebook Messages系统问题与解决方案

HDFS设计的初衷是为了存储大文件(例如日志文件),面向批处理.顺序I/O的.然而架设在HDFS之上的HBase设计的初衷却是为了解决海量数据的随机读写的请求.把这两种设计初衷截然相反的组件怎么揉在一起的呢?这种分层的结构设计主要是为了使架构更清晰,HBase层和HDFS层各司其职:但是却带来了潜在的性能下降.在很多业务场景中大家使用HBase抱怨最多的两个问题就是:Java GC相关的问题和随机读写性能的问题.Facebook Messages(以下简称FM系统)系统可以说是HBase在onl

一个课堂打印案例分析

作者构造了Picture类,汇总需求细节,见招拆招,尤其在"接口设计"这一节里,把自己当成客户,跟自己一问一答("我希望有些什么操作,如何表述这些操作?"),逐步分析不断复杂的需求,然后抽象出接口,其中不乏作者的经验之谈:要想决定具体操作的形式,有一个好办法,就是试着使用这些操作,从使用的例子推导出操作的定义形式要比从头苦思冥想地发明这些操作容易得多. 1.最初需求是打印如下文字: Paris in the Spring 2.构造的Picture类,只需要一个构造函

一个easyui的案例(SSH)

/*  * name :tuzuoquan mail :tuzq@css.com.cn date :2014/02/14 version :0.1  * description:气象信息共享门户系统通用JS,TreeTable CopyRight (C) 2014-02  */ // 获取选中一行的情况,下面的一个参数可以代表一个DataGrid function getSelected(dialogEle) {  // 获取选中一行的情况.  var datagrid = $("#fileIn