2024年初,某电商平台在大促期间遇到性能事故,Java服务在并发连接数超过2万时响应延迟显著增加。问题源于线程模型不当,导致内存耗尽和频繁的上下文切换。文章探讨了不同线程模型(如每请求一线程、Reactor、Proactor、协程)的性能边界及其对架构决策的影响,强调选择合适模型以应对高并发场景的重要性。
作者在使用tonic grpc框架时发现性能不足,主要瓶颈在于tokio运行时和http2协议解析。为此,他开发了一个基于线程模型的grpc框架,性能比tonic快10倍,期待反馈和建议。
线程模型经历了从单线程到多线程和并行执行的演变。尽管多线程在高性能应用中至关重要,单线程架构因其简单性和维护性在现代分布式系统中仍然重要。混合模型结合了单线程和工作线程,以优化性能。
PostgreSQL的扩展性受限于基于进程的模型,开发人员考虑迁移到线程模型以提升共享状态和降低成本,但面临全局变量处理和性能损失的挑战。讨论结果显示大多数开发人员认为这种变化是好的,但目前没有人愿意投入时间来推动这一努力,因此在可预见的未来内不会转向线程模型。
从1996年1月的JDK1.0版本开始,Java就建立了基本的线程模型,JDK5.0引入了Java内存模型和并发包,JDK6.0优化了synchronized,JDK7.0推出了Fork/Join框架,JDK8.0推出了CompletableFuture和Stream,JDK9.0改善了锁争用机制,JDK10推出了线程-局部管控,JDK15禁用和废弃偏向锁,JDK19支持虚拟线程,J.U.C提供了原子化对象、锁及工具套装、线程池、线程安全容器等,使Java的自动档时代到来,大大降低了程序员使用多线程的门槛。
本文解析了SOFARPC框架中的同步和异步调用方式,包括同步调用、异步Future、回调和单向调用的原理与实现。同步调用会阻塞线程,而异步调用通过Future对象或回调机制实现非阻塞操作。单向调用不关心结果,适用于不需要确认的场景。文章还讨论了超时控制和线程模型,强调合理设置超时时间的重要性,以避免阻塞业务线程。
本文介绍了SOFARPC的线程模型,涵盖了多种I/O模型,包括阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O和异步I/O。重点讨论了JAVA的BIO与NIO及其在Reactor模型中的应用。SOFARPC采用主从多线程模型,支持自定义业务线程池,以提高系统吞吐量。最后总结了不同I/O模型的特点及其在工程实践中的应用。
完成下面两步后,将自动完成登录并继续当前操作。