在java中并发执行数百万个线程

时间:2014-01-21 13:00:20

标签: java multithreading threadpool

我需要处理数百万个线程,我知道它完全依赖于硬件配置和jvm。 我已经将执行程序用于任务

我的项目的呼叫流程:

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

代码呼叫流程:  甲------>乙----------&以及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,它在加载应用程序时加载。

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

我已经用Jmeter测试过,结果并不令人鼓舞。

感谢。

1 个答案:

答案 0 :(得分:2)

  

我的方法是否正确

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

  

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

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

一些建议:

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

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

如果要将作业提交到另一个JVM,可以将JMS与competing consumersApache Kafka一起使用。

此处的好处是,您可以根据需要向应用的后端或前端添加更多节点。

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

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

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

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

  

我已经用Jmeter测试过,结果并不令人鼓舞。

您需要profile your application来确定热点的位置。如果您遵循我上面的建议,您可以根据需要轻松添加更多马力。