回页首
共享订阅允许用户构建可扩展的应用程序,它将通过对应用程序连接到 IoT Foundation 的方式作出一些更改,在多个应用程序实例之间实现设备事件的负载平衡。如下图所示,通过使用共享订阅支持,可以在应用程序 1 和应用程序 2 之间共享设备事件。
如果某个后端企业应用程序实例无法适应发布到特定主题空间的消息的数量,则可能需要使用共享订阅功能。例如,如果许多设备都在发布事件,而这些事件由单个应用程序处理,则可能需要使用共享订阅。IoTF 服务扩展了 MQTT 3.1.1 规范,为共享订阅提供了支持,而且仅限于非持久订阅。当非持久性应用程序从 IoT Foundation 断开连接时,IoT Foundation 不再保留这些消息。
请参阅文档的 可扩展应用程序 部分,了解有关共享订阅支持的更多信息。
本文通过运行一个示例应用程序演示了共享订阅支持——本文将帮助您在有共享订阅支持和没有共享订阅支持的情况下构建可扩展应用程序。本文是为 Windows 平台编写的,但也可以应用于其他平台上。
回页首
本文中使用了两个示例来演示共享订阅支持:
两个示例都是用 Java Client Library for IBM IoT Foundation 编写的,简化了与 IBM IoT Foundation 的交互。
IBM IoT Foundation 的 Java Client Library 根据用户为属性 “ Enable-Shared-Subscription” 设置的值来启用共享订阅支持。当 “ Enable-Shared-Subscription ”属性被设置为 “true” 时,会在共享订阅模式下连接应用程序,否则会在独立模式(默认行为)下建立连接。为了启用共享订阅支持或可扩展的应用程序支持,该库在内部以 “ A:org_id:app_id ”的形式采用客户端 id 并连接到 IoT Foundation,其中
另外,不需要共享订阅支持的应用程序将会使用“ a:org_id:app_id” 形式的客户端 id 连接到 IoT Foundation。(请注意第一个字符的差别。)
在连接到 IoT Foundation 时,没有使用 客户端库 的应用程序必须使用 “A:org_id:app_id” 形式的客户端 id 来启用共享订阅支持。此外,应用程序的多个实例必须使用相同的客户端 id 建立连接,以便分担负载。
回页首
示例应用程序可以:
在这些示例中,当越来越多的设备开始发布事件时,某个应用程序实例可能无法处理负载。在这种情况下,共享订阅允许应用程序用户构建和运行多个应用程序实例,这样就可以在这些应用程序之间平均分担负载。
用户可以使用 Apache Spark 和 Spark 的更精确的流功能( Spark 流库 )来实时处理事件。对于共享订阅(可以使用相同的客户端 id 创建多个接收器 (DStreams) 来分担传入的负载), Apache Spark 流应用程序是最好的用例 。在负载增加时,应用程序开发人员只需担心是否设置了适当数量的接收器和执行器。(我们很快会在其他文章中演示此功能)。
回页首
为了演示共享订阅,我们需要设置 IoT Foundation Organization 并在其中注册设备。本节将演示如何完成相同的设置。
创建 IoT Foundation Organization
。记下这些细节,因为稍后我们需要使用它们与 IoT Foundation 进行交互。
组织 ID
设备类型
设备 ID
身份验证方法
身份验证令牌
回页首
为了演示共享订阅,我们需要将事件从设备发布到 IBM IoT Foundation 的已注册组织。本节将向您展示如何发布设备事件。
1. 从 GitHub 下载最新的 iotf java 客户端库:
https://github.com/ibm-messaging/iot-java/releases/download/0.0.4/com.ibm.iotf-0.0.4.zip
2. 解压归档文件 com.ibm.iotf-0.0.4.zip
3. 通过输入前面步骤中记下的以下设备注册细节来修改 device.prop 文件:
Organization-ID = <Your Organization ID> Device-Type = <Your Device Type> Device-ID = <Your Device ID> Authentication-Method = token Authentication-Token = <Your Device Token>
4. 打开一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。
5. 通过指定以下命令运行设备事件发布示例:
java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.device.DeviceEventPublishWithCounter
(示例代码呈现在 此处 )
6. 该代码使得设备每隔 1 秒发送一次事件——每个事件都包含计数器、名称、该过程的 cpu 使用和内存使用,如下所示:
7. 您会观察到,每当有新的事件发布,数据点“event-count“就会增加。
让我们在下面小节中通过应用程序使用和处理这些事件——使用和不使用共享订阅特性的情况。
回页首
如下图所示,在不使用共享订阅支持的情况下连接到 IBM IoT Foundation 时,不会在应用程序之间共享设备事件。
要将应用程序连接到 IBM IoT Foundation,必须生成 API 密钥和令牌。这可以通过执行以下步骤完成:
1. 从浏览器启动 IBM IoT Foundation 仪表板
2. 单击 ACCESS 选项卡
3. 单击 API Keys 选项卡
4. 单击“Generate API Key” 按钮,如下所示
5. 记下“ API Key ”和“ Authentication Token ”。我们需要使用这些信息连接到 IoT Foundation 来订阅设备事件。
1. 打开命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。
2. 通过输入您的组织 ID、应用程序的 API 密钥和身份验证令牌来修改 application.prop 文件,如下所示:
id = <Unique application id> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token>
(使用前面记下的 API 密钥和令牌替换此处的 API 密钥和令牌)
3. 通过指定以下命令运行应用程序示例:
java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample
4. 您会观察到,应用程序使用 a:org_id:app_id 形式的客户端 id(如下面的突出部分所示)连接到 IBM IoT Foundation。该客户端 id 以小写的 ‘ a ‘ 开头,这告诉 IoT Foundation 该应用程序是一个单独的应用程序,没有共享设备事件订阅。
5. 另外还请注意,应用程序会在设备发布事件时接收设备事件。例如,每隔 1 秒按照设备发布事件的相同顺序接收设备事件。(参见上图中的突出显示部分。)
6. 在运行应用程序的第一个实例的同时,会打开另一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。
7. 使用不同的应用程序 id 修改 application.prop 文件:
id = <Must be different from the first one> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token>
(注意:如果您尝试连接具有相同应用程序 id 的另一个应用程序,现有的应用程序会断开与 IoT Foundation 的连接。每个应用程序都必须通过提供唯一 id 来区分自身。)
8. 通过指定相同的命令运行应用程序示例的另一个实例:
java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample
9. 您会观察到,每个应用程序每隔 1 秒都会接收相同的一组事件。如下面突出显示部分所示,两个应用程序都接收了具有相同 “event-count” 值(509、510,等等)的事件。 也就是说,没有在这两个应用程序之间分担负载。
用户可能需要使用共享订阅来分担负载,这将在下一节中演示。
回页首
如下图所示,如果在使用共享订阅支持的情况下将应用程序连接到 IBM IoT Foundation,设备事件将会在这些应用程序之间共享。
1. 打开命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。
2. 通过输入您的组织 ID、应用程序的 API 密钥和身份验证令牌来修改 application.prop 文件,如下所示:
id = <Unique application id> Organization-ID = <Your Organization ID> API-Key = <Your Organization's API Key> Authentication-Token = <Your Organization's Token> Enable-Shared-Subscription = true
(Enable-Shared-Subscription 必须设置为 true,以便在共享订阅模式下运行应用程序)
3. 通过指定以下命令运行共享订阅示例:
java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample
(备注:该示例订阅了在给定组织中注册的所有设备事件,因此,如果您有多个已注册的设备,并且正在发送事件,那么观察到的结果可能会有所不同。)
4. 您会观察到,应用程序使用 A:org_id:app_id 形式的客户端 id(如下面突出显示的部分所示)连接到 IBM IoT Foundation。客户端 id 以大写字母 'A' 开头,这告诉 IoT Foundation 该应用程序是在共享订阅模式下建立连接的,并与使用客户端 id 连接到 IBM IoT Foundation 的其他应用程序一起分担负载。
5. 另请注意,应用程序会在设备发布事件时接收设备事件。也就是说,每隔 1 秒按照设备发布事件的顺序接收它们(参见上图中的突出显示部分)。由于目前只有一个应用程序实例在运行,所以它会接收由设备发布的所有事件。
6. 在应用程序的第一个实例运行的同时,会打开另一个命令提示符并导航到解压归档文件 com.ibm.iotf-0.0.4.zip 的目录。
7. 通过指定相同命令运行共享订阅示例的另一个实例:
java -cp com.ibm.iotf.client-0.0.4.jar;com.ibm.iotf.samples-0.0.4.jar; lib/* com.ibm.iotf.sample.client.application.SharedSubscriptionSample
(确保 application.prop 文件未被修改。为了实现负载平衡,必须使用相同应用程序 id 连接到 IoT Foundation)
8. 您会观察到,这两个应用程序共享了它们之间发布的所有事件,也就是说,目前在应用程序实例 1 和 2 之间 分担了负载 。如下面突出显示的部分所示,应用程序实例 1 接收 “event-count” 值为 2119 和 2121 的事件,而实例 2 接收 “event-count” 值为 2118 和 2120 的事件。
9. 停止一个应用程序实例,您会观察到,正在运行的实例使用了设备发布的所有事件,因为现在只有一个应用程序实例。类似地,如果您运行 3 个应用程序实例,则会在所有 3 个应用程序之间分担负载。
回页首
探索 IoT Foundation Event Recorder 文章 ,该文章展示了在将事件记录到 Cloudant NoSQL DB 中时,用户可以如何充分利用共享订阅特性。