带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)https://developer.aliyun.com/article/1339669?groupCode=taobaotech
消息限流代理
/** * 消息限流代理 */ @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: 相关类并未全部列出,仅展示主要逻辑
团队介绍
欢迎加入淘宝移动技术中台,团队成员大牛云集,有阿里移动中间件的创始人员、鹰眼全链路追踪平台核心成员、更有一群热爱技术,期望用技术推动业务的小伙伴。
淘宝移动技术中台,推进大淘宝技术(淘宝、天猫等)架构升级,致力于为淘系、整个集团提供基础核心能力、产品与解决方案:
- 业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应限流、隔离与熔断的柔性高可用解决方案, 站点高可用:故障自愈、多机房与异地容灾与快速切流恢复);
- 新一代的业务研发模式FaaS(一站式函数研发Gaia平台);
- 下一代网络协议QUIC实现与落地;
- 移动中间件(API网关MTop、域名调度AMDC、消息/推送、文件上传AUS、移动配置推送Orange 等等)。