trpc-group / trpc-cpp

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

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

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

fengyusen commented 2 months ago

已成功领取本issue

Heaven2024 commented 2 months ago

已成功领取本issue

Heaven2024 commented 2 months ago

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

weimch commented 2 months ago

没有太理解这里的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 commented 1 month ago

你好,目前我将插件的逻辑都实现了,测试也没有问题

image

但是用example进行测试时没能触发过载保护逻辑,包括我测试了现有的concurrency_limiter也没有触发,想问下原因怎么排查? 服务端注册:

image

客户端:

image
weimch commented 1 month ago

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

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

image
Heaven2024 commented 1 month ago

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

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

image
image
leolin49 commented 1 month ago

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

Heaven2024 commented 1 month ago

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

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

weimch commented 1 month ago

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

server:
    service:
      - name: xxx
        service_filters:
          - fixedwindow_limiter
shenh09 commented 1 month ago

已成功领取本issue