基本的场景是这样的:
一个上游请求进来,我们需要同时向外部合作平台(N个)发起N个请求,同时需要在一定时间内得到响应,若超时则弃用。同时将这些响应选择回应给最初的上游请求。
所以选择使用ExecutorService,用
List<Future<Object>> result = es.invokeAll(tasks, TIME_OUT, TimeUnit.MILLISECONDS);
得到执行结果;同时http请求也设置了超时参数:
urlConnection.setConnectTimeout(100);
urlConnection.setReadTimeout(100);
在并发不高的情况下,程序没有问题。但在并发达到1000左右的时候,程序就出问题了。具体表现为:
在设置了TIME_OUT的情况下,偶尔也会出现超时但ExecutorService并没有放弃任务,并在大于TIME_OUT的时间返回执行结果。由于时效性非常高,超时的响应不但无效,而且直接影响了上游请求的响应时效。
现在困惑的是,代码都是在方法内部完成,没有共享变量,因而没有线程安全问题。那么,问题究竟出现在哪里?求解。
这里要注意一点, 接收数据 和 处理数据, 在高并发的时候一定要分成两个程序来处理.
需要采异步的方式来处理