Eclipse Hono新增Apache Kafka支持:设备消息传递更顺畅
Eclipse Hono是连接大量异构设备至(云)后端的开源项目。Hono定义服务接口,实现设备间统一通信——设备可能用截然不同协议——以及业务应用。项目运行已久,在博世IoT设备管理中成功应用多年。新进展是现支持Apache Kafka消息传递。本文介绍由此带来的收益与Hono使用变化。
设备数据经Hono协议适配器(如MQTT、HTTP、CoAP适配器)转为统一消息格式,传递给消息系统。业务应用直接从消息系统读取遥测消息或事件(也可用命令与控制向设备发消息并收响应)。消息系统非Hono组成部分需外部提供,迄今用AMQP 1.0协议。
1.7版起,Hono以技术预览支持Apache Kafka消息传递。Hono关键特性是定义并实现消息向/从消息系统转发的API。因API定义基于消息系统并直接依赖其特性,支持新消息系统是Hono根本性创新。Hono所有消息API(遥测、事件、命令与控制)均新增基于Kafka的规范,面向协议适配器与业务应用双向。为确保行为尽可能与基于AMQP的API一致,进行了细致设计。
收益
Apache Kafka是为极高吞吐设计的分布式事件流平台,提供消息顺序特定保证。契合Hono消息传递需求,关键收益:
- 扩展性:多Kafka服务器集群并行运行,可按需扩展。Kafka优化允许多进程并发读写。AMQP 1.0虽也支持多进程并行消费同地址消息,但会丢失顺序。
- 消息有序性:Kafka核心特性是通过分区键分区数据,可选择须保持顺序的数据与可并行处理的数据。Hono中此机制轻松保证单设备所有事件按正确顺序交付业务应用。设备遥测数据可并行处理且顺序也受保。所有其他设备消息可完全独立并行消费,甚至多业务应用实例并发。
- 广泛采用:Kafka被大量企业使用,获许多技术支持。多家公司提供Kafka即服务,可在各云平台预订。易为Hono提供专业运营消息系统。也规避供应商锁定。
变化
AMQP 1.0是对等点连接交换消息的通信协议。相反,Kafka集群由协调数据写入(读取)持久存储的代理组成。此差异有两后果:第一,消息在最终删除前可用一段时间检索。用AMQP在Hono达成此效果,通常提供单独消息代理存储事件以防业务应用暂时不可用时消息丢失。Kafka下所有消息均存储,含遥测消息(存储时长取决于Kafka集群遥测主题配置)。第二,经持久存储通信解耦发送接收操作:协议适配器无法再向设备反馈当前无消费者连接。取而代之,它仅存储消息,"不知"业务应用何时或是否读取。
试用指南
安装Hono需部署AMQP消息网络或Kafka集群。也可配置Hono同时用两套消息系统。各租户(设备与配置子集)可独立配置用AMQP或Kafka。Hono项目提供公开沙箱环境,可在线体验AMQP或Kafka消息传递。
实战示例
演示如何在Hono沙箱使用基于Kafka消息传递。用HTTP协议适配器发送遥测消息,再从Kafka集群读取。
用命令行发HTTP命令模拟联网设备,用流行开源工具curl。未安装请参考curl官网。模拟业务应用用Hono命令行客户端,从Hono下载页获取。需Java 11+运行。
若下述命令失效(此类说明常有此情况),请参考Kafka消息指南获取更详细解释。
注册设备
先在沙箱创建新租户避免干扰他人。以下命令创建租户并配置用Kafka消息传递:
$ curl -i -H "content-type: application/json" --data-binary '{
"ext": {
"messaging-type": "kafka"
}
}' https://hono.eclipseprojects.io:28080/v1/tenants
输出应含类似:{"id":"85f63e23-1b78-4156-8500-debcbd1a8d35"}。
复制此ID设为环境变量:
$ export MY_TENANT=85f63e23-1b78-4156-8500-debcbd1a8d35
为租户注册设备:
$ curl -i -X POST https://hono.eclipseprojects.io:28080/v1/devices/$MY_TENANT
再次将返回ID设为环境变量:
$ export MY_DEVICE=4412abe2-f219-4099-ae14-b446604ae9c6
最后设置设备密码:
$ export MY_PWD=my-pwd
$ curl -i -X PUT -H "content-type: application/json" --data-binary '[{
"type": "hashed-password",
"auth-id": "'$MY_DEVICE'",
"secrets": [{
"pwd-plain": "'$MY_PWD'"
}]
}]' https://hono.eclipseprojects.io:28080/v1/credentials/$MY_TENANT/$MY_DEVICE
发送消息
设备注册后可收发消息。
打开第二终端窗口接收消息。进入Hono命令行客户端下载目录。启动客户端:
# in directory where the hono-cli-*-exec.jar file has been downloaded to $ java -jar hono-cli-*-exec.jar --spring.profiles.active=receiver,sandbox,kafka --tenant.id="my-tenant"
输出含类似行即就绪:
10:23:01.807 [vert.x-eventloop-thread-0] INFO org.eclipse.hono.cli.app.Receiver - Receiver [tenant: 85f63e23-1b78-4156-8500-debcbd1a8d35, mode: all] created successfully, hit ctrl-c to exit
回首终端,发送遥测消息到HTTP协议适配器:
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type: application/json" --data-binary '{"temp": 42}' https://hono.eclipseprojects.io:8080/telemetry
消息应在第二终端打印。
也可发送事件:
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type: application/json" --data-binary '{"hello": "kafka"}' https://hono.eclipseprojects.io:8080/event
希望您已成功将消息从模拟设备发至Hono并从Kafka集群消费。后续可参考Hono Kafka消息指南更详细示例,含业务应用向设备发命令并获响应。若想深入,可查阅Hono API规范中的Kafka基础API规格。
结语
消息系统是Eclipse Hono核心功能基础,其接口构建于之上。支持Kafka与AMQP 1.0并存是Hono深远变革,极力确保接口易映射。Kafka关键优势:扩展性、顺序保证、广泛采用、丰富商业服务。与AMQP主要差异:所有消息类型均经代理,即接收端暂时断连消息仍可投递;通信在时间上也解耦,消息发送方不再能获接收方直接反馈。简短实战例演示了如何从模拟设备发消息至Hono沙箱并从Kafka集群消费。
工业技术