开发解决方案

此解决方案的每个部分都使用 Java 实现,并使用 Maven 检索所需依赖项(如其 POM 文件所定义)。它包括通过调用 Maven 来编译和执行代码来运行应用程序的简单 shell 脚本。

运行脚本之前,需要在每种情况下修改 Environment 类以定义适当的连接详细信息,例如队列 OCID、部署区域等。对于函数和微服务,由于代码在容器内执行,因此需要执行一些额外的步骤。系统信息库中的自述文件介绍了在容器内包装 JAR 所需的步骤。在部署之前,函数和 OKE 托管的微服务的可执行文物都位于容器注册表 (Container Registry,OCIR) 中。

定制生产者代码

生成器实现 (com.demo.samples.basic.QueueProducer) 非常简单,由 main 方法和另外两种有助于生成消息内容的方法组成。main 方法可构建连接和传输对象,然后进入无限循环来创建新消息并发送它们。要定制该方法的有效负载,只需修改 prepareMessage。当前,此方法使用 GUID 创建一条简单消息,并利用 OCI 队列允许 API 一次发送 20 条消息这一事实。

量身定制消费者代码

使用者 (com.demo.consumer.QueueConsumer) 从通过 OKE 配置推送的环境变量中获取其配置。这样可以非常轻松地将使用者重新配置到不同的队列。批量工作是在 main 方法中进行的,当它具有队列连接时,会执行消息请求。名为 prepareGetMessageRequest 的辅助方法创建消息请求本身。该方法标识特定队列并设置 prepareGetMessageRequeston 将等待响应的持续时间(允许您配置长时间轮询)和可返回的最大消息数(最多 20 个)。
检索消息后,processMessage 方法将处理它们。

注:

在本手册中,该过程只是休眠,尽管您应该了解,实际应用程序可能需要一些时间来处理消息。
processMessage 方法应用线程休眠来模拟后端消息处理工作负荷时,您将看到扩展机制的工作方式。处理所有接收的消息后,系统会通知队列将其删除。

定制队列长度函数代码

队列长度函数包含一个名为 QueueLength 的类(在程序包 com.example.fn 中),该类以符合 OCI 函数需要的工作方式实施。这反过来又使用单独的类 GetStats,该类使用由 OCI 函数的配置注入的环境变量连接到队列并请求统计信息。结果取自 REST 响应并以 JSON 结构返回。

鉴于在函数外部执行的垂直缩放的简单性和决策,您无需修改此代码。

配置用于控制缩放的设置

除了配置提供程序、使用者和函数参数以便解决方案可以连接到队列之外,您还需要配置设置以控制使用 KEDA 实施的缩放。 您可以在 so-object.yaml 中看到此内容,需要使用 kubectl 发送到 OKE(系统信息库中的相关自述文件中提供了所有命令)。

此配置提供详细信息,描述 KEDA 触发 API 网关调用所需的频率、允许多少目标服务实例的边界以及目标的名称。配置还包括触发器定义,该定义指示要调用的 URL 来获取当前需求,以及实例可以纵向扩展或收缩的阈值,包括返回到 KEDA 进行决策的 JSON 对象的路径。