【问题标题】:Can I use azure event grid domain to send events to multiple topics?我可以使用 azure 事件网格域将事件发送到多个主题吗?
【发布时间】:2020-06-04 04:53:56
【问题描述】:

我做了以下实验,效果不错:

  • 为 azure 事件网格域配置了 2 个主题。
  • 向域发布了一个事件,其中包含主题 1 信息。
  • 事件已按预期成功传递到主题 1(而不是主题 2)。

问题:

  1. 是否可以将事件发送到域,以便将其传递到多个主题(在上述情况下为主题 1 和主题 2)?
  2. 如果可以,我该怎么做?
  3. 如果今天不能,以后可以吗?

【问题讨论】:

    标签: azure azure-eventgrid


    【解决方案1】:

    是否可以将事件发送到域,以便可以将其传递到多个主题(在上述情况下为主题 1 和主题 2)?

    这在今天是绝对不可能的。通常,您所描述的广播场景是通过在 same 主题上创建多个订阅来解决的。发布到域内不同主题的主要原因是出于授权目的。

    如果您希望不同的用户组能够订阅主题 1 和主题 2 的事件,那么分成两个主题是有意义的。如果相同的用户可以访问同一组事件,那么他们通常可以被授予访问同一主题的权限。

    如果您不希望所有事件都流向每个端点,这就是过滤器适用的地方。

    如果可以,我该怎么做?

    如果您希望同一事件可用于两个不同的主题,则必须将该事件两次发布到域,每个主题一次。

    根据您的用例,第二个选项是“firehose”样式事件订阅的可用性。每个域还可以在域范围内支持一组有限的事件订阅(订阅域中的所有事件)。这不会同时发布到这两个主题,但可以根据您的需要作为替代架构。

    如果今天不能,以后可以吗?

    待定。您是否有一个被阻止的用例?

    【讨论】:

    • 目前没有阻塞问题。只是想看看这是否可能。
    【解决方案2】:

    首先,域主题和自定义主题是有区别的。领域主题与订阅者松散地分离,它们根据订阅者的兴趣动态创建。

    换句话说,如果对该域主题没有兴趣(没有订阅),则该域主题在事件域中不存在,并且为该域主题发布的事件消息会将其转发给域订阅者(如果有一个域订阅)。

    在您的情况下,您在事件域 topic1 和 topic2 上创建了两个订阅。如果这些订阅是第一次为该主题创建的,那么域将在事件域资源中自动创建这些主题(topic1、topic2)。

    AEG 事件域预览支持将事件数组发送到事件域主题。以下屏幕 sn-p 显示了使用默认输入模式(例如 EventGridSchema)的示例事件:

    [
     {
       "topic": "topic1",
       "id": "12345",
       "subject": "/myapp/vehicles/motorcycles",
       "eventType": "recordInserted",
       "eventTime": "2019-02-05T16:57:16.5734282Z",
       "data": {
         "make": "Ducati",
         "model": "Monster"
         }
     },
     {
       "topic": "topic2",
       "id": "67890",
       "subject": "/myapp/vehicles/motorcycles",
       "eventType": "recordInserted",
       "eventTime": "2019-02-05T16:57:16.5734282Z",
       "data": {
         "make": "Ducati",
         "model": "Monster"
         }
     }
    ]
    

    如您所见,上述每个事件(在此 EventGridSchema 中)都将兴趣源映射到域主题。特殊情况是当我们使用 CustomInputSchema 时,可以自定义此映射(例如默认值和/或 sourceField)。

    您关于 AEG Pub/Sub 模型中“主题广播”的问题的答案是否定的。 AEG 模型只支持订阅一个主题。在事件域中订阅多个主题会很好,例如使用带有 key = topic 的高级过滤,但它不起作用。

    为扇出模式订阅事件域:

    特殊情况可以是订阅事件域并使用高级过滤,请参见以下示例:

     "advancedFilters": [
          {
            "values": [
              "topics/topic1",
              "topics/topic2"
            ],
            "operatorType": "StringEndsWith",
            "key": "topic"
          }
    

    基于上述“解决方法”,您可以在事件域内创建多个扇出(广播)组。在此公开预览期间,域范围事件订阅的限制为 50。

    事件域是 AEG 事件模型中的一个很棒的特性,例如,在域级别的主题上有一个内置的事件聚合(Fan-In 模式)。如果兴趣源事件有未知的领域主题(没有订阅),该事件可以被领域订阅者捕获。

    【讨论】:

    • 在上面的扇出模型域订阅中,事件(发送到域)会被发送到未知域主题1和2吗?如果是这样,将事件发送到这些未订阅的主题有什么好处,因为事件不会从这些主题中去任何地方?我在这里错过了什么吗?
    • 订阅事件域(不是域主题)将捕获所有没有“注册”域主题(没有订阅该域主题)的事件。这是 AEG 模型中的一个独特案例,因为其他人订阅是通过一个主题完成的。
    • 我想更正以下内容:基于docs.microsoft.com/en-us/azure/event-grid/…,该文档指出“事件域上的事件订阅将接收发送到该域的所有事件,无论事件的主题是什么发给。”无论如何,我的解决方法的要点保持不变,事件域订阅正在接收来自域主题的所有事件,并且基于高级过滤,我们可以处理扇出(广播)组。
    猜你喜欢
    • 2020-05-17
    • 2020-11-02
    • 2019-08-05
    • 2019-01-10
    • 2021-12-03
    • 2021-05-18
    • 2021-07-15
    • 2018-07-24
    • 2021-02-18
    相关资源
    最近更新 更多