Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[WIP]cluster concurrent flow control #1629

Closed
wants to merge 13 commits into from

Conversation

yunfeiyanggzq
Copy link
Contributor

@yunfeiyanggzq yunfeiyanggzq commented Jul 24, 2020

Describe what this PR does / why we need it

目前这个pr是集群并发流控的整体实现代码,基本功能已经实现,pr会拆分成多个提交,目前仅用于感兴趣的朋友测试,一起讨论完善方案,欢迎大家提出宝贵意见

Does this pull request fix one issue?

Fixes #1477

Describe how you did it

为了实现集群并发流控,我们必须存储每个调用的信息,发现并清除那些不正常的资源调用。具体的讲,当token client发起调用时会获得token Server颁发的身份标识tokenId, token server会存储这个tokenId值和相关的信息。当调用结束时,token client会携带着该次调用被分配的tokenId前往token server请求释放资源,token server会删除这个调用对应的 tokenId。通过这样的操作,我们能够实时的统计当前正在进行的调用数量,即并发量。如果出现资源调用超时或者token client掉线的情况,token server会尝试着去发现删除对应调用并清除存储的tokenId,从而获得准确的并发量nowCalls。

图片
图片

具体请见:
中文提案.pdf

English proposal .pdf

Describe how to verify it

演示视频: https://www.yuque.com/docs/share/4238f458-7bdf-4689-91e3-3c5527698731?# 《集群并发控制演示视频》

可以查看单元测试,也可以demo演示。
可以通过这两个demo进行测试,测试server端并发请求,client端并发请求,client端掉线,client端调用超时等情况, 需要在nacos配置动态规则
图片

demo类如下:
sentinel-demo/sentinel-demo-cluster/sentinel-demo-cluster-server-alone/src/main/java/com/alibaba/csp/sentinel/demo/cluster/ClusterClientDemo.java
sentinel-demo/sentinel-demo-cluster/sentinel-demo-cluster-server-alone/src/main/java/com/alibaba/csp/sentinel/demo/cluster/ClusterServerDemo.java
动态规则如下:

[
    {
      "clusterConfig":{
      "acquireRefuseStrategy":0, // 当优先级请求block执行的策略,0:忽略直接block,1:client再次请求,2:client多次请求直到成功,3.server阻塞队列等待获取,最大等待时间是maxQueueingTimeMs参数,队列最大大小为1000
      "clientOfflineTime":3000,   // server端保存掉线client持有token的最长时间
      "fallbackToLocalWhenFail": true,
      "flowId":111,
      "resourceTimeout":2000,  // client端资源调用超过这个时间后执行resourceTimeoutStrategy策略
      "resourceTimeoutStrategy":1,// 0: 由server释放超时token,1:由client释放超时token
      "sampleCount":10,
      "strategy":0,
      "thresholdType":1,
      "windowIntervalMs":1000
    },
    "clusterMode":true,
    "controlBehavior":0,
    "count":100.0,
    "grade":0,
    "limitApp":"default",
    "maxQueueingTimeMs":500, // 在并发控制是服务端阻塞队列的最大等待时间。
    "resource":"cluster-resource",
    "strategy":0,
    "warmUpPeriodSec":10
   }
]

流控效果大致如图所示,纵轴为并发数,横轴为请求顺序
图片

Special notes for reviews

Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
@yunfeiyanggzq
Copy link
Contributor Author

yunfeiyanggzq commented Aug 16, 2020

@sczyh30 @cdfive @jasonjoo2010 现在基本功能已经完成,各位前辈如果有空可以帮忙测试一下性能和功能,代码优化和规范化的问题我会分批提交pr并优化

Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
Signed-off-by: yunfeiyanggzq <yunfeiyang@buaa.edu.cn>
CST11021 pushed a commit to CST11021/Sentinel that referenced this pull request Nov 3, 2021
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
area/cluster-flow Issues or PRs related to cluster flow control
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[RFC] Distributed concurrency control
2 participants