【问题标题】:Azure Event Grid advance filtering with Cloud Event Schema v1.0使用 Cloud Event Schema v1.0 进行 Azure Event Grid 高级筛选
【发布时间】:2019-11-24 19:25:19
【问题描述】:

我正在使用事件网格来传达两个不同的微服务。为此,我创建了一个主题和一个订阅:

  • 带有 Cloud Event Schema v1.0 的事件网格主题
  • 使用 Cloud Event Schema v1.0 订阅事件网格

事件被正确发送和接收。但是,我正在尝试添加基于 CloudEvent 的“源”字段的高级过滤,如图所示。一切似乎都已正确配置,但我收到订阅中的所有事件,无论事件的来源。

知道我会在这里错过什么吗?

【问题讨论】:

    标签: azure serverless azure-eventgrid


    【解决方案1】:

    CloudEventV01Schema 中,source 属性由带有分隔符的 topicsubject 值组成 # ,请参阅以下内容:

    source = topic#subject
    

    使用 OperatorType = StringNotIn 需要匹配 key 的完整值,例如在您的情况下 source 值。

    主题和分隔符#添加到您的主题(例如https://my-source.azurewebsites.net/)将解决您的问题。

    自定义主题示例:

    /subscriptions/yourSubscriptionId/resourceGroups/yourResourceGroup/providers/Microsoft.EventGrid/topics/yourTopic#https://my-source.azurewebsites.net/
    

    请投票adding more operationTypes in the AdvancedFilters,您的问题可以通过 operationType = StringNotEndsWith 轻松处理。

    更新:

    CloudEventSchemaV1_0 中是由 AEG 主题表示的 source 属性,请参见 storage producer 的示例。在您的情况下,例如自定义主题,源将具有自定义主题 resourceId 的值。

    换句话说,对 source 属性使用优势过滤是没有用的,因为 AEG Pub/Sub 事件模型仅支持订阅 one 特定主题(一个订阅一个主题)。

    注意,使用事件域主题而不是自定义主题,source 属性表示为单个事件域中的主题,我们可以在其中过滤源(域主题)以用于消费或直接订阅此来源(领域主题)。

    总之,当前的公共预览版 (api-version=2020-01-01-preview) 不支持您对源上的高级过滤的期望 /em> 属性。

    更新2:

    我创建了一个issue,与 AEG 自定义主题端点使用 CloudEvents v 1.0 相关。

    平均而言,以下解决方法可用于您的解决方案:

     Event Grid Topic with CustomInputSchema
     Event Grid Subscription with CustomInputSchema (or CloudEventSchemaV1_0)
    

    例子:

    使用REST API 和以下负载创建自定义主题:

    {
      "location":"westus",
        "tags":{
          "tag1":"abcd",
          "tag2":"ABCD"
          },
      "properties":{
        "inputSchema":"CustomEventSchema",
        "inputSchemaMapping":{
        "properties":{
          "id":{
            "sourceField":null
          },
          "topic":{
            "sourceField":null
          },
          "eventTime":{
            "sourceField":null
          },
          "eventType":{
            "sourceField":null,
            "defaultValue":"DefaultEventType"
            },
          "subject":{
            "sourceField":null,
            "defaultValue":"DefaultSubject"
          },
          "dataVersion":{
            "sourceField":null,
            "defaultValue":"1.0"
          }
        },
        "inputSchemaMappingType":"Json"
        }
      }
    }
    

    上述自定义映射将允许绕过从自定义主题端点到订阅者的任何事件架构。如果订阅者被声明为使用 CloudEvents v 1.0 的交付模式,则事件由 CloudEventSchemaV1_0 信封包装。

    在此解决方法中,事件消息必须在数组中,请参见以下示例:

    [
      {
        "id":"00000000-0000-0000-0000-000000000000",
        "source":"https://my-source.azerwebsites.net/",
        "specversion":"1.0",
        "type":"recordInserted",
        "dataschema":"#1.0",
        "subject":"/myapp/vehicles/motorcycles",
        "time":"2019-11-23T16:43:22.5111403Z",
        "data":{
          "make":"Ducati",
          "model":"Monster"
        }
      }
    ]
    

    请注意,这个由数组包装的自定义输入模式应与 CloudEvents 处理相同,例如将单个事件作为 JObject 并将批处理作为 JArray,查看我报告的问题here

    如您所见,上述事件消息是 CloudEvents v 1.0 消息,在此解决方法中,您可以对 source 属性使用高级过滤。

    【讨论】:

    • 我正在使用 v1.0 架构,其中主题不存在。
    • @DavidGSola,查看我的更新
    • 感谢您的更新。作为一种解决方法,我直接在代码中对订阅端点进行过滤。比更改部署模板更容易。
    • 确实如此,当您将 自定义主题 用于非常小的事件模型时。对于具有更多主题、分区等的应用程序,事件域是更可取的模型 (docs.microsoft.com/en-us/azure/event-grid/event-domains),并且在订阅者代码中使用解决方法将无济于事,CloudEvents 的源属性必须是域主题(例如 abcd),这是 AEG 团队的映射,否则发布者将收到 BadRequest 错误代码。我希望 Microsoft AEG 团队将对其进行更改,以在消费端遵循 CloadEvents v 1.0 支持。
    猜你喜欢
    • 2018-06-21
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2018-08-02
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多