Eclipse Hono 支持 Apache Kafka 进行消息传递
Eclipse Hono 是一个开源项目,用于将大量异构设备连接到(云)后端。 Hono 定义了支持设备之间统一通信的服务接口,这些设备可能使用广泛不同的协议以及业务应用程序。该项目已经存在了一段时间,并已成功用于博世物联网设备管理多年。新的是它现在支持 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 集群由协调数据写入(和读取)到永久存储的代理组成。这种差异有两个后果:首先,消息在最终被删除之前可以检索一段时间。为了在 Hono 中使用 AMQP 实现这种效果,您通常会提供一个单独的消息代理,其中 事件 如果业务应用程序暂时不可用,则存储以避免消息丢失。使用 Kafka,每条消息都被存储。这包括遥测消息(但是,存储时间取决于 Kafka 集群中遥测主题的配置)。其次,通过永久存储进行通信将发送和接收操作彼此分离:如果当前没有消费者连接,协议适配器不能再向设备报告。相反,它只是存储消息而不“知道”业务应用程序是否或何时读取它们。
尝试一下
安装Hono时,需要部署AMQP消息网络或Kafka集群。也可以将 Hono 配置为使用 两者 消息系统。然后,可以将每个租户(设备和配置的子集)配置为使用 AMQP 或 Kafka。 Hono 项目在 Internet 上提供了一个可公开访问的沙箱环境,您可以在其中使用 AMQP 或基于 Kafka 的消息传递来试验 Hono。
实际例子
在下文中,我们将通过一个小示例向您介绍如何在 Hono 沙箱中使用基于 Apache Kafka 的消息传递。您将向 HTTP 协议适配器发送一条遥测消息,然后从 Kafka 集群中读取。
我们通过从命令行发送 HTTP 命令来模拟支持 Internet 的设备。为此,我们使用流行的开源工具 curl .如果您的电脑当前没有安装,请参考 curl 主页上的安装说明。为了模拟业务应用程序,我们使用 Hono 的命令行客户端,可以从 Hono 下载页面下载。请注意,Java 必须至少安装到版本 11 才能运行。
如果下面显示的任何命令不起作用(这些指令总是会发生),请参阅 Kafka 消息传递指南,其中的解释涵盖了更多详细信息。
注册设备
首先,您需要在沙箱中创建一个新租户,以避免干扰其他用户。以下命令创建一个具有随机 ID 的租户,并将其配置为使用 Kafka 进行消息传递。
$ curl -i -H "content-type:application/json" --data-binary '{ “分机”:{ “消息类型”:“卡夫卡” } }' http://hono.eclipseprojects.io:28080/v1/tenants
输出应包含以下内容:{"id":"85f63e23-1b78-4156-8500-debcbd1a8d35"}
.
现在复制这个 ID 并将其设置为环境变量,如下所示:
$出口MY_TENANT=85f63e23-1b78-4156-8500-debcbd1a8d35为租户注册设备:
$ curl -i -X POST http://hono.eclipseprojects.io:28080/v1/devices/$MY_TENANT并再次提供返回的 ID 作为环境变量,如下所示:
$出口MY_DEVICE=4412abe2-f219-4099-ae14-b446604ae9c6最后为设备设置密码:
$ export MY_PWD=my-pwd $ curl -i -X PUT -H "content-type:application/json" --data-binary '[{ "type":"散列密码", "auth-id":"'$MY_DEVICE'", “秘密”:[{ "pwd-plain":"'$MY_PWD'" }] }]' http://hono.eclipseprojects.io:28080/v1/credentials/$MY_TENANT/$MY_DEVICE发送消息
现在您已经注册了设备,您可以发送和接收消息了。
打开第二个终端窗口以接收消息。转到您下载 Hono 命令行客户端的目录。现在使用以下命令启动客户端,确保替换 my-tenant
使用您刚刚创建的租户的 ID:
如果输出包含类似于以下内容的行,则客户端已准备好接收消息: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] 创建成功,按 ctrl-c 退出
现在您可以从模拟设备向 Hono 发送消息。为此,请切换回第一个终端窗口。以下命令向 HTTP 协议适配器发送遥测消息:
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type:application/json" --data-binary '{"temp":42}' http://hono.eclipseprojects.io:8080 /遥测现在应该在第二个终端中打印该消息。
您还可以发送事件 :
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type:application/json" --data-binary '{"hello":"kafka"}' http://hono.eclipseprojects.io :8080/事件现在,您应该已经成功地从设备向 Hono 发送消息并从 Kafka 集群接收它们。下一步,您可以查看 Hono 的 Kafka Messaging Guide 中更详细的示例。它还向您展示了如何从业务应用程序向设备发送命令并对其做出响应。如果你想深入挖掘,你可能想看看基于 Kafka 的 API 的规范,可以在 Hono 的 API 规范中找到。
结论
消息系统是 Eclipse Hono 核心功能的基础,因为它的接口是在它之上提供的。支持 Kafka 和 AMQP 1.0 对 Hono 来说是一个非常深刻的变化,它非常重视确保接口可以轻松地相互映射。 Kafka 的主要优势在于其可扩展性、排序保证、广泛采用以及丰富的商业服务产品。使用 AMQP 进行消息传递的主要区别在于,所有消息类型都经过代理。这意味着即使收件人暂时断开连接,消息也可以传递。通信在时间上也是解耦的,因此不再可能从接收者到发送者的直接反馈。在一个简短的实际示例中,我们向您展示了如何将消息从模拟设备发送到 Hono 沙箱并从 Kafka 集群中使用它们。
工业技术