响应式编程是银弹吗?
免责声明~
切记,任何文章不要过度深思(任何东西都无法经得起审视,因为这世上没有同样的成长环境,也没有同样的认知水平同时也「没有适用于所有人的解决方案」;也不要去急着评判里面列出的观点,只需代入到其中适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」就行。具体怎么想怎么做全在你自己去「不断实践中寻找那个适合自己的方案」)
一起展望响应式编程未来的发展趋势,它到底能否成为“银弹”?
1 响应式编程是趋势
在现代互联网应用系统开发过程中,即时响应性是可用性和实用性的基石。如何使得系统在出现失败时依然能够保持即时响应性是一项挑战。
分布式系统具有的服务容错、限流和降级等传统技术体系是应对这一挑战的主要手段,但这些更多是从系统架构和部署入手,而不在于编程模型和技术。而响应式编程代表一种全新编程模型,开发者能在编程工具和代码实现层面就考虑到服务弹性问题。
2017 年 Spring 5 正式发布,响应式编程就是最大革命,也是 Spring 目前重点推广技术栈。响应式编程也是 Spring 家族内部所采用的核心技术体系,Spring Webflux、Spring Cloud Gateway 等诸多框架都在深度应用。虽然,业界也存在其他响应式编程技术体系,但 Spring 为我们提供最新、最全解决方案,值得Javaer深入学习并实践。
Spring 中各个响应式组件背后使用的都是 Project Reactor 框架,而该框架在当下是最符合响应式流规范的一种实现方案,预计未来一段时间内将会在这一领域中处于技术领先位置。同样的,越来越多的不属于 Spring 家族中的开发框架也在使用 Project Reactor 构建其底层的响应式运行环境。
此外,Spring 中提供的响应式编程组件非常全面,涵盖了响应式 Web 服务、响应式数据访问、响应式消息通信等分布式系统开发所涉及的各个领域。这使得开发人员可以非常方便地基于这些组件构建完整的全栈式响应式系统。尤其是,Spring 在努力推进的 R2DBC 组件在很大程度上弥补了针对关系型数据库访问的响应式编程模型的缺失,具有很高的创新型。更不要说,Spring 中集成了 RSocket 等这种目前非常主流的基于响应式流的网络通信协议了。
毫无疑问,响应式编程代表着未来的一种技术趋势。但理论和实践的结合下,也应清醒地认识到响应式编程并非新鲜事物,而是一种新型的编程模型,它既不局限于其实现框架,更加不是解决所有问题的“银弹”。在具有很多优势的同时,它也存在着一些开发人员所不得不面对的问题,还有待我们挖掘。
2 期待响应式编程成为“银弹”
本教程通过对 Web MVC 和 WebFlux 对比发现,其中包含一些定性和定量指标。
还应考虑的一项核心定性指标就是学习曲线。Web MVC 是耳熟能详的框架,有超过十几年的广泛应用。它依赖命令式编程这最简单编程范式。对业务系统,这意味着如果我们基于简单的 Spring 5 和 Web MVC 构建一个新项目,招聘熟练的开发会容易得多,而培养新人成本也低很多。
然而,基于 WebFlux 情况将会有很大不同:
- WebFlux 是一项新技术,尚未充分证明自己,可能存在很多 bug 和漏洞
- 响应式编程底层的异步、非阻塞编程范例也可能是问题
因此,我们要明确:对异步、非阻塞代码的调试很困难!因为异步编程是基于回调,由一个事件循环驱动。在尝试跟踪请求时,事件循环的堆栈跟踪毫无意义。这是因为处理的是事件和回调,少有工具帮助调试。边界情况、未处理的异常以及错误处理的状态更改会创建悬空资源,从而导致内存泄漏、文件描述符泄漏或丢失响应等。
业界也有一些案例论证了这一观点,Netflix 尝试将 Zuul 迁移到响应式编程模型以失败告终。事实证明,这些类型的问题很难调试,你很难知道哪个事件没有得到正确处理或者没有得到适当清理。
3 业务角度
招募具有异步和非阻塞编程知识的开发工程师也很困难。从头开始指导新的开发人员需要花费大量的时间和金钱,而且无法保证他们会完全理解。
幸运的是,通过使用 Project Reactor 和 Spring 框架可解决这一问题的一部分,因为 Project Reactor 和 Spring 框架使得构建有意义的响应式转换流更简单,并且隐藏了异步编程中最难的部分。
不幸的是,这些框架并没有解决所有问题,响应式编程本身的复杂度需要我们考虑投入产出比,以及系统架构过程中的平衡性。
4 展望
既然如此,我们在探索的过程中,也请期待响应式编程技术以及以 Spring 为代表的开发框架能够有更好的发展,为开发人员提供更友好的开发体验。
写在最后
公众号
:JavaEdge
专注分享软件开发全生态相关技术文章
、视频教程
资源、热点资讯等,如果喜欢我的分享,给 🐟🐟 点一个赞
👍 或者 ➕关注
都是对我最大的支持。
文章转载自公众号: JavaEdge