从顶到底的响应式编程:构建高性能 HTTP 服务器
1. 响应式编程理念与 C10k 问题
在编程领域,“一切皆流”是 RxJava 常被提及的理念。真正的响应式应用几乎从上到下都使用流,这种方式简化了逻辑推理,使应用更加一致。非阻塞应用能以少量硬件资源实现出色的性能和吞吐量,通过限制线程数量,可充分利用 CPU 而无需消耗大量内存。
Java 可扩展性的一个限制因素是 I/O 机制。 java.io 包设计精良,但标准 I/O 是完全阻塞的,每个进行读写操作的线程都可能无限期等待结果,且因网络或磁盘缓慢而阻塞的线程难以中断。创建和管理线程成本高,线程切换也耗时。虽然 Java 应用能处理大量并发连接,但需精心设计,将 RxJava 与现代事件驱动库和框架结合可降低设计难度。
C10k 问题旨在让单个服务器实现 10000 个并发连接,用传统 Java 工具包解决该问题颇具挑战。许多响应式方法能轻松应对 C10k 问题,RxJava 让这些方法更易实现。经典的每个连接一个线程的模型在解决 C10k 问题时面临困境,10000 个线程会带来以下问题:
- 消耗数 GB 的 RAM 用于栈空间。
- 给垃圾回收机制带来巨大压力。
- 浪费大量 CPU 时间进行线程上下文切换。
可扩展性有水平和垂直两种独立方法:水平扩展需增加服务器并使用前端负载均衡器,无法解决单服务器的 C10k 问题;垂直扩展需购买更强大的服务器,但阻塞 I/O 会导致内存需求与 CPU 利用率不成比例,即便大型企业服务器能处理大量连接,也难以解决 C10M 问题。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



