跳到主要内容

复制工作原理

本节提供了复制工作的简化描述。所有图表和描述都是针对同步复制模式,即在响应客户端之前,消息会存储在两个站点上。有关消息复制的更多详细信息,请参见同步和异步消息复制。

复制过程可能因保证消息是否是事务的一部分而有所不同。本地和 XA 事务的处理方式也有所不同。

非事务性消息

下图提供了一个示例,展示了复制如何传播已发布到主题的非事务性保证消息。图表显示了一个复制组,包括纽约数据中心(活动复制站点)和波士顿数据中心(备用复制站点)。

img

这个过程的详细步骤(对应图表中的数字)如下:

  1. 客户端发布一条与活动复制状态的消息 VPN 配置的复制主题订阅匹配的消息。消息在事件代理上持久化。

  2. 消息的副本通过在启用消息 VPN 的复制时自动创建的复制桥(名为 #MSGVPN_REPLICATION_BRIDGE)发送。此桥将纽约数据中心的消息 VPN 与活动复制状态链接到其在波士顿数据中心具有备用复制状态的同名伙伴消息 VPN。

    为了增加安全性,可以在消息 VPN 复制桥和复制 Config-Sync 桥上使用传输层安全性(TLS)/安全套接字层(SSL)加密。有关在复制 Config-Sync 桥和消息 VPN 复制桥上使用 SSL 加密的信息,请参阅 TLS / SSL 服务配置。

  3. 消息也在复制伙伴上持久化。

  4. 当消息从活动复制消息 VPN 的端点被消费时,它从持久化存储中移除。

  5. 确认(ACK)被传播到备用复制消息 VPN,表明消息已交付给消费者。

  6. 然后消息也从备用复制消息 VPN 所在的事件代理的持久化存储中移除。

消费者ACK传播

客户端从持久端点消费消息后,会生成一个确认(即‘ACK’),以便从消息池中移除消息(如果从消息池中删除消息,也会生成 ACK)。

默认情况下,对于具有活动复制状态的消息 VPN,在客户端从其端点消费一定数量的消息后,ACK 消息会被传播到具有备用复制状态的伙伴消息 VPN。当这些 ACK 消息被伙伴复制消息 VPN 上的相应持久端点接收时,这些端点会移除那些被复制到它的消息。这个过程确保了两个站点之间的消息状态保持同步。

传播 ACK 消息的配置间隔会影响复制桥上的带宽使用。 请参阅配置 ACK 传播间隔。

如果您为某个端点配置了死信队列(DMQ),禁用该端点的 ACK 传播意味着在两个站点上,生存时间(TTL)计时器将独立运行,可能导致两个站点之间的池化消息存在差异。 有关更多信息,请参见死信队列。

消费者 ACK 传播和非复制消息

如果您有一个启用了消费者 ACK 传播的端点,其中包含非复制消息,那么在复制故障转移的情况下,这些消息将被删除。这是因为新活动站点上的消费者 ACKs 被传播到新的备用站点,触发消息删除。

如果您希望某些端点上的非复制消息在复制故障转移后仍然存在,请考虑在这些端点上禁用消费者 ACK 传播。根据您的用例,您可能还想启用 allow-clients-when-standby,以便从这些端点排出非复制消息。

本地事务

对于本地事务,消息和确认作为内部 XA 事务的一部分被传播到复制伙伴。

发布消息的流程如下:

  1. 客户端开启一个本地事务并发布多条与复制主题订阅匹配的消息。消息在活动站点上持久化。
  2. 客户端提交事务。创建包含消息的内部 XA 事务。
  3. 消息的副本作为内部 XA 事务的一部分通过复制桥发送到备用站点,并在备用站点上持久化。
  4. 在备用站点上提交内部 XA 事务。消息被插入到备用站点的目标端点。
  5. 消息被插入到活动站点的目标端点。内部 XA 事务完成。提交响应发送回客户端。

消费消息的流程如下:

  1. 客户端开启一个本地事务并消费多个已被复制的消息(即,当它们被发布时,它们匹配了一个复制主题订阅)。
  2. 客户端提交事务。创建包含已消费消息确认的内部 XA 事务。
  3. 确认作为内部 XA 事务的一部分通过复制桥发送到备用站点。
  4. 在备用站点上提交内部 XA 事务。已消费的消息从备用站点的端点移除。
  5. 内部 XA 事务完成。已消费的消息从活动站点的端点移除。提交响应发送回客户端。

一个本地事务可能同时包含发布和消费消息。为了简化,示例中展示了分别进行发布和消费的事务。

XA事务

对于 XA 事务,备用站点被包含在分布式事务中。

发布消息的流程如下:

  1. 客户端开启一个 XA 事务并发布多条与复制主题订阅匹配的消息。消息在活动站点上持久化。
  2. 消息的副本立即通过复制桥发送到备用复制站点。消息在备用站点上持久化。
  3. 客户端结束 XA 事务。在活动站点上更新事务状态。
  4. 客户端准备 XA 事务。活动站点检查事务是否可以成功。如果可以,准备请求发送到备用站点进行检查。如果它也可以在备用站点上成功,XA 事务状态在活动和备用站点上更新。准备响应发送回客户端。
  5. 客户端提交 XA 事务。消息被插入到活动站点的目标端点。提交请求发送到备用站点,消息被插入到备用站点的目标端点。
  6. 提交响应发送回客户端。
  7. XA 事务完成。

消费消息的流程如下:

  1. 客户端开启一个 XA 事务并消费多个已被复制的消息。
  2. 客户端结束 XA 事务。在活动站点上更新事务状态,包括确认。
  3. 客户端准备 XA 事务。活动站点检查事务是否可以成功。如果可以,准备请求发送到备用站点进行检查。如果它也可以在备用站点上成功,XA 事务状态在活动和备用站点上更新。准备响应发送回客户端。
  4. 客户端提交 XA 事务。消息从活动站点的端点移除。提交请求发送到备用站点,消息从备用站点的端点移除。
  5. 提交响应发送回客户端。
  6. XA 事务完成。

一个 XA 事务可能同时包含发布和消费消息。为了简化,示例中展示了分别进行发布和消费的事务。