trpc-group / trpc-cpp

A pluggable, high-performance RPC framework written in cpp
Other
270 stars 78 forks source link

【腾讯犀牛鸟计划】实现过载保护插件 - 令牌桶 #143

Open weimch opened 2 months ago

weimch commented 2 months ago

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给下一位等候者。

leolin49 commented 2 months ago

已成功领取本issue

leolin49 commented 2 months ago

你好,我目前在测试过程中遇到了一个问题,bazel编译成功,trpc_server的日志也没有打印任何错误信息,客户端也能接受到返回信息,但是trpc_server似乎没有调用过载保护插件(我在server filter中的OnRequest函数中使用TRPC_FMT_INFO打印调试信息,但是日志中并没有输出,包括我也测试了其他已经完成的插件,如flow_control)。

想问一下可能是什么原因?

其中已经按照要求对过载保护插件bazel编译进行配置。

1. bazel编译选项 image 2. trpc_server启动配置 image

weimch commented 2 months ago

filter是否通过AddServerFilter加入到了拦截器管理系统中?

leolin49 commented 1 month ago

filter是否通过AddServerFilter加入到了拦截器管理系统中?

感谢您的指点,我这边测试起来没什么大问题了,后续再优化一下代码和补充下注释就提交PR。

weimch commented 1 month ago

记得也单独给一个可运行的例子代码及文档链接,附上编译运行步骤(这部分不用提PR)

leolin49 commented 1 month ago

已提交 PR,并已附上测试代码和测试文档

bxw430 commented 1 day ago

已成功领取本issue