【问题标题】:executing millions of thread concurrently in java [closed]在java中同时执行数百万个线程[关闭]
【发布时间】:2014-01-21 13:00:19
【问题描述】:

我需要处理数百万个线程,我知道它非常依赖于硬件配置和 jvm。 我已经为任务使用了执行者

我的项目的调用流程:

用户(移动)----->服务器(电信)----->应用程序----->服务器(电信)----->用户

代码调用流程: A-------->B---------->C

    //Code snippet of A
    public static final int maxPoolSize=100;
ExecutorService executorCU=Executors.newFixedThreadPool(maxPoolSize);

    Runnable handleCalltask=new B(valans, sessionID, msisdn);
executorCU.execute(handleCalltask);

    //Code snippet of B
    public static final int maxPoolSize=10;
ExecutorService executor=Executors.newFixedThreadPool(maxPoolSize);

    Runnable handleCalltask=new c(valans, sessionID, msisdn);
executor.execute(handleCalltask);

还有共享地图,我实现为 concurrencyHashMap,它在应用程序加载时被加载。

我的方法是否正确,如果不是,任何人都可以建议我如何在我的 Web 应用程序中实现最大线程。

我用 Jmeter 测试过,结果一点也不令人鼓舞。

谢谢。

【问题讨论】:

  • 需求从何而来?您可能应该去workplace.stackexchange.com 并询问“我如何向我疯狂的老板或客户解释数百万个线程是个坏主意”
  • 数百万个线程 -> 数百万个调用堆栈 -> 为它们准备的 TB 内存。
  • 此外,数百万线程 + 共享状态并发......这无疑是最大化资源匮乏的好方法。 ConcurrentHashMap 在这里帮不了你。如果您认真研究此问题,那么您将必须考虑类似Apache Storm
  • @Suresh 您的要求超出了天真的共享状态并发可以做到的任何事情,而不会受到巨大的惩罚。我怀疑该要求只是指定错误,但如果不是,您真的需要阅读更高级的并发主题。
  • 不要将数百万并发连接/请求与数百万线程混淆。请求排成一列,而适度的线程团队为它们提供服务。

标签: java multithreading threadpool


【解决方案1】:

我的做法是否正确

IMO,不,这绝对不是正确的方法。

如果没有,任何人都可以建议我如何在我的 Web 应用程序中实现最大线程。

将接收来自客户端的消息与处理消息分开。这样,您可以独立地horizontally scale 这两个部分来满足您的要求,而无需在单个 JVM 中拥有数百万个线程。

一些建议:

1) 我会让 Web 应用程序尽可能轻量,并将任何长时间运行的任务提交给某种后端处理器。

在同一个 JVM 中,您可以使用 ThreadPoolExecutor with an ArrayBlockingQueue

如果您想将作业提交到另一个 JVM,您可以使用带有 competing consumers 或类似 Apache Kafka 的 JMS。

这里的另一个好处是您可以根据需要向应用的后端或前端添加更多节点。

2) 如果需要,将应用服务器的线程池扩大。

例如,对于 Tomcat,您需要调整此处描述的参数:http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html。解释如何正确调整这些参数比我在这里描述的要多。除其他事项外,您选择的值将取决于平均并发请求数、最大并发请求数、处理单个请求所需的时间以及池中的应用程序服务器数。

3) 通过减少状态性,您将获得最大的可扩展性。

如果可以将请求分派给任何前端消费者,然后由任何后端消费者处理,则您可以添加更多实例以进行扩展。如果一个请求依赖于另一个请求,您将需要跨节点同步处理请求,这会降低可伸缩性。如果可能,从一开始就设计无状态的东西。

我用 Jmeter 测试过,结果一点也不令人鼓舞。

您需要profile your application 来确定热点在哪里。如果您遵循我上面的建议,您可以轻松地在需要时添加更多马力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多