我可以使用 azure 事件网格域将事件发送到多个主题吗?
Can I use azure event grid domain to send events to multiple topics?
我做了以下实验并且有效:
- 为 azure 事件网格域配置了 2 个主题。
- 向包含主题 1 信息的域发布了一个事件。
- 事件已按预期成功传递到主题 1(而不是主题 2)。
问题:
- 是否可以将事件发送到域,以便将其传递到多个主题(在上述情况下为主题 1 和主题 2)?
- 如果可以的话,我该怎么做?
- 如果今天不能,以后能用吗?
首先,Domain Topics和Custom Topics是有区别的。域主题与订阅者松散分离,它们根据订阅者的兴趣动态创建。
换句话说,如果对该域主题没有兴趣(没有订阅),则该域主题在事件域中不存在,为该域主题发布的事件消息会将其转发给域订阅者(如果有域订阅)。
在您的例子中,您已经在事件域 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 时,可以自定义此映射(例如默认值 and/or sourceField)。
关于 AEG Pub/Sub 型号中 "topic broadcasting" 的问题,答案是否定的。 AEG模型只支持订阅一个主题。订阅事件域中的多个主题会很好,例如使用带有 key = topic 的高级过滤,但它不起作用。
正在为扇出模式订阅事件域:
特殊情况可以是订阅事件域并使用高级过滤,请参见以下示例:
"advancedFilters": [
{
"values": [
"topics/topic1",
"topics/topic2"
],
"operatorType": "StringEndsWith",
"key": "topic"
}
基于以上"workaround",您可以在事件域内创建多个扇出(广播)组。在此 public 预览期间,域范围事件订阅的限制为 50。
事件域是 AEG 事件模型中的一个重要功能,例如,在域级主题上有一个内置的事件聚合(扇入模式)。如果兴趣源事件有未知的领域主题(没有订阅),该事件可以被领域订阅者捕获。
Is it possible to send an event to the domain so that it can be delivered to multiple topics (in the above case topic 1 and topic 2)?
今天这完全不可能。通常,您所描述的广播场景是通过在 same 主题上创建多个订阅来解决的。发布到域内不同主题的主要原因是出于授权目的。
如果您希望不同的用户组能够订阅主题 1 和主题 2 中的事件,那么分成两个主题是有意义的。如果相同的用户可以访问同一组事件,那么他们通常可以被授予访问相同主题的权限。
如果您不希望所有事件都流向每个端点,这就是过滤器适用的地方。
If it is possible, how do I go about it?
如果您希望同一事件在两个不同的主题上可用,您必须将事件发布到域两次,每个主题一次。
根据您的用例,第二个选项是 "firehose" 样式事件订阅的可用性。每个域还可以在域范围内支持一组有限的事件订阅(订阅域中的所有事件)。这不会发布到两个主题,但可以根据您的需要作为替代架构。
If it is not possible today, will this be available later?
待定。您是否有一个被阻止的用例?
我做了以下实验并且有效:
- 为 azure 事件网格域配置了 2 个主题。
- 向包含主题 1 信息的域发布了一个事件。
- 事件已按预期成功传递到主题 1(而不是主题 2)。
问题:
- 是否可以将事件发送到域,以便将其传递到多个主题(在上述情况下为主题 1 和主题 2)?
- 如果可以的话,我该怎么做?
- 如果今天不能,以后能用吗?
首先,Domain Topics和Custom Topics是有区别的。域主题与订阅者松散分离,它们根据订阅者的兴趣动态创建。
换句话说,如果对该域主题没有兴趣(没有订阅),则该域主题在事件域中不存在,为该域主题发布的事件消息会将其转发给域订阅者(如果有域订阅)。
在您的例子中,您已经在事件域 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 时,可以自定义此映射(例如默认值 and/or sourceField)。
关于 AEG Pub/Sub 型号中 "topic broadcasting" 的问题,答案是否定的。 AEG模型只支持订阅一个主题。订阅事件域中的多个主题会很好,例如使用带有 key = topic 的高级过滤,但它不起作用。
正在为扇出模式订阅事件域:
特殊情况可以是订阅事件域并使用高级过滤,请参见以下示例:
"advancedFilters": [
{
"values": [
"topics/topic1",
"topics/topic2"
],
"operatorType": "StringEndsWith",
"key": "topic"
}
基于以上"workaround",您可以在事件域内创建多个扇出(广播)组。在此 public 预览期间,域范围事件订阅的限制为 50。
事件域是 AEG 事件模型中的一个重要功能,例如,在域级主题上有一个内置的事件聚合(扇入模式)。如果兴趣源事件有未知的领域主题(没有订阅),该事件可以被领域订阅者捕获。
Is it possible to send an event to the domain so that it can be delivered to multiple topics (in the above case topic 1 and topic 2)?
今天这完全不可能。通常,您所描述的广播场景是通过在 same 主题上创建多个订阅来解决的。发布到域内不同主题的主要原因是出于授权目的。
如果您希望不同的用户组能够订阅主题 1 和主题 2 中的事件,那么分成两个主题是有意义的。如果相同的用户可以访问同一组事件,那么他们通常可以被授予访问相同主题的权限。
如果您不希望所有事件都流向每个端点,这就是过滤器适用的地方。
If it is possible, how do I go about it?
如果您希望同一事件在两个不同的主题上可用,您必须将事件发布到域两次,每个主题一次。
根据您的用例,第二个选项是 "firehose" 样式事件订阅的可用性。每个域还可以在域范围内支持一组有限的事件订阅(订阅域中的所有事件)。这不会发布到两个主题,但可以根据您的需要作为替代架构。
If it is not possible today, will this be available later?
待定。您是否有一个被阻止的用例?