在容器中配置App Connect Enterprise的嵌入式全局缓存

本文详细介绍了如何在基于Kubernetes的容器环境中配置App Connect Enterprise 13.0.3.0的嵌入式全局缓存,包括配置参数说明、多集成运行时示例、服务暴露方法以及缓存管理命令和注意事项。

配置运行在容器中的App Connect Enterprise嵌入式全局缓存

随着App Connect Enterprise 13.0.3.0的发布,新的嵌入式全局缓存已作为较旧的WebSphere eXtreme Scale(WXS)嵌入式缓存的替代品引入,现在称为嵌入式WXS网格。如产品方向声明中所述,嵌入式WXS网格现已弃用,但只要Java 8在ACE中继续受支持,它仍将保持功能。

与其前身类似,嵌入式全局缓存允许您在同一集成流、不同流之间甚至跨多个集成服务器存储和重用数据,从而消除了对数据库等替代持久性解决方案的需求。

嵌入式全局缓存的关键优势之一是其同时支持Java 8和Java 17,以及简化的配置和操作。它针对容器化环境进行了优化,默认启用,在存储数据之前几乎不消耗CPU和内存资源。它还可以独立运行,无需复制,类似于本地缓存。

在本文中,我们将指导您完成在基于Kubernetes的环境(如Red Hat OpenShift)中运行的集成运行时中设置嵌入式全局缓存的配置过程。我们将涵盖分步说明和重要注意事项,以帮助您在容器化平台中顺利启动和运行ACE。

全局缓存配置参数

我们将重点关注server.conf.yaml中全局缓存配置节的以下参数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ResourceManagers:
  GlobalCache:
    #replicateReadsFrom: 'exampleServer1,exampleServer2' # 一个逗号分隔的有序服务器名称列表,设置在ReplicationServers块中,在复制“读取”操作时应按指定顺序从中读取。
    #replicateWritesTo: 'exampleServer1,exampleServer2' # 一个逗号分隔的无序服务器名称列表,设置在ReplicationServers块中,在复制“写入”操作时应写入到这些服务器。
    #ReplicationServers:
    ## 这里的每个块描述了一个在复制读取和写入操作期间可能连接到的服务器。为您想要连接的每个服务器配置一个条目。
    ## 为每个服务器指定的名称在此服务器内必须唯一。
    #exampleServer1:
    #  Hostname: 'localhost'   # 设置远程服务器的主机名
    #  Port: 7901              # 设置复制监听器正在监听的端口号
    #  EnableTLS: true         # 设置为false以禁用TLS。您必须配置下面的TLS参数以完成TLS设置。
    #ReplicationListener:
    ## 复制监听器允许其他集成服务器与此集成服务器内的嵌入式缓存通信。
    ## 如果您希望允许其他服务器从此服务器复制读取和/或向此服务器复制写入,请启用此监听器。
    #StartListener: false    # 设置为true以启动嵌入式缓存的复制监听器
    #EnableTLS: true         # 设置为false以禁用TLS。您必须单独配置下面的TLS参数以完成TLS设置。
    #ListenerPort: 7900      # 设置为非零以设置特定端口,默认为7900

具有三个集成运行时的示例缓存配置

在每个集成运行时中,我们部署与该服务器中的嵌入式全局缓存交互的消息流。以下配置在每个集成运行时的server.conf.yaml中设置:

集成运行时IR1

  • replicateWritesTo:集成运行时IR1配置为将其自身消息流的缓存写入复制到集成运行时IR2,因此由IR1的消息流放入或更新到IR1的嵌入式缓存的任何值将异步复制到IR2。如果配置了多个replicationWritesTo服务器,异步写入请求将发送到所有配置的集成服务器。
  • replicateReadsFrom:IR1配置为从服务器2复制任何缺失的读取,即如果值不存在于IR1的嵌入式缓存中,它将在继续之前同步从IR2请求该值。
  • ReplicationListener:IR1还配置为允许其他服务器通过端口7900上的复制监听器读取和写入其自身的缓存。

集成运行时IR2

  • ReplicationListener:集成运行时IR2配置为允许其他服务器通过端口7900上的复制监听器读取和写入其自身的缓存。

集成运行时IR3

  • replicateWritesTo:集成运行时IR3配置为将其自身消息流的缓存写入复制到集成运行时IR1和集成运行时IR2。因此由IR3的消息流放入或更新到IR3的嵌入式缓存的任何值将异步复制到IR1和IR2。
  • replicateReadsFrom:IR3配置为从IR1和IR2复制任何缺失的读取,即如果值不存在于IR3的嵌入式缓存中,它将在继续之前同步从IR1和IR2请求该值。

在Kubernetes环境中,每个IntegrationRuntime作为一个POD运行。为了在IR之间进行缓存的读取和写入通信,必须在集群内暴露ReplicationListener端口。

您可以在创建IntegrationRuntime时通过额外配置IntegrationRuntime CR上的服务来完成此操作。

您还可以通过添加以下节来编辑现有的IR YAML:

1
2
3
4
5
6
7
8
spec:
  service:
    ports:
      - name: globalcache
        port: 7900
        protocol: TCP
        targetPort: 7900
    type: ClusterIP

一旦IR创建/更新了服务详细信息,您可以观察到端口7900对该服务可用,在此示例中为global-cache-eg1-ir。

然后,您可以使用服务名称作为主机名在暴露的端口上的pod之间进行通信。正如您可能已经注意到的,我们在ReplicationServers下使用了以下主机名和端口进行配置。主机名采用以下形式:[service name].[namespace].svc

1
2
3
4
5
ReplicationServers:
  server2:
    Hostname: 'global-cache-eg2-ir.ace.svc'
    EnableTLS: false
    Port: 7900

您现在可以通过处理一些将数据写入IR1中的缓存的消息并在IR2或IR3中运行的另一个消息流中检索/读取值来测试您的消息流。

在容器中管理缓存

新的嵌入式全局缓存的管理通过两个新的ibmint命令完成:ibmint display cache和ibmint clear cache,如果您在本地VM环境中运行。在容器环境中,您可以使用global-cache资源管理器来查询映射统计信息。

要查看映射列表:

1
curl --unix-socket /home/aceuser/ace-server/config/IntegrationServer.uds http://localhost/apiv2/resource-managers/global-cache/maps?depth=3

您也可以通过ACE仪表板UI查看它。

要清除特定映射的缓存:

1
curl --unix-socket /home/aceuser/ace-server/config/IntegrationServer.uds -X POST http://localhost/apiv2/servers/{server}/resource-managers/global-cache/maps/{global-cache-map-name}/clear

一些额外的管理API:

  • 获取全局缓存复制监听器对象:GET /apiv2/servers/{server}/resource-managers/global-cache/replication-listener
  • 列出全局缓存复制服务器对象:GET /apiv2/servers/{server}/resource-managers/global-cache/replication-servers
  • 获取特定映射的详细信息:GET /apiv2/servers/{server}/resource-managers/global-cache/maps/{global-cache-map-name}

在容器中使用嵌入式全局缓存的注意事项

在容器环境中,建议设置一个“网格”,其中每个IR都配置为读取和写入所有其他IR,以便缓存数据在所有IR的所有副本中都是最新的。一个可能的风险是,如果您有一个定期更新的缓存项,没有任何过期时间且连接不可靠,您可能会遇到不同服务器对该缓存项具有不同值的情况,其中更新成功写入到例如4个其他服务器中的3个,但与第4个服务器的连接中断,因此服务器4仍然具有旧值,并且因为服务器4有一个值,它不会向其他服务器询问该值是什么。

如果您有多个IR Pod的副本,缓存值在每个副本中可能不同,具体取决于消息如何路由到每个副本。在多副本场景中设计缓存拓扑时应牢记这一因素。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计