Commit 07a216ad by 黄明步

添加服务器节点识别过慢移除策略

parent d4daf21b
...@@ -216,5 +216,11 @@ public class RedisService { ...@@ -216,5 +216,11 @@ public class RedisService {
redisTemplate.expire(key, 30, TimeUnit.SECONDS); redisTemplate.expire(key, 30, TimeUnit.SECONDS);
return value; return value;
} }
public Long incr(String key, long delta, long expireTime, TimeUnit timeUnit) {
Long value = redisTemplate.opsForValue().increment(key, delta);
redisTemplate.expire(key, expireTime, timeUnit);
return value;
}
} }
...@@ -113,6 +113,41 @@ public class RetransmissionService { ...@@ -113,6 +113,41 @@ public class RetransmissionService {
FileUtil.mkdir(tempDir); FileUtil.mkdir(tempDir);
} }
/**
* 异步方法,从缓存中暂时移除识别过慢的服务器
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 服务器IP地址
*/
@Async
public void removeServerFromCache(Long startTime, Long endTime, String ip) {
String key = RedisConstant.SLOW_CALL_COUNT + ip;
// 计算时间差
long time = endTime - startTime;
// 如果时间差大于20秒,记录到redis+1
if (time > 20000) {
if (redisService.exists(key)) {
redisService.incr(key, 1);
} else {
redisService.set(key, 1, 3, TimeUnit.MINUTES);
}
}
// 判断识别时间超过10秒的次数大不大于5次,若大于则移除服务器10分钟
long count;
Object o = redisService.get(key);
if (ObjUtil.isNotNull(o)) {
count = Long.parseLong(o.toString());
if (count >= 5) {
Object object = redisService.getValue(RedisConstant.OCR_SERVER_LIST);
List<ServerInfo> serverInfos = JSONArray.parseArray(object.toString(), ServerInfo.class);
serverInfos = serverInfos.stream().filter(serverInfo -> !serverInfo.getIp().equals(ip)).collect(Collectors.toList());
redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfos, 5, TimeUnit.MINUTES);
redisService.delete(key);
}
}
}
public OcrResult getClientOcrTask() { public OcrResult getClientOcrTask() {
List<Object> result = redisService.getList("clientOcrTask"); List<Object> result = redisService.getList("clientOcrTask");
List<JSONObject> jsonList = JSONArray.parseArray(result.toString(), JSONObject.class); List<JSONObject> jsonList = JSONArray.parseArray(result.toString(), JSONObject.class);
...@@ -215,6 +250,8 @@ public class RetransmissionService { ...@@ -215,6 +250,8 @@ public class RetransmissionService {
} }
} }
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -249,6 +286,7 @@ public class RetransmissionService { ...@@ -249,6 +286,7 @@ public class RetransmissionService {
/** /**
* 根据文件大小计算超时时间 * 根据文件大小计算超时时间
*
* @param fileSizeBytes 文件大小,单位:字节 * @param fileSizeBytes 文件大小,单位:字节
* @return * @return
*/ */
...@@ -318,6 +356,8 @@ public class RetransmissionService { ...@@ -318,6 +356,8 @@ public class RetransmissionService {
} }
} }
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -483,6 +523,8 @@ public class RetransmissionService { ...@@ -483,6 +523,8 @@ public class RetransmissionService {
} }
} }
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -554,6 +596,8 @@ public class RetransmissionService { ...@@ -554,6 +596,8 @@ public class RetransmissionService {
} }
} }
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -603,6 +647,8 @@ public class RetransmissionService { ...@@ -603,6 +647,8 @@ public class RetransmissionService {
// 设置结束时间 // 设置结束时间
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -694,6 +740,8 @@ public class RetransmissionService { ...@@ -694,6 +740,8 @@ public class RetransmissionService {
// 设置结束时间 // 设置结束时间
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
removeServerFromCache(startTime, endTime, ocrServerAddress.getIp());
if (StringUtils.isEmpty(res)) { if (StringUtils.isEmpty(res)) {
this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request); this.setRequestToRedis(2, startTime, endTime, null, ocrServerAddress, request);
return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date()); return new OcrResult("007500", "识别失败,请重试", null, DateUtil.date());
...@@ -869,16 +917,16 @@ public class RetransmissionService { ...@@ -869,16 +917,16 @@ public class RetransmissionService {
// 获取缓存的服务器地址列表 // 获取缓存的服务器地址列表
List<ServerInfo> ocrServerList = serverInfoService.getCacheList(); List<ServerInfo> ocrServerList = serverInfoService.getCacheList();
if (CollUtil.isEmpty(ocrServerList)) { // if (CollUtil.isEmpty(ocrServerList)) {
// 加同步锁,防止多线程同时从数据库中获取服务器列表 // // 加同步锁,防止多线程同时从数据库中获取服务器列表
synchronized (this) { // synchronized (this) {
ocrServerList = serverInfoService.getCacheList(); // ocrServerList = serverInfoService.getCacheList();
if (CollUtil.isEmpty(ocrServerList)) { // if (CollUtil.isEmpty(ocrServerList)) {
ocrServerList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class).eq(ServerInfo::getAccessService, true)); // ocrServerList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class).eq(ServerInfo::getAccessService, true));
redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList, 60, TimeUnit.MINUTES); // redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList, 60, TimeUnit.MINUTES);
} // }
} // }
} // }
// 获取空闲的服务器列表 // 获取空闲的服务器列表
List<ServerInfo> notActiveServerList = ocrServerList.stream() List<ServerInfo> notActiveServerList = ocrServerList.stream()
...@@ -912,18 +960,6 @@ public class RetransmissionService { ...@@ -912,18 +960,6 @@ public class RetransmissionService {
return serverInfo; return serverInfo;
} }
private Map<String, Object> getHeaders(HttpServletRequest request) {
Map<String, Object> headerMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
headerMap.put(name, request.getHeader(name));
}
log.info("获取到的header:{}", headerMap);
return headerMap;
}
private void returnError(HttpServletResponse response, Integer code, String msg) { private void returnError(HttpServletResponse response, Integer code, String msg) {
response.setStatus(code); response.setStatus(code);
response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setContentType(MediaType.APPLICATION_JSON_VALUE);
......
...@@ -28,6 +28,7 @@ import java.util.ArrayList; ...@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -145,16 +146,22 @@ public class ServerInfoServiceImpl implements ServerInfoService { ...@@ -145,16 +146,22 @@ public class ServerInfoServiceImpl implements ServerInfoService {
@Override @Override
public List<ServerInfo> getCacheList() { public List<ServerInfo> getCacheList() {
// return serverInfoMapper.selectList(new ServerInfo(true));
Object object = redisService.getValue(RedisConstant.OCR_SERVER_LIST); Object object = redisService.getValue(RedisConstant.OCR_SERVER_LIST);
if (object == null) { if (ObjUtil.isNull(object)) {
List<ServerInfo> serverInfos = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class) List<ServerInfo> serverInfos = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(ServerInfo::getAccessService,true)); .eq(ServerInfo::getAccessService,true));
redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfos); redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfos, 60, TimeUnit.MINUTES);
return serverInfos; return serverInfos;
} else {
return JSONArray.parseArray(object.toString(), ServerInfo.class);
} }
List<ServerInfo> serverInfos = JSONArray.parseArray(object.toString(), ServerInfo.class);
if (CollUtil.isEmpty(serverInfos)) {
List<ServerInfo> serverInfoList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class)
.eq(ServerInfo::getAccessService,true));
redisService.set(RedisConstant.OCR_SERVER_LIST, serverInfoList, 60, TimeUnit.MINUTES);
return serverInfoList;
}
return serverInfos;
} }
@Override @Override
......
...@@ -35,23 +35,35 @@ spring: ...@@ -35,23 +35,35 @@ spring:
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
# redis:
# cluster:
# nodes:
# - 147.2.4.15:6379
# - 147.2.4.15:6380
# - 147.2.4.16:6379
# - 147.2.4.16:6380
# - 147.2.4.17:6379
# - 147.2.4.17:6380
# database: 0
# password: Docimax@123
# lettuce:
# pool:
# max-active: 1024
# max-wait: 60s
# max-idle: 64
# min-idle: 8
# timeout: 5000
redis: redis:
cluster: host: 147.2.4.5
nodes: port: 6379
- 147.2.4.15:6379
- 147.2.4.15:6380
- 147.2.4.16:6379
- 147.2.4.16:6380
- 147.2.4.17:6379
- 147.2.4.17:6380
database: 0 database: 0
password: Docimax@123 password: GXfy2023
lettuce: lettuce:
pool: pool:
max-active: 128 max-active: 1024
max-wait: 60s max-wait: 60s
max-idle: 64 max-idle: 64
min-idle: 0 min-idle: 8
timeout: 5000 timeout: 5000
eureka: eureka:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment