简介:mqtt是IBM发明并开源的一套针对物联网场景下的传输协议。MQTT(MQ Telemetry Transport)是一个非常轻量级的使用发布/订阅模式的消息传输协议,专为代码存储空间小的设备和低带宽、高延迟或不可靠的网络而设计。设计原则就是尽量减少网络带宽和设备资源需求,同时还要确保可靠性和一定程度的交付保证。这些原则使得此协议成为新兴的“M2M”或“IOT”以及带宽和电池电量都非常重要的移动应用的理想选择。
需求,在springboot项目中对接mqtt
选用activemq作为mqtt的代理服务器,那么我用springboot开发的后台系统相对于它来说也是一个客户端了;所以可以考虑选择eclipse paho 的库
activemq的消息队列有两种方式:queue和topic,即队列和主题。
队列是单对单的,消息被消费者消费以后,queue中不再有存储,所以消息消费者不可消费到已经被消费的消息;
主题是发布订阅模式,生产者发布一个主题,消费者消费主题,生产者和消费者不直接耦合。发布到topic的消息会被所有订阅者消费
以门禁系统为例,应用服务器(虚拟设备)可以订阅每个门禁(真实设备)的统计数据的topic,对所有门禁的数据进行统计分析,每个门禁也可以订阅自身开关门的topic,应用服务器凭此可以远程控制每个门禁的状态。
重点
名词解释
header 1 | header 2 |
---|---|
入站 | 数据向外发送 |
出站 | 接收数据 |
通过mqtt代理服务器维护的topic订阅模式,能把消息的生产者和消费者更好的解耦,在mqtt协议的使用过程中,主题的设计是非常重要的。订阅与发布必须要有主题,只有当消费者订阅了某个主题后,才能收到相主题的payload进行通信。
这里了解一下MQTT主题的过滤规则:
- 主题层级分隔符—“/”
- 多层通配符—-“#”
- 单层通配符—-“+”
- 通配符 —-“$”
相关软件
Servers/Brokers
- Apache ActiveMQ
- Apache ActiveMQ Apollo。在ActiveMQ基础上发展而来的,可以支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。之前的稳定发布版本中,MQTT是作为一个Apollo的一个插件提供的。但是现在,这个插件已经变为开发项目的一部分。MQTT在Apollo中已经不需要其他配置文件或者是第三方插件支持了。
- Apache ActiveMQ Artemis
- 。。。
Client libraries
java中集成
我们在开发过程中,主要是使用mqtt的客户端库,这方面在看到官网列出的众多选项之前,能查到推荐资料的有以下几种:
- eclipse paho
- mqtt-client
- activemq的客户端库
- 其中spring官方提供的mqtt支持功能使用的是Eclipse Paho MQTT Client library,链接
- 还有有些感觉已经提供的这些库不满足需求,而用netty自己集成mqtt
相关知识
JMS
是由Sun公司早期提出的技术标准,旨在为java应用提供统一的消息操作。用于两个应用程序之间或者分布式 系统中发布消息,进行异步通信。
JMS相关概念
- 提供者 : 实现JMS规范的消息中间件服务器
- 客户端 : 发送或接受消息的应用程序
- 生成者/发布者 : 创建并发送消息的客户端
- 消费者/订阅者 : 接受并处理消息的客户端
- 消息 : 应用程序之间传递的数据内容
- 消息模式 : 在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式
JMS消息模式
队列模型
- 客户端包括生产者和消费者
- 队列中的消息只能被一个消费者消费
- 消费者可以随时消费队列中的消息
主题模型
- 客户端包括发布者和订阅者
- 主题中的消息被所有订阅者消费
- 消费者不能消费订阅之前就发送到主题中的消息
JMS编码接口
- ConnectionFactory用于创建连接到消息中间件的链接工厂
- Connection 代表了应用程序和消息服务器之间的通信链路
- Destination 指消息发布和接收的地点,包括队列或主题
- Session表示一个单线程的上下文,用于发送和接收消息
- MessageConsumer 由会话创建,用于接收发送目标的消息
- MessageProducer 由会话创建,用于发送消息到目标
- Message 是消费者和生产者之间传送的对象,消息头,一组消息属性,一个消息体
AMQP
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。
常见的消息中间件
1.ActiveMQ
- ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
- 特性
- 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
- 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
2.RabbitMQ
- RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
- 特性
- 支持多种客户端
- AMQP的完整实现
- 事务支持/发布确认
- 消息持久化
3.KafKa
- Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。
- 特性
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
- 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万 的消息。
- 支持通过Kafka服务器和消费机集群来分区消息。
消息中间件对比
ActiveMQ
spring boot项目中集成
根据网友所提供的资料来看,这些mqtt客户端如果按照简单集成,大多更适用于开发单机客户端程序,当消息数量持续增长,需要自己再做进一步的优化