物联网关键技术:消息队列
消息队列MQ连接物联网与后端系统(业务应用、数据分析)
大量的设备接入物联网平台后,会产生各种类型的事件和数据,对接到后端的各种服务,包括计算和存储。消息队列可以起到异步通信、应用解藕、削峰平谷的作用,是物联网平台不可缺少的组成部分。
EMQ的解决方案:IoT Broker可直接对接消息队列服务
消息队列技术选型
传统J2EE企业信息系统中要引入消息队列MQ实现异步消息机制,最早大家都使用ActiveMQ。Apache ActiveMQ是Apache软件基金会所研发的JMS消息中间件(JMS Provider),纯Java程序。ActiveMQ历史悠久,历史包袱也较多,所以现在用的不多了。
ActiveMQ模型:完全支持JMS 1.1和J2EE 1.4规范
后来大家开始用RabbitMQ。RabbitMQ是实现了高级消息队列协议(AMQP)的开源中间件,用Erlang语言编写,这是爱立信发明的一种编程语言。最早RabbitMQ应用于金融领域,现在依然被互联网的大小企业广泛应用。
RabbitMQ目前依然广泛应用在互联网行业
RabbitMQ的实现机制比较重,不太适合吞吐量非常大的场景。针对海量数据处理,很多公司会选择使用RocketMQ或者Kafka。
RocketMQ最初是由阿里巴巴消息中间件团队研发并用于生产环境,后来在2016年捐献给了Apache基金会并成为Apache340个顶级开源项目之一。
RocketMQ的最大特点是支持事务型消息,即确保消息发送和DB操作两方的最终一致性,且能支持大量topic。不过RocketMQ的社区还不够大,使用者相比Kafka来说较少一些,其中也不乏知名企业,比如滴滴出行就将RocketMQ用于核心业务系统。
Kafka架构图
在大数据领域的实时计算、日志采集等场景中,Kafka几乎已经成为行业标准了,社区活跃度很高,也非常适合用于对事务性要求不高的物联网场景中。与RocketMQ相比,如果topic太多,会影响吞吐量。
我们在成熟的消息队列产品中选型,对于数据量不大的物联网系统,可以使用RabbitMQ;对于海量数据,则需要考虑使用RocketMQ或Kafka。如果想尝试一下新的技术,那么可以考虑Pulsar这个后浪。
Pulsar要把Kafka拍在沙滩上
最近两年,Yahoo开发的开源消息中间件Pulsar颇受关注。Pulsar 就像是一个合二为一的产品,不仅可以像 Kafka 那样支持高速率的流处理场景,还能像RabbitMQ那样支持标准的消息队列模式。因此只需要运行一个 Pulsar 系统就可以同时处理实时流和消息队列。
在Pulsar中,数据分发与存储分离,Broker无状态,便于扩展
分区
- Kafka 中的所有主题都是分区的,这样可以增加吞吐量。通过分区,单个主题的处理速率可以得到大幅提升。
- Pulsar也支持分区,但不是必需的。Pulsar使用多个消费者实例同样可以提升处理速率。如果确实需要分区来进一步提升性能,那么也可以使用分区。
日志:
- Kafka 开发团队预见了日志对于一个实时数据交换系统的重要性。相比随机读取和写入,串行读取和写入速度更快。但当日志的量增长到很大的时候,在单台服务器上保存所有日志已经成为一个挑战。
- Pulsar 对日志进行分段,从而避免了拷贝大块的日志。通过 BookKeeper 将日志分段分散到多台不同的服务器上。也就是说,日志并不是保存在单台服务器上,所以任何一台服务器都不会成为整个系统的瓶颈。
无状态
- Kafka 不是无状态的,因为每个 broker 都包含了分区的所有日志,如果一个 broker 宕机,并非任意一 broker 都可以接替它的工作。
- 在 Pulsar 架构中,数据的分发和保存是相互独立的,broker是无状态的。broker 从生产者接收数据,然后将数据发送给消费者,但数据是保存在 BookKeeper 中的。如果工作负载很高,就可以直接添加新的 broker。
此外跨域复制是 Pulsar 的拿手好戏。Pulsar 在设计之初就考虑到了这个特性,配置也很容易。一些基准测试结果表明,Pulsar 可以在提供较高吞吐量的同时保持较低的延迟。
Pulsar 提供了很多与 Kafka 相似的特性,比如跨域复制、流式消息处理(Pulsar Function)、连接器(Pulsar IO)、基于 SQL 的主题查询(Pulsar SQL)等等,还有一些 Kafka 没有的特性,比如分层存储和多租户。
Kafka和Pulsar都很适合用于物联网领域,不过目前Kafka仍然占据主流地位,但未来Pulsar是否会取代Kafka,时间自会告诉我们答案。