Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

【腾讯犀牛鸟计划】实现过载保护插件 - 固定时间窗口 #142

Closed
weimch opened this issue Jun 26, 2024 · 12 comments
Closed

Comments

@weimch
Copy link
Contributor

weimch commented Jun 26, 2024

issue介绍

作为实现服务高可用的一部分,过载保护算法是一种常用手段,能在请求激增的时候防止服务过载导致的性能急剧恶化甚至崩溃。

不同的负载均衡算法适用于不同的业务场景,固定时间窗算法的实现原理是,统计固定时间周期内的请求量,超过限额就会启动限流,因其实现简单有效而被应用较多。

你需要开发一个固定时间窗口的过载保护插件,并提PR到tRPC-Cpp中。

具体地,你可以参考下面的步骤进行开发
1、继承抽象类ServerOverloadController,实现过载保护插件。
2、实现server filter,调用过载保护插件。
3、用于测试验证,你可以复用examples/helloworld的代码来做测试,用在yaml里为服务配置server filter,额外的,你还需要改写fiber_client客户端代码,让其并发发送请求,提高并发量触发过载保护的效果。

参考资料

1、需要基于框架当前提供的过载保护的抽象类开发:trpc/overload_control/server_overload_controller.h

其他说明

本issue为2024犀牛鸟开源人才培养活动专属issue,仅供在校大学生参与领取
【认领issue】在研学基地"issue营地"对应issue行的M~R列抢滩报名,即视为认领成功
【完成issue】已认领issue的同学,请同步在本issue评论区回复“已成功领取本issue”; 如7天内无提交任何进展包括不限于comment \ commit \ Pull Request,则将视为同学主动放弃issue,组委会将释放issue给下一位等候者。

@fengyusen
Copy link

已成功领取本issue

1 similar comment
@Heaven2024
Copy link

已成功领取本issue

@Heaven2024
Copy link

Heaven2024 commented Jul 15, 2024

没有太理解这里的2.实现server filter,调用过载保护插件。 我目前的实现是在服务端直接集成了过载保护插件,具体在helloworld_server.cc中,我将实现的逻辑包装进了了GreeterServiceImpl通过 auto overloadControlledGreeterService = std::make_shared<OverloadControlledGreeterService>(greeterService, overloadController);请问这样实现是否符合要求,或者可以进一步说明一下server filter的逻辑?感谢

@weimch
Copy link
Contributor Author

weimch commented Jul 16, 2024

没有太理解这里的2.实现server filter,调用过载保护插件。 我目前的实现是在服务端直接集成了过载保护插件,具体在helloworld_server.cc中,我将实现的逻辑包装进了了GreeterServiceImpl通过 auto overloadControlledGreeterService = std::make_shared<OverloadControlledGreeterService>(greeterService, overloadController);请问这样实现是否符合要求,或者可以进一步说明一下server filter的逻辑?感谢

不符合要求哈,rpc框架通过拦截点扩展功能,具体是可以在rpc前后执行一些自定义的逻辑,实现server filter就是接入到这个拦截点的方法,你可以参考trpc-cpp提供的拦截器文档来实现,但需要继承server_overload_controller实现过载保护逻辑,并用server filter调用他。

https://github.com/trpc-group/trpc-cpp/blob/main/docs/README.zh_CN.md

image

@Heaven2024
Copy link

Heaven2024 commented Jul 22, 2024

你好,目前我将插件的逻辑都实现了,测试也没有问题
image
但是用example进行测试时没能触发过载保护逻辑,包括我测试了现有的concurrency_limiter也没有触发,想问下原因怎么排查?
服务端注册:
image
客户端:
image

@weimch
Copy link
Contributor Author

weimch commented Jul 23, 2024

yaml文件里是不是没有填filter?

https://github.com/trpc-group/trpc-cpp/blob/main/docs/zh/filter.md

image

@Heaven2024
Copy link

yaml文件里是不是没有填filter?

https://github.com/trpc-group/trpc-cpp/blob/main/docs/zh/filter.md

image
image

@leolin49
Copy link

是不是 .brazelrc中的编译选项 没加

@Heaven2024
Copy link

Heaven2024 commented Jul 24, 2024

是不是 .brazelrc中的编译选项 没加

加了的,要不然test文件也没法成功运行0.0

@weimch
Copy link
Contributor Author

weimch commented Jul 24, 2024

感觉文档写得有问题,看了下代码,在service里配置的话,要这样填

server:
    service:
      - name: xxx
        service_filters:
          - fixedwindow_limiter

@shenh09
Copy link

shenh09 commented Aug 9, 2024

已成功领取本issue

@weimch
Copy link
Contributor Author

weimch commented Sep 19, 2024

已经实现并合入

#179

@weimch weimch closed this as completed Sep 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants