我需要处理数百万个线程,我知道它完全依赖于硬件配置和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测试过,结果并不令人鼓舞。
感谢。
答案 0 :(得分:2)
我的方法是否正确
IMO,不,这绝对不是正确的做法。
如果没有,任何人都可以建议我如何在我的网络应用程序中实现最大线程。
分离从客户端接收消息并处理消息。这样,您可以独立地horizontally scale这两个部分,以满足您的要求,而无需在单个JVM中拥有数百万个线程。
一些建议:
1)我将Web应用程序尽可能轻,并将任何长时间运行的任务提交给某种后端处理器。
在同一个JVM中,您可以使用ThreadPoolExecutor with an ArrayBlockingQueue。
如果要将作业提交到另一个JVM,可以将JMS与competing consumers或Apache Kafka一起使用。
此处的好处是,您可以根据需要向应用的后端或前端添加更多节点。
2)如果需要,请将应用程序服务器的线程池放大。
例如,使用Tomcat,您可以调整此处描述的参数:http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html。解释如何正确调整这些参数比我在这里描述的更多。除其他外,您选择的值将取决于平均并发请求数,最大并发请求数,提供单个请求所需的时间以及池中的应用程序服务器数。
3)通过减少状态,您将获得最大的可扩展性。
如果可以将请求分派给任何前端使用者,然后由任何后端使用者处理,则可以添加更多的实例以进行扩展。如果一个请求依赖于另一个请求,则需要跨节点同步请求处理,这会降低可伸缩性。如果可能的话,从一开始就设计出无国籍的东西。
我已经用Jmeter测试过,结果并不令人鼓舞。
您需要profile your application来确定热点的位置。如果您遵循我上面的建议,您可以根据需要轻松添加更多马力。