“在分布式环境中,不使用多用途”-为什么?

时间:2019-05-17 10:36:47

标签: java multithreading concurrency distributed-computing distributed-system

我正在开发一个平台,该平台托管小型Java应用程序,当前所有这些应用程序都使用一个线程,并驻留在Docker引擎中,使用来自Kafka服务器的数据并登录到中央数据库。

现在,我需要在该平台上放置另一个Java应用程序。这款应用程序使用的多线程处理量相对较高,我已经在Docker容器中对其进行了测试,并且在该容器中可以完美运行,因此,我准备将其部署在可以手动扩展的平台上,也就是说,有人可以定义数量将会启动的容器,每个容器都包含此应用程序的一个实例。

我的架构师有一个异议,说“在分布式环境中,我们从不使用多线程”。所以现在,我必须重构我的应用程序,从中删除任何与线程相关的逻辑,使其成为单线程。我要求他提供更详细的推理,但是他大喊:“如果您不了解这一原理,那么您在Java附近就没有地方了。”

在分布式系统中使用多线程Java应用程序确实是一个错误-一个具有十或二十个物理机的简单集群,每个物理机托管多个虚拟机,然后运行Docker容器,并在其中包含Java应用程序。 / p>

老实说,我没有看到容器内的多线程问题。 真的是一个错误还是某种程度上的“禁止”?

谢谢。

4 个答案:

答案 0 :(得分:2)

例如,当编写将在Java EE应用程序服务器中运行的Web应用程序时,通常,您不应该在Web应用程序中启动自己的线程。应用服务器将管理线程,并分配线程以处理服务器上的传入请求。

但是,没有硬性规则或理由说明为什么在分布式环境中使用多线程永远不是一个好主意。

使应用程序成为单线程有很多优点:代码将更简单,并且您不必处理棘手的并发问题。

但是“在分布式环境中我们从不使用多线程”不一定总是正确的,并且“如果您不了解此原理,那么您在Java附近就不会占有一席之地”听起来很自大和屈尊。

答案 1 :(得分:1)

我想他只是告诉您这一点,因为使用单线程消除了多线程和数据排序问题。 多线程没有什么问题。

答案 2 :(得分:0)

什么?我们在应用程序中大量使用RxJava和Spring Reactor,并且效果很好。无论如何,您无法使用跨两个JVM的线程。因此,只需确保您的逻辑在单个JVM上按预期工作即可。

答案 3 :(得分:0)

分布式系统通常具有受I / O严格约束的任务。

如果系统中有I / O呼叫阻塞

在进程内实现并发的唯一方法是生成新线程来执行其他有用的工作。 (多线程)。

  • 这种方法的警告是,如果线程太多 在运行中,操作系统将花费太多时间 在线程之间切换,这是浪费工作。

如果您的系统中I / O呼叫处于非阻塞状态

然后,您可以避免使用多线程方法,而使用单个线程来满足您的所有请求。 (了解事件循环或Java的Netty框架或NodeJS)

单线程方法的优势

  1. 操作系统没有任何浪费的线程上下文切换。
  2. 您不会遇到任何死锁或争用条件等并发问题。

缺点是

  1. 以非阻塞方式进行编码/思考通常较困难
  2. 您通常最终会以阻塞队列的形式使用更多的内存。