<commit_before>---
layout: post
title: "热点商品QPS过高的流控处理"
description: "记录一些自己觉得可以工具化的代码"
categories: [工作]
tags: [Code]
---

* Kramdown table of contents
{:toc .toc}

# 热点商品QPS过高的流控处理

## 1. 背景

**问题：**          
服务为居于电商交易核心链路上，本身服务需要抗的QPS就特别高（百万QPS量级），导致机器负载和底层存储（比如缓存，DB等）压力就特别大，如果再有一些热点商品的请求（比如一个商品请求一个接口的QPS可达万级别）的话，对底层存储的压力就会尤其严重，甚至会打垮存储。       

**目标：**          
想要写个流控代码，流控代码的预期功能如下：           
1. 支持对商品ID请求一个接口或几个接口的QPS做控制，如果一个商品请求一个/几个接口的QPS和超过阈值，则触发熔断，快速失败返回上游。         
2. 支持对一个接口/几个接口进行分组，也就是说可以支持商品ID再这个组内的QPS和超过阈值。          
3. 支持对特殊商品单独控制，比如普通商品流控是1wQPS，但大促商品可以稍微放宽到5wQPS，在保证预期内的系统稳定前提下，最大限度的保证GMV。           
4. 支持临时调整流控阈值，并且实时生效，不需要发布服务。            
5. 支持一键开关。           <commit_msg>Update 2022-02-22-lrutk.md<commit_after>---
layout: post
title: "热点商品QPS过高的流控处理"
description: "记录一些自己觉得可以工具化的代码"
categories: [工作]
tags: [Code]
---

* Kramdown table of contents
{:toc .toc}

# 热点商品QPS过高的流控处理

## 1. 背景

**问题：**          
服务为居于电商交易核心链路上，本身服务需要抗的QPS就特别高（百万QPS量级），导致机器负载和底层存储（比如缓存，DB等）压力就特别大，如果再有一些热点商品的请求（比如一个商品请求一个接口的QPS可达万级别）的话，对底层存储的压力就会尤其严重，甚至会打垮存储。       

**目标：**          
想要写个流控代码，流控代码的预期功能如下：           
1. 支持对商品ID请求一个接口或几个接口的QPS做控制，如果一个商品请求一个/几个接口的QPS和超过阈值，则触发熔断，快速失败返回上游。         
2. 支持对一个接口/几个接口进行分组，也就是说可以支持商品ID再这个组内的QPS和超过阈值。          
3. 支持对特殊商品单独控制，比如普通商品流控是1wQPS，但大促商品可以稍微放宽到5wQPS，在保证预期内的系统稳定前提下，最大限度的保证GMV。           
4. 支持临时调整流控阈值，并且实时生效，不需要发布服务。            
5. 支持一键开关。              

{'fraction_non_alphanumeric': 0.11307420494699646, 'fraction_numerical': 0.01696113074204947, 'mean_word_length': 3.627450980392157, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7288841', 'n_tokens_mistral': 1065, 'n_tokens_neox': 1229, 'n_words': 69}