针对各个用户请求,传统的 Web 应用会创建一个线程,而在用户的请求服务周期内,整个线程都是完全独占的。任何引起请求操作的阻塞,都会导致整个线程的阻塞。
由于线程阻塞而导致的系统宕机,目前比较流行的解决方案就是限流、降级、消息队列异步化处理、动态扩容 Web 服务器集群规模等。那么,有没有更简单的办法,在编程框架层面就解决这个问题呢?
李智慧,极客时间《从 0 开始学大数据》专栏作者,同程艺龙交通首席架构师、Apache Spark 源代码贡献者,长期从事大数据、大型网站架构的研发工作。曾担任阿里巴巴技术专家、Intel 亚太研发中心架构师、宅米和 WiFi 万能钥匙 CTO。有超过 6 年的线下咨询和培训经验,并著有畅销书《大型网站技术架构:核心原理与案例分析》。
作者回复: 是的,数据库连接的瓶颈属于外部资源瓶颈,程序自身是无法解决的。
但是,使用异步的数据库连接组件,可以避免获得数据库连接,以及提交数据库请求后的阻塞等待,避免线程阻塞。
作者回复: 还是有些区别,编程模型和实现机制都不太一样。
作者回复: 在Flower里其实没有调用者这个角色的,每个Service完成自己的处理后,将结果发给下个Service处理,最后一个Service负责处理最终的结果,比如要输出http响应,那么最后一个Service可以通过Flower框架内置的web对象执行web.print(String)将String返回给客户端。
作者回复: 传统的同步阻塞调用到第三个方法服务器重启了,后续也样断了。。。
你想说的应该是事务完整性,前面两个Service已经更新了部分数据,第三个服务失败了怎么办?Flower的解决方案有两种,一种是将所有事务操作聚合到一个Service统一完成,这个通过流程编排就可以做到;一种是Service记录事务日志,根据日志完整性实现事务完整性,这个稍稍复杂一点。