繁体   English   中英

如何发送并行POST请求Java

[英]How to send parallel POST requests Java

我目前正在尝试对服务器进行负载测试。 由于无法控制的问题,我无法使用jmeter进行测试。 创建一组线程并让每个线程同时或尽可能接近地发送帖子的最佳方法是什么? 我当前的实现在运行发送到POST到服务器的方法之前,使用for循环创建了多个线程。 但这根本不是并发的。

同上,除非您有一台具有多个网络接口卡(NIC)的计算机,否则您想在一个群集中而不是在多个线程中执行此操作。 您的瓶颈不是核心,而是您的NIC。 您的NIC仍将顺序清空其缓冲区。

我建议您拥有尽可能多的计算机集群。 在每台计算机上,有几个线程(只是为了确保NIC的缓冲区保持满状态)。 不要费心同步集群以同时发送请求,因为往返时间(RTT)会花费很长时间,并且会使负载测试无效。 从统计上讲,只要把每个线程锤都拿走...就算您的集群足够大,您也必定会同时收到几个POST请求。

假设您的问题只是关于同步线程,而不是创建/运行线程,那么我建议使用CountDownLatch 链接中的示例很棒。

我绝对会建议使用一些负载测试应用程序框架。 有很多选择。

话虽如此,您可以使用类似的方法开始。 这就是我的出发点。 您将需要实现performRequest方法。 至少可以说,这不是很可靠。 没有日志记录,没有报告也没有错误处理-所有这些都可以通过负载测试应用程序“免费”获得(对于某些“免费”定义)。

public class HttpClient {
    enum RequestType{
        POST,GET
    }

    private RequestType type;
    private String url;

    public HttpClient(RequestType rt, String url){
        type = rt;
        this.url = url;
    }

    public void performRequest(){
       // your code here.
    }

    public static void main(String[] args){
        List<HttpClient> clients = new ArrayList<>();
        int clientCount = Integer.parseInt(args[0]);
        String url = args[1];
        for(int i=0; i<clientCount; i++){
            clients.add(new HttpClient(RequestType.POST,url));
        }
        clients.parallelStream().forEach(HttpClient::performRequest);
    }
}

您可能需要进行一些显着的改进

  • 默认线程池很小。 它等于系统上的CPU内核数。 创建自己的ForkJoinPool实例将为您提供更大的控制权。
  • 转到一个单独的类来启动和解析args会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM