Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
事件网格提供可靠传递。 它会尝试为每个匹配的订阅立即至少传递每条消息一次。 如果订阅方的终结点没有确认收到事件或有故障发生,事件网格会根据固定的“重试计划”和“重试策略”重试传递。 默认情况下,事件网格一次向订阅方传递一个事件。 但是,有效负载是包含单个事件的数组。
注意
事件网格不保证事件传递的顺序,因此订阅者可能会收到无序的事件。
重试计划
当事件网格收到有关事件传递尝试的错误时,它会决定是否应重试传递、将事件加入死信队列,还是根据错误类型丢弃事件。
如果订阅的终结点返回一个与配置相关的错误,并且该错误无法通过重试来解决(例如终结点被删除),则事件网格会将事件放入死信队列;如果未配置死信队列,事件则会被删除。
下表描述了事件网格不重试传递的终结点类型和错误:
| 终结点类型 | 错误代码 |
|---|---|
| Azure资源 | 400 (错误的请求), 413 (请求实体太大), 403 (禁止) |
| Webhook | 400 (错误请求), 413 (请求实体太大), 401 (未授权), 403 (禁止) |
注意
如果未为终结点配置死信处理,当上述错误发生时,事件网格会删除事件。 如果您不希望丢弃此类事件,请考虑配置死信处理功能。 找不到死信目标时,将删除死信事件。
如果订阅的终结点返回的错误消息不在前面的列表中,事件网格会使用以下策略重试传递:
传送消息后,事件网格将等待 30 秒以接收响应。 30 秒后,如果终结点未响应,事件网格会将消息排队等待重试。 对于事件传送,事件网格使用指数性的回退重试策略。 事件网格会尽量按以下计划重试传送:
- 10 秒
- 30 秒
- 1 分钟
- 5 分钟
- 10 分钟
- 30 分钟
- 1 小时
- 3 小时
- 6 小时
- 每 12 小时到 24 小时
如果终结点在 3 分钟内做响应,则事件网格会尽量尝试从重试队列中移除事件,但仍可能会收到重复项。
事件网格向所有重试步骤添加小的随机性,如果某个终结点持续运行不正常、长时间关闭或似乎不堪重负,它可能会适时地跳过某些重试。
重试策略
当使用以下两个配置创建事件订阅时,可自定义重试策略。 如果达到重试策略的任一限制,事件网格将删除事件。
- 最大尝试次数 - 值必须是介于 1 和 30 之间的整数。 默认值为 30。
- 事件生存时间 (TTL) - 值必须是介于 1 和 1440 之间的整数。 默认值为 1440 分钟。
如需用于配置这些设置的示例 CLI 和 PowerShell 命令,请参阅设置重试策略。
注意
如果同时设置 Event time to live (TTL) 和 Maximum number of attempts,则事件网格使用先到期的项来确定何时停止事件传递。 例如,如果将“生存时间(TTL)”设置为 30 分钟,将最大传递尝试次数设置为 5。 如果事件在 30 分钟或 5 次尝试后未传递,以先到者为准,事件网格会将事件死信队列化。 如果将最大传递尝试设置为 10(根据 指数重试计划),在达到 30 分钟 TTL 之前最多会发生 6 次传递尝试。 因此,将最大尝试次数设置为 10 对此没有影响,事件网格在 30 分钟后将事件转为死信。
输出批处理
默认情况下,事件网格单独将每个事件发送给订阅者。 订阅者接收包含单个事件的数组。 你可以将事件网格配置为批量处理要传送的事件,以在高吞吐量方案中提高 HTTP 性能。 默认情况下,批处理处于关闭状态,你可以按订阅打开它。
批处理策略
批量传送有两个设置:
- 每批最大事件数 - 事件网格每批次可传递的最大事件数。 此数字永远不会超过。 但是,如果在发布时没有其他事件可用,可能会传送更少的事件。 就算可用事件较少,事件网格也不会为了创建批处理而延迟事件。 必须介于 1 到 5,000 之间。
- 首选批大小(KB) - 批大小的目标上限 (KB)。 与最大事件数相比,如果发布时未提供更多事件,则批大小可能较小。 如果单个事件大于首选大小,则批可能会大于首选批大小。 例如,如果首选大小为 4 KB,并且将 10 KB 事件推送到事件网格,则 10 KB 事件仍在其自己的批处理中传递,而不是被删除。
您可以通过门户、CLI、PowerShell 或软件开发工具包(SDK)针对每个事件订阅配置批量传递。
批处理行为
全或无
事件网格使用“全或无”语义运行。 它不支持批量传送的部分成功。 订阅者应注意,每批只请求他们可在 30 秒内合理处理的事件数量。
乐观批处理
批处理策略设置不严格限制批处理行为,事件网格会尽力尊重这些设置。 在低事件速率下,通常会发现批大小小于每个批处理请求的最大事件数。
默认设置为关闭
默认情况下,事件网格只会向每个传递请求添加一个事件。 若要启用批处理,请设置事件订阅 JSON 中前面提到的设置之一。
默认值
创建事件订阅时,无需同时指定设置(每个批的最大事件数和大约批大小(以 KB 为单位)。 如果仅设置一个设置,事件网格将使用可配置的默认值。 有关默认值以及如何重写默认值的详细信息,请参阅以下部分。
Azure门户
可以在“事件订阅”页的“其他功能”选项卡上查看这些设置。
Azure CLI
创建事件订阅时,请使用以下参数:
- max-events-per-batch - 每批的最大事件数。 输入介于 1 和 5,000 之间的数字。
- preferred-batch-size-in-kilobytes - 首选批大小 (KB)。 输入介于 1 和 1,024 之间的数字。
storageid=$(az storage account show --name <storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
endpoint=https://$sitename.chinacloudsites.cn/api/updates
az eventgrid event-subscription create \
--source-resource-id $storageid \
--name <event_subscription_name> \
--endpoint $endpoint \
--max-events-per-batch 1000 \
--preferred-batch-size-in-kilobytes 512
有关将Azure CLI与事件网格配合使用的详细信息,请参阅
延迟交付
当终结点遇到传递失败时,事件网格会开始延迟向该终结点传递和重试事件。 例如,如果发布到终结点的前 10 个事件失败,事件网格假定终结点遇到问题,并延迟所有后续重试 和新 交付一段时间-在某些情况下,最多几个小时。
从功能上讲,延迟传送的目的是保护不正常的终结点以及事件网格系统。 如果不采用退避机制并延迟传递到不健康的终结点,事件网格的重试策略和负载能力可能很容易使系统瘫痪。
死信事件
当事件网格无法在特定时间段内或在尝试传递事件一定次数后传递事件时,它可以将未传递的事件发送到存储帐户。 此过程称为“死信处理”。 满足以下条件之一时,事件网格会将事件视为死信。
- 事件未在存活时间内传递。
- 尝试传递事件的次数超出了限制。
如果满足任一条件,则会删除事件或将事件发送到死信队列。 默认情况下,事件网格不启用死信处理。 若要启用它,请在创建事件订阅时指定用于保存未传递事件的存储帐户。 你将从此存储帐户中提取事件来解决传递过程中的问题。
Event Grid 在尝试所有重试操作后,将事件发送到死信位置。 如果事件网格收到 400(错误请求)或 413(请求实体太大)响应代码,它会立即计划事件以进行死信处理。 这些响应代码指示事件传送永远不会成功。
仅在下一次计划的传递尝试中检查生存时间到期时间。 因此,即使生存时间在下一次计划的传递尝试之前到期,也只有在下一次传递时才检查事件到期,然后将事件标记为死信。
最后一次尝试发送事件与发送到死信位置之间有五分钟的延迟。 此延迟可减少 Blob 存储操作的次数。 如果死信位置已四小时不可用,则会丢弃该事件。
在设置死信位置之前,必须有一个包含容器的存储帐户。 在创建事件订阅时,需要提供此容器的终结点。 终结点的格式如下:/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>
您可能希望在事件发送到死信位置时接收通知。 若要使用事件网格来响应未送达事件,请为死信 blob 存储创建事件订阅。 每当死信 blob 存储收到未送达的事件时,Event Grid 会通知处理程序。 处理程序使用你希望采取的、用于协调未送达的事件的操作进行响应。 有关设置死信位置和重试策略的示例,请参阅死信和重试策略。
注意
如果为死信消息启用托管身份标识,请在保存死信消息的 Azure Storage 帐户上将托管身份标识添加到适当的基于角色的访问控制(RBAC)角色。 有关详细信息,请参阅 支持的目标和Azure角色。
发送事件格式
本部分提供了不同传递架构格式(事件网格架构、CloudEvents 1.0 架构和自定义架构)的事件和未能成功送达的事件的示例。 有关这些格式的详细信息,请参阅 事件网格架构 和 云事件 1.0 架构 文章。
事件网格架构
事件
{
"id": "93902694-901e-008f-6f95-7153a806873c",
"eventTime": "2020-08-13T17:18:13.1647262Z",
"eventType": "Microsoft.Storage.BlobCreated",
"dataVersion": "",
"metadataVersion": "1",
"topic": "/subscriptions/000000000-0000-0000-0000-00000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.Storage/storageAccounts/myegteststgfoo",
"subject": "/blobServices/default/containers/deadletter/blobs/myBlobFile.txt",
"data": {
"api": "PutBlob",
"clientRequestId": "c0d879ad-88c8-4bbe-8774-d65888dc2038",
"requestId": "93902694-901e-008f-6f95-7153a8000000",
"eTag": "0x8D83FACDC0C3402",
"contentType": "text/plain",
"contentLength": 0,
"blobType": "BlockBlob",
"url": "https://myegteststgfoo.blob.core.chinacloudapi.cn/deadletter/myBlobFile.txt",
"sequencer": "00000000000000000000000000015508000000000005101c",
"storageDiagnostics": { "batchId": "cfb32f79-3006-0010-0095-711faa000000" }
}
}
死信事件
{
"id": "93902694-901e-008f-6f95-7153a806873c",
"eventTime": "2020-08-13T17:18:13.1647262Z",
"eventType": "Microsoft.Storage.BlobCreated",
"dataVersion": "",
"metadataVersion": "1",
"topic": "/subscriptions/0000000000-0000-0000-0000-000000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.Storage/storageAccounts/myegteststgfoo",
"subject": "/blobServices/default/containers/deadletter/blobs/myBlobFile.txt",
"data": {
"api": "PutBlob",
"clientRequestId": "c0d879ad-88c8-4bbe-8774-d65888dc2038",
"requestId": "93902694-901e-008f-6f95-7153a8000000",
"eTag": "0x8D83FACDC0C3402",
"contentType": "text/plain",
"contentLength": 0,
"blobType": "BlockBlob",
"url": "https://myegteststgfoo.blob.core.chinacloudapi.cn/deadletter/myBlobFile.txt",
"sequencer": "00000000000000000000000000015508000000000005101c",
"storageDiagnostics": { "batchId": "cfb32f79-3006-0010-0095-711faa000000" }
},
"deadLetterReason": "MaxDeliveryAttemptsExceeded",
"deliveryAttempts": 1,
"lastDeliveryOutcome": "NotFound",
"publishTime": "2020-08-13T17:18:14.0265758Z",
"lastDeliveryAttemptTime": "2020-08-13T17:18:14.0465788Z"
}
下面列出了 lastDeliveryOutcome 的可能值及其说明。
| 最后传递结果 | 描述 |
|---|---|
| 未找到 | 找不到目标资源。 |
| 禁用 | 目的地已禁止接收事件。 适用于Azure Service Bus和Azure Event Hubs。 |
| 完全 | 超出了目的地允许的最大操作数量。 适用于Azure Service Bus和Azure Event Hubs。 |
| 未授权 | 目标返回了未经授权的响应代码。 |
| 错误请求 | 目标返回了错误的请求响应代码。 |
| 已超时 | 交付操作超时。 |
| 忙碌 | 目标服务器正忙。 |
| PayloadTooLarge | 消息大小超出了目标所允许的最大大小。 适用于Azure Service Bus和Azure Event Hubs。 |
| 试用期 | 事件网格将目标置于试用期。 试用期间不进行投递。 |
| 已取消 | 传送操作已取消。 |
| 已中止 | 在一段时间后,事件网格中止了传送。 |
| SocketError | 传送期间出现网络通信错误。 |
| ResolutionError | 目标终结点的 DNS 解析失败。 |
| 交付 | 将事件传送到目标。 |
| SessionQueueNotSupported | 在启用了会话支持的实体上尝试不使用会话 ID 的事件传送。 适用于 Azure Service Bus 实体目标对象。 |
| 禁止 | 目标终结点禁止传送(可能是由于 IP 防火墙或其他限制) |
| 无效的Azure功能目标 (InvalidAzureFunctionDestination) | 目标Azure函数无效。 可能是因为它没有 EventGridTrigger 类型。 |
LastDeliveryOutcome:观察期
如果事件传递到目的地开始失败,Event Grid 将把事件订阅置于考察期。 对于目标终结点返回的不同错误,等待时间是不同的。 如果事件订阅处于观察期,则事件可能会被标记为死信或直接丢弃,甚至无需尝试传递,具体取决于导致观察期的错误代码。
| 错误 | 试用期时长 |
|---|---|
| 忙碌 | 10 秒 |
| 未找到 | 5 分钟 |
| SocketError | 30 秒 |
| ResolutionError | 5 分钟 |
| 禁用 | 5 分钟 |
| 完全 | 5 分钟 |
| 已超时 | 10 秒 |
| 未授权 | 5 分钟 |
| 禁止 | 5 分钟 |
| 无效的Azure功能目标 (InvalidAzureFunctionDestination) | 10 分钟 |
注意
事件网格使用试用持续时间改进传送管理,将来的持续时间可能会改变。
CloudEvents 1.0 架构
事件
{
"id": "caee971c-3ca0-4254-8f99-1395b394588e",
"source": "mysource",
"dataversion": "1.0",
"subject": "mySubject",
"type": "fooEventType",
"datacontenttype": "application/json",
"data": {
"prop1": "value1",
"prop2": 5
}
}
死信事件
{
"id": "caee971c-3ca0-4254-8f99-1395b394588e",
"source": "mysource",
"dataversion": "1.0",
"subject": "mySubject",
"type": "fooEventType",
"datacontenttype": "application/json",
"data": {
"prop1": "value1",
"prop2": 5
},
"deadletterreason": "MaxDeliveryAttemptsExceeded",
"deliveryattempts": 1,
"lastdeliveryoutcome": "NotFound",
"publishtime": "2020-08-13T21:21:36.4018726Z",
}
自定义架构
事件
{
"prop1": "my property",
"prop2": 5,
"myEventType": "fooEventType"
}
死信事件
{
"id": "8bc07e6f-0885-4729-90e4-7c3f052bd754",
"eventTime": "2020-08-13T18:11:29.4121391Z",
"eventType": "myEventType",
"dataVersion": "1.0",
"metadataVersion": "1",
"topic": "/subscriptions/00000000000-0000-0000-0000-000000000000000/resourceGroups/rgwithoutpolicy/providers/Microsoft.EventGrid/topics/myCustomSchemaTopic",
"subject": "subjectDefault",
"deadLetterReason": "MaxDeliveryAttemptsExceeded",
"deliveryAttempts": 1,
"lastDeliveryOutcome": "NotFound",
"publishTime": "2020-08-13T18:11:29.4121391Z",
"lastDeliveryAttemptTime": "2020-08-13T18:11:29.4277644Z",
"data": {
"prop1": "my property",
"prop2": 5,
"myEventType": "fooEventType"
}
}
消息传送状态
事件网格使用 HTTP 响应代码确认已接收事件。
成功代码
事件网格仅将以下 HTTP 响应状态码视为传送成功。 所有其他状态代码均表示配送失败。 Event Grid 会根据需要重试或将这些失败的投递写入死信队列。 当事件网格收到成功状态代码时,它认为发送完成。
- 200 正常
- 201 已创建
- 202 已接受
- 203 非权威信息
- 204 无内容
失败代码
事件网格将 200-204 范围之外的所有状态代码视为失败。 如果事件传递失败,事件网格会重试传递。 某些失败代码具有特定的重试策略,下表中概述了这些策略。 所有其他故障代码都遵循标准指数退避模型。 由于事件网格体系结构的高度并行化性质,重试行为是不确定的。
| 状态代码 | 重试行为 |
|---|---|
| 400 错误的请求 | 未重试 |
| 401 未授权 | 在 5 分钟或更长时间后重试 Azure 资源端点 |
| 403 禁止访问 | 未重试 |
| 404 未找到 | 在 5 分钟或更长时间后重试 Azure 资源端点 |
| 408 请求超时 | 2 分钟或更长时间后重试 |
| 413 请求实体太大 | 未重试 |
| 503 服务不可用 | 30 秒或更长时间后重试 |
| 所有其他 | 10 秒或更长时间后重试 |
自定义传递属性
创建事件订阅时,最多可以添加 10 个自定义 HTTP 标头,以包含在传递的事件中。 每个标头值不能超过 4,096 (4K) 个字节。 此功能允许设置目标所需的自定义标头。 可以对传递到以下目标的事件设置自定义标头:
- Webhook
- Azure Service Bus主题和队列
- Azure Event Hubs
- 中继混合连接
有关详细信息,请参阅自定义传送属性。
相关内容
- 若要查看事件传送的状态,请参阅监视事件网格消息传送。
- 若要自定义事件传送选项,请参阅死信和重试策略。