我可以使用Azure事件网格域将事件发送到多个主题吗?

时间:2019-02-05 15:34:39

标签: azure azure-eventgrid

我已经完成了以下实验,并且可以正常工作:

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

问题:

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

2 个答案:

答案 0 :(得分:1)

首先,域主题和自定义主题之间有所不同。域主题与用户松散耦合,并且根据用户兴趣动态创建。

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

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

AEG事件域预览支持将一系列事件发送到事件域主题。以下屏幕片段显示了使用默认输入架构(例如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事件模型中的一项重要功能,例如,在域级别主题上内置了一个事件聚合(扇入模式)。如果兴趣源事件具有未知的域主题(没有订阅),则该事件可以由域订阅者捕获。

答案 1 :(得分:1)

  

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

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

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

如果您不希望所有事件都流到每个端点,则可以在其中应用过滤器。

  

如果可能,我该怎么办?

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

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

  

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

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