

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

# Amazon SNS 中的筛选策略限制
<a name="subscription-filter-policy-constraints"></a>

在 Amazon SNS 中设置筛选策略时，需要记住几个重要的规则。这些规则有助于确保筛选策略的有效应用，同时保持系统性能和兼容性。

## 常见策略限制
<a name="subscription-filter-policy-common-constraints"></a>

在 Amazon SNS 中配置筛选策略时，请遵循以下重要规则，确保策略有效应用的同时保持系统性能和兼容性：
+ **字符串匹配**：对于筛选策略中的字符串匹配，比较操作会区分大小写。
+ **数字匹配**：对于数字匹配，值的范围可以介于 -109 到 109（-10 亿到 10 亿）之间，小数点后精度为五位。
+ **筛选策略复杂度** – 筛选策略中的值的总和不得超过 **150**。要计算总的组合数，请将每个数组内所含值的个数相乘。
+ **限制密钥数量**：一个筛选策略最多可以有**五**个密钥。

****其它注意事项****
+ 筛选策略的 JSON 可包含：
  + 用引号引起来的字符串
  + 数字
  + 不带引号的关键字 `true`、`false` 和 `null`
+ 在使用 Amazon SNS API 时，必须将筛选策略的 JSON 作为有效的 **UTF-8** 字符串传递。
+ 筛选策略的最大大小为 **256 KB**。
+ 默认情况下，每个主题最多可以有 **200 个**筛选策略，每个 AWS 账户最多可以有 **10,000** 个筛选策略。

  此策略限制不会阻止使用 [https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) API 创建 Amazon SQS 队列订阅。但是，当您在 `Subscribe` API 调用（或 [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) API 调用）中附加筛选策略时，操作将失败。

  要增加此限额，您可以使用 [AWS 服务限额](https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html)。

## 基于属性的筛选的策略限制
<a name="subscription-filter-policy-attribute-constraints"></a>

基于属性的筛选是默认选项。[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters) 在订阅中设置为 `MessageAttributes`。
+ Amazon SNS 不接受基于属性的筛选的嵌套筛选策略。
+ Amazon SNS 仅将策略属性与具有以下数据类型的消息属性进行比较：
  + `String`
  + `String.Array`
**重要**  
在 Amazon SNS 中使用基于属性的筛选时，必须对某些特殊字符使用双重转义，特别是：  
双引号 (")
反斜杠 ()
未能对这些字符进行双重转义将导致筛选策略与已发布消息的属性不匹配，并且通知将无法传送。

**其它注意事项**
+ 不建议在数组中传递对象，因为基于属性的筛选不支持嵌套，可能会产生意想不到的结果。对嵌套策略使用基于有效载荷的筛选。
+ `Number` 支持数字属性值。
+ Amazon SNS 忽略具有二进制数据类型的消息属性。

**复杂度相关的示例策略：**

在以下策略示例中，第一个密钥有**三个**匹配运算符，第二个密钥有**一个**匹配运算符，第三个密钥有**两个**匹配运算符。

```
{
   "key_a": ["value_one", "value_two", "value_three"],
   "key_b": ["value_one"],
   "key_c": ["value_one", "value_two"]
}
```

总和是根据筛选策略中每个密钥的匹配运算符数量的乘积计算得出的：

```
3(match operators of key_a) 
x 1(match operators of key_b) 
x 2(match operators of key_c) 
= 6
```

## 基于有效负载的筛选的策略限制
<a name="subscription-filter-policy-payload-constraints"></a>

要从基于属性（默认）的筛选切换到基于有效载荷的筛选，您必须在订阅中将 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html) 设置为 `MessageBody`。
+ Amazon SNS 接受基于有效负载的筛选的嵌套筛选策略。
+ 对于嵌套策略，只有**叶密钥**计入**五个**密钥的限制。

**密钥限制策略示例：**

在下方示例策略中：
+ 有两个叶密钥：`key_c` 和 `key_e`。
+ `key_c` 有**四个**匹配运算符，嵌套级别为**三**，`key_e` 有**三个**匹配运算符，嵌套级别为**二**。

```
{
"key_a": {
    "key_b": {
        "key_c": ["value_one", "value_two", "value_three", "value_four"]
        }
    },
"key_d": {
    "key_e": ["value_one", "value_two", "value_three"]
    }
}
```

总和是根据筛选策略中每个密钥的匹配运算符数量和每个密钥的嵌套层级的乘积计算得出的：

```
4(match operators of key_c) 
x 3(nested level of key_c) 
x 3(match operators of key_e) 
x 2(nested level of key_e) 
= 72
```

## 通配符模式使用准则
<a name="filter-policy-constraints-wildcard"></a>

 当您注册包含通配符的筛选策略时，Amazon SQS 会实施保护，以确保不会创建过于复杂的筛选策略，因为这会影响您的应用程序性能。

**模式结构**

字段包含一个或多个模式。以下示例显示了使用两种模式的字段：

```
{
    "greeting": [
      {"anything-but": {"prefix": "Hello"}},
      {"wildcard": "H*"}
    ] // 2 patterns
  }
```

**复杂度规则**
+  所有字段的通配符复杂度总和不得超过 100 个点 
+  每个模式最多 3 个通配符 

**复杂度计算**
+  字段复杂度 = `(Sum of pattern points)` × `(Number of patterns)` 
+ 模式点数：

   单通配符：1 个点 

   多个通配符：每个通配符 3 个点 

   Anything-but：1 个点 

  以下是复杂度计算的示例：

  ```
  {
    "filename": [
      {"wildcard": "*.txt"},     // 1 point
      {"wildcard": "log*"}      // 1 point
    ]                           // Total: (1 + 1) × 2 = 4 points
  }
  ```