在 Apigee Hybrid 中配置大型消息载荷支持

概览

从 1.14.2 版开始,Apigee Hybrid 支持高达 30MB 的大型消息载荷。从 1.14.3 版开始,Apigee Hybrid 可以允许高达 75MB 的大型消息载荷。默认消息载荷大小为 10 MB。请参阅消息载荷大小

配置对最大 30MB 的消息载荷的支持

如需使混合安装中的环境支持大型消息载荷,您需要对运行时配置进行以下更改:

  • 将堆大小增加到至少 4Gi。
  • 将内存限制提高到至少 6Gi。
  • 将内存资源请求增加到至少 4Gi。

您可以为单个环境或安装中的所有环境配置这些设置。

配置各个环境以支持大型消息载荷

如果配置为支持大型消息载荷的代理仅在安装中的一个或少数几个环境中具有端点,您可以配置这些环境以支持大型载荷。这样可以避免向不需要支持大型载荷的环境添加额外的内存。

如需将各个环境配置为支持大型消息载荷,您可以使用 envs.components.runtime 属性。对 overrides.yaml 文件进行以下更改:

  1. 将以下节添加到 overrides.yaml 文件:
    envs:
    - name: ENV_NAME
      components.
        runtime:
          cwcAppend:
            bin_setenv_max_mem: 4096Mi   # Increase max heap size to 4 gigs
          resources:
            requests:
              memory: 4Gi
            limits:
              memory: 6Gi
    

    请参阅:

  2. 升级您要更新的每个环境的 apigee-env 图表:

    试运行:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE \
      --dry-run=server
    
    • ENV_RELEASE_NAME 是用于跟踪 apigee-env 图表的安装和升级情况的名称。此名称必须与安装中的其他 Helm 版本名称不同。 通常,这与 ENV_NAME 相同。但是,如果环境与环境组具有相同的名称,则您必须为环境和环境组使用不同的版本名称,例如 dev-env-releasedev-envgroup-release。如需详细了解 Helm 中的版本,请参阅 Helm 文档中的三大概念
    • ENV_NAME 是您要升级的环境的名称。
    • OVERRIDES_FILE 是修改后的 overrides.yaml 文件。
  3. 升级图表:

    试运行:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE
    

配置所有环境以支持大型消息载荷

runtime 节所做的更改将为安装中的所有环境设置堆和内存限制。您可以使用 envs.components.runtime 属性为各个环境替换这些设置。

  1. 将以下节添加到 overrides.yaml 文件:
    runtime:
      cwcAppend:
        bin_setenv_max_mem: 4096Mi   # Increase max heap size to 4 gigs
      resources:
        requests:
          memory: 4Gi
        limits:
          memory: 6Gi
    

    请参阅:

  2. 升级安装中每个环境的 apigee-env 图表:

    试运行:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE \
      --dry-run=server
    

    升级图表:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE
    

关于 30MB 到 75MB 之间的消息载荷的指南

在处理大型载荷时,确定消息处理器的最佳堆大小取决于您的具体应用场景;不过,Apigee 提供了一般性指南来帮助您完成此过程。

如需计算每个消息处理器 (MP) 的堆大小,请使用以下值:

  • Q - 每个 MP Pod 的最大 QPS
  • L - 每个请求的往返延迟时间(预期延迟时间的第 95 百分位)
  • C - 每个 MP 的总并发数,即在任意给定时间可同时在 MP 中持久存在的请求数量上限。计算公式为 C = Q * L
  • P_req - 客户端发送给 Apigee 的请求的载荷大小(以 MB 为单位)
  • P_resp - 从目标收到的响应的载荷大小(以 MB 为单位)
  • S - 安全系数(Apigee 建议的范围为 1.5 - 2)
  • BASE_HEAP - 用于考虑非请求相关资源(例如代理配置)的基本堆大小。(Apigee 建议使用 3072Mi

考虑到安全系数 S 和基本堆大小,每个 MP 的总堆大小按以下公式计算:

每个 MP 的堆大小 = BASE_HEAP + C * (P_req + P_resp) * S

大型载荷场景的基本替换配置为:

envs:
  components:
    runtime:
      resources:
        requests:
          cpu: 2000m
          memory: 2Gi
        limits:
          cpu: 4000m
          memory: 4Gi
      cwcAppend:
        bin_setenv_max_mem: 3072Mi # base heap size

计算示例

以下是使用以下值的计算示例:

  • 每秒查询次数上限,Q2
  • 延迟时间,L7 秒
  • 请求载荷大小,P_req40MB
  • 响应载荷大小,P_resp40MB
  • 安全系数,S1.5
  • 基本堆大小,BASE_HEAP3072Mi

堆大小 = 3072 + (2 * 7) * (40+40) * 1.5 = 4752Mi

预计 limits.memory 比建议的堆大 1Gi,以考虑操作系统开销和其他非堆内存使用情况。

在此示例中,您需要将以下内容添加到 overrides.yaml

envs:
  components:
    runtime:
      resources:
        requests:
          memory: 4Gi
        limits:
          memory: 5.75Gi # approximately 1Gi over 4.75Gi
      cwcAppend:
        bin_setenv_max_mem: 4752Mi

注意事项

流量突增

HPA 可确保 MP 随着 QPS 的增加而扩容。不过,HPA 大约需要 60 秒才能触发扩容。流量突增过高可能会导致 MP 上出现内存不足 (OOM) 错误。

如果您预计会出现此类流量突增,请使用看起来合适的安全系数来增加堆用量。例如 S = 2

= BASE_HEAP + (Q * L) * (P_req + P_resp) * 2

政策使用情况

上述计算不包括政策使用情况。Apigee 允许客户复制其请求/响应载荷,这可能会显著改变堆使用情况。

例如,如果您有一个 JavaScript 政策,该政策会创建整个目标响应的 3 个副本,则应使用以下等式:

Heap per MP = Base Heap + (Q * L) * (P_req + P_resp * 4) * S

以下是一些可能会增加内存用量的政策示例:

  • AssignMessage
  • JavaScript 标注
  • JavaCallout

监控

本文提供的准则旨在作为起点。强烈建议您监控内存用量并设置相关提醒。如果堆用量一直很高,请使用更高的安全系数。

另请参阅: