我们需要额外的背压控制吗?
背景
在探索全链路WebFlux响应式编程与gRPC调用时,我试图增加给生产者增加背压控制这个东西,寄希望于:消费端能通过一个gRPC接口控制生产端的生产速率。
但是后来我发现完全错了,这样的背压控制给生产端带来的逻辑复杂度不是一星半点。
所以本文主要探讨的问题就是:为什么我们不需要背压控制,以及带来了什么样的复杂度。
全链路WebFlux响应式编程与gRPC调用
当然开始之前,我们需要一个实际场景来说明问题:
试想一个场景:你需要通过gRPC从一个服务读取整个数据表到另一个服务,不用担心分页、内存溢出等问题。更神奇的是,当处理时间过长时,消费端会自动停止生产端的数据流,生产端甚至可以停止其响应式数据库驱动程序(如R2DBC),完全停止从数据库读取数据。
你觉得需要写多少代码才能实现这样健壮的功能?答案可能会让你惊讶:不到200行代码。
是的,这对于webflux来说是完全可以做到的。
开发的步骤甚至很简单:
- 生产端/消费端都引入gRPC框架
- 定义 data_stream.proto 文件
信息
这里不做具体代码的展开了,网上的教程其实挺多的。
然后一对接,你就拥有了上述的功能,甚至不用分页就支持亿级数据传输。gRPC带来的性能提升也非常可观,吞吐量上升、延迟最低降低至不到1ms,这在REST API中是不可能的。