带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(10)

简介: 带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(10)

带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)https://developer.aliyun.com/article/1339669?groupCode=taobaotech


image.png消息限流代理

/**
* 消息限流代理
  */
@Slf4j
public class MessageThrottlerProxy { 
@Autowired
private AcquireThrottlerHandler acquireThrottlerHandler;
private MessageThrottler messageThrottler; 
@PostConstruct
public void init() {
messageThrottler = new MessageThrottlerPipeline()
.addLast(new ClassificationThrottlerHandler())
.addLast(new DuplicateThrottlerHandler())
.addLast(acquireThrottlerHandler); 
}
  /**
  * 限流单个消息
  *
* @param messageThrottlerToken 单个消息令牌
* @return 是否限流成功24  */
public boolean throttle(MessageThrottlerToken messageThrottlerToken) {
if (!SendSwitch.ENABLE_API_THROTTLER) {
return false;
  }
try {
boolean throttled = messageThrottler.throttle(messageThrottlerToken);
return SendSwitch.THROTTLER_ONLY_WATCH ? false : throttled;
} catch (Exception e) {
log.error("Failed to throttle messageSendDTO:" + messageThrottlerToken, e);
// throttle内部异常不应该影响正常请求,遇到此情况直接降级限流通过
return false;
  }
  }
  /**
  * 限流多个消息, 合并策略可通过 {@link SendSwitch#THROTTLER_MERGE_STRATEGY} 开关控制
  *
* @param messageThrottlerTokens 多个消息令牌
* @return 是否限流成功44  */
public boolean throttle(List<MessageThrottlerToken> messageThrottlerTokens) {
if (!SendSwitch.ENABLE_API_THROTTLER) {
return false;
  }
if (CollectionUtils.isEmpty(messageThrottlerTokens)) {
return false;
  }
  MergeStrategy mergeStrategy = MergeStrategy.getByName(SendSwitch.THROT- TLER_MERGE_STRATEGY);
if (mergeStrategy == null) {
log.error("illegal throttler mergeStrategy:" + SendSwitch.THROTTLER_MERGE_STRATEGY);
return false;
  }
try {
boolean throttled = mergeStrategy.throttle(messageThrottler, messageThrottlerTokens);
return SendSwitch.THROTTLER_ONLY_WATCH ? false : throttled;
} catch (Exception e) {
log.error("Failed to throttle messageSendDTO:" + messageThrottlerTokens, e);
// throttle内部异常不应该影响正常请求,遇到此情况直接降级限流通过
return false;
  }
  }
public enum MergeStrategy {
ALL {
@Override
  public boolean throttle(MessageThrottler messageThrottler, List<MessageThrottlerToken> messageThrottlerTokens) {
return messageThrottler.allThrottle(messageThrottlerTokens); 
}
  },
ANY {
@Override
  public boolean throttle(MessageThrottler messageThrottler, List<MessageThrottlerToken> messageThrottlerTokens) {
return messageThrottler.anyThrottle(messageThrottlerTokens);
}
}
public static MergeStrategy getByName(String name) { MergeStrategy[] values = values();
for (MergeStrategy value : values) {
if (value.name().equalsIgnoreCase(name)) { return value;
}
}
return null;
}
public abstract boolean throttle(MessageThrottler messageThrottler, List<MessageThrottlerToken> messageThrottlerTokens);
}
}


ps: 相关类并未全部列出,仅展示主要逻辑

 

团队介绍

 

欢迎加入淘宝移动技术中台,团队成员大牛云集,有阿里移动中间件的创始人员、鹰眼全链路追踪平台核心成员、更有一群热爱技术,期望用技术推动业务的小伙伴。

淘宝移动技术中台,推进大淘宝技术(淘宝、天猫等)架构升级,致力于为淘系、整个集团提供基础核心能力、产品与解决方案:

  1. 业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应限流、隔离与熔断的柔性高可用解决方案, 站点高可用:故障自愈、多机房与异地容灾与快速切流恢复);
  2. 新一代的业务研发模式FaaS(一站式函数研发Gaia平台);
  3. 下一代网络协议QUIC实现与落地;
  4. 移动中间件(API网关MTop、域名调度AMDC、消息/推送、文件上传AUS、移动配置推送Orange 等等)。
相关文章
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(4)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(4)
|
设计模式 Java Maven
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(1)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(1)
125 0
|
存储 Java API
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)
108 0
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)
|
应用服务中间件 程序员 数据库
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)
110 0
|
JSON Java 测试技术
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(7)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(7)
114 0
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(7)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(7)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(7)
|
IDE 前端开发 Java
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(5)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(5)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(8)
带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(8)