【发布时间】:2021-03-25 22:40:08
【问题描述】:
我有一些用java写的微服务,通过gRPC相互通信,放到AWS ECS中运行。 当我运行服务并使用客户端程序调用这些服务时,我注意到了一件很奇怪的事情。
通常,Tomcat 的线程池设置将确保多个请求将由相同数量的线程处理。但是当我运行我的程序时,有时它会发生一个线程开始处理一个新请求,而它已经在处理一个先前的请求。它使进程线程不安全,因此发生了错误。 这在普通服务上很少发生,当我同时向同一个服务发送 10 个请求时一定会发生。
请问有没有遗漏的设置?我可以在互联网上搜索的是我只能增加线程池大小。
---------2020/12/22 已编辑---------
通过进入调试模式,我看到一个 RPC 请求将被拆分为两个任务。一个用于消息本身,另一个用于从第一个任务返回的侦听器。我之前 90% 的错误发生在这两个任务的时间间隔之间。 此外,在运行侦听器时,ServerImpl 类将使用上下文来处理每个 RPC 消息,以及方法单元中的每个步骤,这些方法涵盖了重写的侦听器中的所有编写代码。 因此它会在监听器运行期间发生线程切换。
【问题讨论】:
-
一个线程在处理另一个请求的同时开始一个新的请求是什么意思;一个线程如何同时执行两段代码?您能详细解释一下您注意到的线程不安全问题吗?
-
@EricAnderson 从日志中,我看到线程开始处理请求 A 几个步骤,然后开始处理请求 B。有些情况最后可以同时处理请求 A 和 B,但其他情况就像请求 B 接管请求 A 一样。
标签: java multithreading tomcat grpc grpc-java