11.1 理解响应式编程

响应式编程是命令式编程的一种替代范式。它的出现是为了解决命令式编程的局限性。了解这些局限性,有助于我们更好地理解响应式模式的优势。

注意:响应式编程不是银弹。不要从本章或任何关于响应式编程的讨论中,得出命令式编程是魔鬼、响应式编程是天使的结论。与学习任何技术一样,响应式编程在某些场景下很合适,在另一些场景下则完全不适用,应该具体问题具体分析。

如果和大多数开发者一样,您也是从命令式编程起步的。很自然地,您现在写的大多数代码都是命令式的。命令式编程非常直观,学生在 STEM 课程中就能轻松学会,它功能强大,构成了大部分代码,驱动着众多企业运转。

道理很简单:您写的代码就是一行接一行的指令,按顺序依次执行。一个任务执行时,程序必须等它完成才能执行下一个。每一步的数据都需要完整获取后才能处理,因此必须作为整体来处理。

这样做还行……直到它不行了。当正在执行的任务被阻塞时——尤其是 IO 任务,比如写入数据库或从远程服务器获取数据——调用该任务的线程就无法做任何事情,直到任务完成。说白了,阻塞的线程就是一种浪费。

大多数编程语言(包括 Java)都支持并发编程。在 Java 中启动另一个线程并让它去执行某项工作是相当容易的,调用线程则继续执行其他工作。然而,尽管创建线程很容易,这些线程最终也可能会阻塞自己。管理多线程中的并发是很有挑战性的,线程越多,复杂度越高。

相反,响应式编程是函数式和声明式的。它关注的是描述数据流经过的 pipeline 或 stream,而不是描述一组按顺序执行的步骤。响应式流在数据可用时立即处理,而不是等待数据作为整体提供。事实上,输入数据可以是无限的(例如,某个地点实时温度数据的持续流)。

注意:如果您是 Java 函数式编程新手,可以参考 Pierre-Yves Saumont 的《Java 函数式编程》(Manning,2017),或 Micha Pachta 的《Grokking Functional Programming》(Manning,2021)。

用一个生活中的类比来说:命令式编程就像一个装满水的气球,响应式编程就像花园里的水管。两者都是在炎热的夏天给朋友带来惊喜的方式,但执行风格截然不同:

  • 水气球一次能携带的水量是有限的,在撞击的那一刻浸湿目标。然而,水球容量有限,如果您想淋湿更多人(或把同一个人淋得更湿),唯一的选择就是增加水球数量。
  • 花园水管则将水作为一股持续的水流从水龙头输送到喷嘴。水管的容量可能有限,但在打水仗的过程中水是源源不断的。只要水从水龙头流入软管,就会持续从喷嘴喷出。而且水管很容易扩展,您和朋友们可以玩得更尽兴。

命令式编程就像打水仗中的水球,本质上没什么问题,但使用响应式编程这根"水管"的人,在可扩展性和性能方面更具优势。

results matching ""

    No results matching ""