

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# FIFO 主题订阅用户的 Amazon SNS 消息重播
<a name="message-archiving-and-replay-subscriber"></a>

借助 Amazon SNS 重播，主题订阅用户可以从主题数据存储中检索归档的消息，并将其重新传输（或重播）到订阅的端点。
+ 创建订阅后即可立即重播消息。
+ 重播的消息保留了与原始消息相同的内容、`MessageId` 和 `Timestamp`。
+ 该消息包含一个 `Replayed` 属性，用于指示这是一条重播的消息。
+ 要仅重播指定消息，可以在订阅中添加筛选策略。

有关筛选消息的更多信息，请参阅[筛选重播的消息](#message-archiving-and-replay-subscription-filtering)。

## 使用创建消息重播策略 AWS 管理控制台
<a name="message-archiving-and-replay-replaying-console"></a>

使用此选项，通过 AWS 管理控制台创建新的重播策略。

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 选择一个主题订阅或创建一个新的主题订阅。要了解有关创建订阅的更多信息，请参阅[在 Amazon SNS 主题中创建订阅](sns-create-subscribe-endpoint-to-topic.md)。

1. 要启动消息重播，请转到**重播**下拉列表并选择**开始重播**。

1. 从**重播时间范围**模式中，进行以下选择：

   1. **选择重播开始日期和时间**-选择要开始重播存档邮件的**日期**（YYYY/MM/DD格式）和**时间**（24 小时 hh: mm: ss 格式）。开始时间应晚于近似归档时间的开始时间。

   1. **（可选）选择重播结束日期和时间**-选择要停止重播存档邮件的**日期**（YYYY/MM/DD格式）和**时间**（24 小时 hh: mm: ss 格式）。

   1. 选择**开始重播**。

1. （可选）要**停止**消息重播，请转到**订阅详细信息**页面，然后从**重播**下拉列表中选择**停止重播**。

1. （可选）要使用**监控**此工作流程中的邮件重播指标 CloudWatch，请参阅[使用 Amazon 监控消息重播指标 CloudWatch](#message-archiving-and-replay-subscription-cloudwatch)。

**查看和编辑消息重播策略**

您可以从**订阅详细信息**页面执行以下操作：
+ 要**查看**消息重播状态，**重播状态**字段将显示以下值：
  + **已完成** - 重播已成功重新传送所有消息，现在正在传送新发布的消息。
  + **进行中** – 重播当前正在重播所选消息。
  + **失败** – 重播无法完成。
  + **待处理** - 重播启动时的默认状态。
+ （可选）要**修改**消息重播策略，请转到**订阅详细信息**页面，然后从**重播**下拉列表中选择**开始重播**。开始某个重播将取代现有的重播。

## 使用 API 向订阅添加重播策略
<a name="message-archiving-and-replay-subscription-api"></a>

要重播归档的消息，请使用属性 `ReplayPolicy`。`ReplayPolicy` 可以与 `Subscribe` 和 `SetSubscriptionAttributes` API 操作一起使用。此策略包含以下值：
+ **`StartingPoint`**（必需）- 表示从何处开始重播消息。
+ **`EndingPoint`**（可选）- 表示何时停止重播消息。如果省略 `EndingPoint`，则重播将继续，直到赶上当前时间。
+ **`PointType`**（必需）- 设置起点和终点的类型。目前，`PointType` 唯一支持的值是 `Timestamp`。

例如，要从下游故障中恢复并重新发送 2023 年 10 月 1 日的两小时时段内的所有消息，请使用 `SetSubscriptionAttributes` API 操作设置 `ReplayPolicy`，如下所示：

```
{
  "PointType":"Timestamp", 
  "StartingPoint":"2023-10-01T10:00:00.000Z", 
  "EndingPoint":"2023-10-01T12:00:00.000Z"
}
```

要重播截至 2023 年 10 月 1 日发送到该主题的所有消息，并继续接收与您的主题有关的所有新发布的消息，请使用 `SetSubscriptionAttributes` API 操作对您的订阅设置 `ReplayPolicy`，如下所示：

```
{
  "PointType":"Timestamp",
  "StartingPoint":"2023-10-01T00:00:00.000Z"
}
```

为了验证消息是否已重播，将在每条重播的消息中添加布尔属性 `Replayed`。

## 使用 SDK 向订阅添加重播策略
<a name="message-replay-sdk"></a>

要使用 S AWS DK，必须使用您的凭据对其进行配置。有关更多信息，请参阅《工具参考指南》[`config`和《*工具参考指南》中的共享 AWS SDKs 和`credentials`*文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。

以下代码示例显示了如何对订阅设置 `ReplayPolicy`，以便从 Amazon SNS FIFO 主题的归档中重新传送 2023 年 10 月 1 日 2 小时时段内的消息。

```
// Specify the ARN of the Amazon SNS subscription to initiate the ReplayPolicy on.
String subscriptionArn =
    "arn:aws:sns:us-east-2:123456789012:MyArchiveTopic.fifo:1d2a3e9d-7f2f-447c-88ae-03f1c68294da";

// Set the ReplayPolicy to replay messages from the topic's archive 
// for a 2 hour time period on October 1st 2023 between 10am and 12pm UTC.
String replayPolicy =
    "{\"PointType\":\"Timestamp\",\"StartingPoint\":\"2023-10-01T10:00:00.000Z\",\"EndingPoint\":\"2023-10-01T12:00:00.000Z\"}";

// Set the ArchivePolicy for the Amazon SNS topic
SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest()
    .withSubscriptionArn(subscriptionArn)
    .withAttributeName("ReplayPolicy")
    .withAttributeValue(replayPolicy);
sns.setSubscriptionAttributes(request);
```

## 理解 EndingPoint
<a name="message-archiving-and-replay-understanding-endpoint"></a>

当您向 Amazon SNS 订阅应用 `ReplayPolicy` 时，`EndingPoint` 值是可选的。如果未提供 `EndingPoint`，则重播将从指定的 `StartingPoint` 开始并持续到当前时间，包括处理任何新发布的消息。一旦赶上，订阅将作为常规订阅运行，在新消息发布后接收这些消息。

如果指定了 `EndingPoint`，则该服务将从 `StartingPoint` 一直到 `EndingPoint` 重播消息，然后停止。**此操作实际上会暂停订阅。**订阅暂停期间，新发布的消息将不会传送到已订阅的端点。

要恢复消息传送，请在不提供 `EndingPoint` 的情况下应用新的 `ReplayPolicy`，并将 `StartingPoint` 设置为继续接收消息的所需时间点。例如，要从之前的重播结束的地方恢复订阅，请将新的 `StartingPoint` 设置为先前提供的 `EndingPoint`。

## 筛选重播的消息
<a name="message-archiving-and-replay-subscription-filtering"></a>

Amazon SNS 消息筛选可让您控制 Amazon SNS 向您的订阅用户端点重播的消息。当消息筛选和消息归档都已启用时，Amazon SNS 会首先从主题的数据存储中检索消息，然后根据订阅的 `FilterPolicy` 应用消息。当存在匹配项时，消息将传送到订阅的端点，否则消息将被筛选掉。有关更多信息，请参阅 [Amazon SNS 订阅筛选策略](sns-subscription-filter-policies.md)。

## 使用 Amazon 监控消息重播指标 CloudWatch
<a name="message-archiving-and-replay-subscription-cloudwatch"></a>

您可以使用以下指标在 Amaz CloudWatch on 上监控重播消息。为了收到工作负载异常的通知并帮助避免影响，您可以根据这些指标配置 Amazon CloudWatch 警报。有关更多详细信息，请参阅[Amazon SNS 中的日志记录和监控](sns-logging-monitoring.md)。


| 指标 | 说明 | 
| --- | --- | 
|  **NumberOfReplayedNotificationsDelivered**  |  以 1 分钟的分辨率向订阅用户提供主题归档中重播的消息总数。  | 
|  **NumberOfReplayedNotificationsFailed**   |  以 1 分钟的分辨率向订阅用户提供主题归档中未能传送的已重播消息的总数。  | 