AWS AppSync订阅是否支持自定义过滤逻辑?
AWS AppSync订阅的自定义过滤逻辑支持情况
当然支持!AWS AppSync完全允许你为订阅配置自定义过滤逻辑,你提到的默认参数匹配只是最基础的行为而已,我们可以通过两种方式实现更灵活的过滤规则。
一、默认行为回顾
先确认下你说的默认逻辑没错:在你给出的示例架构中
type Mutation { createEvent(userId: ID!, event: Event!): Event! } type Subscription { onEvent(userId: ID!): Event! @aws_subscribe(mutations: ["createEvent"]) }
AppSync默认会将订阅请求中的userId参数,与触发createEvent时传入的userId参数做严格相等匹配,只有两者一致时,订阅者才会收到事件推送。
二、方式1:通过@aws_subscribe的filter参数配置简单过滤
如果你的过滤逻辑是基于mutation的参数或返回值的简单条件组合,可以直接在@aws_subscribe指令中添加filter字段来定义规则。
比如,假设我们想让订阅者既能收到自己创建的事件,也能收到指定类型的公共事件,可以修改架构如下:
type Event { id: ID! name: String! type: String! } type Mutation { createEvent(userId: ID!, event: Event!): Event! } type Subscription { onEvent(userId: ID!, targetEventType: String): Event! @aws_subscribe( mutations: ["createEvent"], filter: { or: [ { userId: { eq: "$context.arguments.userId" } }, { event: { type: { eq: "$context.arguments.targetEventType" } } } ] } ) }
这个过滤规则的逻辑是:当createEvent触发时,只要满足mutation的userId等于订阅者的userId,或者事件的type等于订阅者指定的targetEventType,订阅者就会收到这条事件通知。
三、方式2:通过VTL解析器实现复杂自定义过滤
如果你的过滤逻辑比较复杂(比如需要检查嵌套字段、数组包含关系,或者进行多维度的条件判断),可以通过订阅的解析器VTL模板来实现。
比如,假设我们希望订阅者能收到所有包含自己作为参与者的事件(Event类型有一个participants: [ID!]字段),可以在订阅的Request Mapping Template中编写如下逻辑:
{ "version": "2018-05-29", "payload": { "filter": { "participants": { "contains": "$context.arguments.userId" } } } }
这个模板会检查createEvent返回的Event对象中,participants数组是否包含订阅者的userId,如果包含就会向该订阅者推送事件。
注意事项
- 过滤条件可以基于mutation的输入参数,也可以基于mutation返回的字段值,根据你的需求选择即可;
- 过于复杂的过滤逻辑可能会影响订阅推送的性能,建议尽量保持过滤规则简洁高效;
- 如果你使用的是AppSync的实时数据源(比如DynamoDB Streams),也可以在数据源层面配合设置过滤条件,实现更精细化的控制。
内容的提问来源于stack exchange,提问作者Vincent Pang
相关产品推荐
相关产品推荐

