【发布时间】:2022-12-09 17:10:01
【问题描述】:
我们的 gRPC 需要处理 1000 QPS,每个请求都需要一个列表顺序操作发生,包括一个是使用 JDBC 从数据库中读取数据。处理单个请求最多需要 50 毫秒。
我们的应用程序可以用两种方式编写:
- 选项 1 - 每个请求一个经典的阻塞线程:我们可以创建一个大线程池(~200)并简单地为每个请求分配一个线程,并在等待数据库时让该线程阻塞。
- 选项 2 - 以真正非阻塞的方式处理每个请求:.这将需要我们使用一个非阻塞的 MySQL 客户端,我不知道它是否存在,但现在让我们假设它存在。
我的理解是非阻塞方法具有以下优点和缺点:
- 优点:允许减少所需的线程数,从而减少内存占用
- 优点:节省操作系统的一些开销,因为它不需要为等待 IO 的线程提供 CPU 时间
- 缺点:对于大型应用程序(其中每个任务都订阅对前一个任务的回调),它需要将单个请求拆分到多个线程,从而产生不同类型的开销。如果同一请求在多个物理内核上执行,则可能会增加开销,因为数据可能在 L1/L2 内核缓存中不可用。
问题一:尽管非阻塞应用程序似乎是很酷的新事物,但我的理解是,对于不受内存限制且创建更多线程不是问题的应用程序,目前尚不清楚编写非阻塞应用程序实际上是否更有效CPU 效率高于编写阻塞应用程序。有任何理由不相信吗?
问题2:我的理解也是,如果我们使用 JDBC,连接实际上是阻塞的,即使我们让应用程序的其余部分成为非阻塞的,由于 JDBC 客户端,我们失去了所有的好处,在这种情况下,选项 1 是最可能更好?
【问题讨论】:
标签: java asynchronous jdbc nonblocking