Spring Pub/Sub集成中为订阅者配置消息过滤器的实现方法
Spring Integration集成Google Pub/Sub配置原生消息过滤器方案
Google Pub/Sub的原生消息过滤器是订阅级别的服务端能力,配置完成后服务端会直接过滤不符合规则的消息,不会投递到订阅端,比客户端过滤节省带宽和算力成本。
1. 新建订阅时直接指定过滤规则
如果你使用Spring Cloud GCP Pub/Sub模块集成Spring Integration,可以通过PubSubAdmin实例在创建订阅时直接指定过滤表达式,规则可基于消息自定义属性、消息内容编写。
示例代码如下:
// 注入PubSubAdmin实例 @Autowired private PubSubAdmin pubSubAdmin; public void createFilteredSubscription() { // 过滤规则示例:仅当消息携带messageType属性且值为RESPONSE时才投递到当前订阅 String filterExpression = "attributes.messageType = \"RESPONSE\""; pubSubAdmin.createSubscription( "async-response-sub", // 事件发送端的异步响应订阅名 "your-business-topic", // 公用的Pub/Sub主题名 PushConfig.getDefaultInstance(), 600, // 消息确认超时时间,单位秒 filterExpression, false // 是否开启消息排序 ); }
2. 已有订阅更新过滤规则
如果订阅已经预先创建,你可以通过PubSubTemplate或直接调用Google Cloud Pub/Sub原生客户端更新订阅的过滤配置即可,无需重新创建订阅。
3. 适配你当前业务场景的配置建议
你当前的异步请求响应场景,可按以下规则配置实现消息隔离:
- 事件发送端发出请求时,给消息添加自定义属性
messageType: REQUEST - 事件消费端处理完请求返回响应时,给消息添加自定义属性
messageType: RESPONSE - 消费端的请求订阅配置过滤规则:
attributes.messageType = "REQUEST",仅会收到请求类消息,不会收到自己发送的响应消息 - 发送端的响应订阅配置过滤规则:
attributes.messageType = "RESPONSE",仅会收到对应响应消息
配置完成后即可从服务端层面过滤不需要的消息投递,无需在客户端额外处理空消息逻辑。
内容的提问来源于stack exchange,提问作者Per Newgro
相关产品推荐
相关产品推荐

