跳到主要内容

配置消息缓存

本节提供了有关当使用 PubSub+ 缓存设施为客户端提供最后值缓存更新时,如何处理非书籍和订单簿数据以及字典的传入 OpenMAMA 消息的信息。它还提供了有关如何配置 SolOpenMAMA 插件的信息,该插件是 OpenMAMA 处理和处理所必需的。

当使用 PubSub+ 缓存设施与 Solace OpenMAMA 消息解决方案一起使用时,可能会发生以下消息交换模式:

  • 连接到特定消息 VPN 的发布客户端可以向众所周知的主题(即,符号)发布带有初始值或增量更新的消息,事件代理将消息分发给属于分配了匹配主题订阅的缓存集群的所有 PubSub+ 缓存实例。PubSub+ 缓存实例被配置为仅保留主题的最新消息,而不是多条消息。
  • 连接到同一消息 VPN 并希望获取带有最新更新的初始值的订阅客户端可以向属于该消息 VPN 的分布式缓存、缓存集群或 PubSub+ 缓存实例发送特定主题的缓存请求。事件代理消息总线会在缓存请求主题消息的 PubSub+ 缓存实例之间对客户端缓存请求进行负载均衡,并且单个 PubSub+ 缓存实例将向请求客户端返回带有请求主题的最后值缓存消息的缓存响应。

为了确保缓存的 OpenMAMA 消息具有最新的值,每个 PubSub+ 缓存实例必须使用 Solace 提供的 PubSub+ 缓存传入消息插件(solopenmama_plugin)。SolOpenMAMA 插件处理非书籍、订单簿和字典消息。

SolOpenMAMA 插件检查每条收到的消息,然后使用 OpenMAMA 库来正确处理它们。例如,SolOpenMAMA 插件将主题的初始值消息存储在其父 PubSub+ 缓存实例中,并且当它收到后续更新消息时,它将增量值更新应用于缓存消息中主题的适当字段。如有必要,它也可以丢弃收到的消息。

SolOpenMAMA 插件使用 OpenMAMDA 根据在托管 PubSub+ 缓存实例的服务器上本地安装的单个字典文件来处理订单簿的更新。

消息缓存过程

当 PubSub+ 缓存实例收到特定主题的传入 OpenMAMA 消息时,SolOpenMAMA 插件获取消息负载,然后检查消息。

一旦消息被识别为有效的 OpenMAMA 消息(非书籍、订单簿、数据字典或删除),插件就会根据其类型以适当的方式处理消息,并指示 PubSub+ 缓存实例是否缓存该消息以及对主题的缓存内容执行什么操作。

插件对收到的消息类型执行以下操作:

  • 初始值消息 — 插件不对消息进行任何修改,并将其未经修改地写入 PubSub+ 缓存实例。
  • 初始值订单簿消息 — 插件不对消息进行任何修改,并将其未经修改地写入 PubSub+ 缓存实例。
  • 初始值字典消息 — 插件不对消息进行任何修改,并将其未经修改地写入 PubSub+ 缓存实例。
  • 更新消息 — 插件从 PubSub+ 缓存实例中检索符号的缓存消息,然后将新消息中的更新应用于适当的字段。然后将更新后的消息写回 PubSub+ 缓存实例。
  • 更新订单簿消息 — 插件从 PubSub+ 缓存实例中检索订单簿的缓存消息,然后将新消息中的更新应用于适当的字段。然后将更新后的消息写回 PubSub+ 缓存实例。
  • 删除消息 — 插件指示 PubSub+ 缓存实例删除给定主题的缓存消息,然后丢弃收到的删除消息。删除消息可以是针对非书籍、书籍或字典数据的。
  • 意外消息 — 插件丢弃收到的消息并生成警告日志消息。

有关 SolOpenMAMA 插件如何处理特定的、枚举的 OpenMAMA 消息的详细信息,请参阅 OpenMAMA 消息类型处理。

SolOpenMAMA 插件与客户定义的 PubSub+ 缓存传入插件不同,因为 Solace 预定义了收到的 OpenMAMA 消息要执行的操作。这确保了 OpenMAMA 消息以标准、可预测的方式处理。(有关客户定义的 PubSub+ 缓存传入插件的操作和配置的详细信息,请参阅传入消息插件。)

数据丢失检测

PubSub+ 缓存实例存储特定主题集的 OpenMAMA 消息的参考副本,但没有中央网络实体能够重放缺失的 OpenMAMA 消息数据到 PubSub+ 缓存实例。因此,PubSub+ 缓存插件无法检查数据丢失或在符号数据丢失时执行任何特定操作。

有关 PubSub+ 缓存如何处理丢失消息的信息,请参阅配置停止丢失消息行为。

配置SolOpenMAMA插件

SolOpenMAMA 插件的配置是通过一个特殊的 mama.properties 文件提供的,该文件用于 SolOpenMAMA 插件。这个 mama.properties 文件与 Solace 中间件桥接使用的同名配置文件不同,每个用于处理 OpenMAMA 消息的 PubSub+ 缓存实例都需要这个文件。从 SolOpenMAMA 7.5.0 发布版开始,PubSub+ 缓存实例处理消息如下:

  • 非书籍消息 — PubSub+ 缓存实例可以处理负载版本 1 和 2 的消息。只有当更新消息的负载版本与该主题接收到的初始消息的负载版本匹配时,才会缓存更新消息。可以使用不同负载版本的新初始消息替换初始消息,但负载版本与初始消息不同的更新消息不会被缓存。
  • 书籍消息 — PubSub+ 缓存实例要求使用负载版本 2 发布书籍消息。使用负载版本 1 的书籍消息将被 PubSub+ 缓存实例丢弃。

使用 SolOpenMAMA 7.5.0 之前的版本的客户端可以继续运行,但负载版本 1 的书籍消息将被 PubSub+ 缓存丢弃。

通常,配置文件位于托管 PubSub+ 缓存实例的 Linux 服务器上安装 SolOpenMAMA 插件的同一目录中。必须在 WOMBAT_PATH 环境变量中指定用于 SolOpenMAMA 插件的 mama.properties 文件的位置。

要修改 PubSub+ 缓存实例的 SolOpenMAMA 插件的配置,可以使用文本编辑器编辑其 mama.properties 文件。对该文件所做的任何更改只有在 SolOpenMAMA 插件成功初始化后才会生效。

可以对 SolOpenMAMA 插件进行以下配置更改:

  • 插件字典文件 — 要配置 SolOpenMAMA 插件使用的字典文件以处理订单簿消息,请编辑 SolOpenMAMA 插件的 mama.properties 文件中的 mama.solace.cacheplugin.dictionary.filename 属性。为 SolOpenMAMA 插件指定的数据字典必须遵循 OpenMAMA 字典文件格式。一个字典文件可以用于几个 OpenMAMA 发布源(通过属性层次结构中的 <source> 元素指定)。

该字典文件必须保存在托管 PubSub+ 缓存实例的服务器上。默认情况下,使用名为 dictionary 的文件。

插件不会监视字典文件的更改。因此,如果在使用过程中更新了字典,则必须重新启动 PubSub+ 缓存实例,以便更新生效。

  • 无缓存条目的更新处理 — 当 SolOpenMAMA 插件收到没有现有缓存条目的非书籍更新消息时,它可以指示 PubSub+ 缓存实例丢弃该消息(默认行为),或者缓存该消息。

要配置没有现有缓存条目的更新消息的处理行为,请编辑 mama.properties 文件中的 mama.solace.cacheplugin.update.update_before_initial 属性。指定 discard 表示 PubSub+ 缓存实例应丢弃更新,或指定 cache 表示 PubSub+ 缓存实例应缓存它们。

  • 子消息处理 — 当 SolOpenMAMA 插件收到具有子消息字段(mama 字段类型:MAMAM_FIELD_TYPE_MSG)数据的非书籍更新消息时,它可以:
    • 替换现有值 — 缓存消息中子消息字段的值将被收到消息中相应子消息字段的值替换。这是默认行为。
    • 合并值 — 收到消息中子消息字段的值将与缓存消息中子消息字段的值合并。当使用合并时,如果子消息本身包含子消息字段,则合并将递归应用于缓存消息和更新消息之间处于同一层次结构级别的子消息字段。

要配置具有子消息字段的非书籍更新消息的处理,请编辑 mama.properties 文件中的 mama.solace.cacheplugin.submsg_field_alg 属性。指定 replace(默认值)或 merge,以指示 SolOpenMAMA 插件要执行的处理操作。

调整消息缓存性能

PubSub+ 缓存和 SolOpenMAMA 插件使用固定大小的缓冲区来存储传入消息。为了优化性能和内存利用率,必须在每个 PubSub+ 缓存实例的配置文件中调整缓冲区大小,以匹配应用程序预期的消息大小。例如,以下添加到 PubSub+ 缓存实例配置文件中的行将缓冲区大小设置为 4096、8192、16384、32768 和 65536 字节。

# 数据缓冲区大小
GLOBAL_DBQUANTA_SIZE_0 4096
GLOBAL_DBQUANTA_SIZE_1 8192
GLOBAL_DBQUANTA_SIZE_2 16384
GLOBAL_DBQUANTA_SIZE_3 32768
GLOBAL_DBQUANTA_SIZE_4 65536

就 CPU 利用率而言,为了获得最佳性能,GLOBAL_DBQUANTA_SIZE_4 必须大于大多数预期消息。例如,如果 95% 的消息小于 65536 字节,则应将 GLOBAL_DBQUANTA_SIZE_4 设置为 65536。

处理大于 GLOBAL_DBQUANTA_SIZE_4 的消息会更加占用 CPU,但当这些大消息被释放时,相关内存将被保证释放回操作系统,供其他进程使用。

必须重新启动 PubSub+ 缓存实例进程,才能使对其缓冲区大小的更改生效。

PubSub+缓存日志

每个 PubSub+ 缓存实例都会生成在事件代理消息总线上发布的消息 VPN 级别事件。指定路由器上的缓存管理器监听这些缓存事件,并将它们与事件代理自己的事件整合,然后这些事件被重定向到 OpenMAMA 日志记录设施。有关 SolOpenMAMA 日志记录的详细信息,请参阅日志记录。

SolOpenMAMA 插件生成的任何 MAMA 日志都包含在 PubSub+ 缓存实例的 PubSub+ 缓存日志中。为了将它们与其他 PubSub+ 缓存日志区分开来,它们被标记为 Mama Logs。

有关 PubSub+ 缓存事件的完整列表,请参阅系统日志事件参考,其中列出了与系统范围、消息 VPN 和本地客户端 PubSub+ 事件相关的 PubSub+ 系统日志消息。

有关 PubSub+ 缓存事件的详细信息,请参阅监控 PubSub+ 缓存。