Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
ocrCloudPlatForm
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ocr-cloud-platform
ocrCloudPlatForm
Commits
07a216ad
Commit
07a216ad
authored
Feb 05, 2024
by
黄明步
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加服务器节点识别过慢移除策略
parent
d4daf21b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
99 additions
and
38 deletions
+99
-38
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/RedisService.java
+6
-0
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/RetransmissionService.java
+58
-22
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/ServerInfoServiceImpl.java
+12
-5
src/main/resources/application-147prod.yml
+23
-11
No files found.
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/RedisService.java
View file @
07a216ad
...
...
@@ -216,5 +216,11 @@ public class RedisService {
redisTemplate
.
expire
(
key
,
30
,
TimeUnit
.
SECONDS
);
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
;
}
}
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/RetransmissionService.java
View file @
07a216ad
...
...
@@ -113,6 +113,41 @@ public class RetransmissionService {
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
()
{
List
<
Object
>
result
=
redisService
.
getList
(
"clientOcrTask"
);
List
<
JSONObject
>
jsonList
=
JSONArray
.
parseArray
(
result
.
toString
(),
JSONObject
.
class
);
...
...
@@ -215,6 +250,8 @@ public class RetransmissionService {
}
}
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -249,6 +286,7 @@ public class RetransmissionService {
/**
* 根据文件大小计算超时时间
*
* @param fileSizeBytes 文件大小,单位:字节
* @return
*/
...
...
@@ -318,6 +356,8 @@ public class RetransmissionService {
}
}
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -483,6 +523,8 @@ public class RetransmissionService {
}
}
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -554,6 +596,8 @@ public class RetransmissionService {
}
}
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -603,6 +647,8 @@ public class RetransmissionService {
// 设置结束时间
long
endTime
=
System
.
currentTimeMillis
();
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -694,6 +740,8 @@ public class RetransmissionService {
// 设置结束时间
long
endTime
=
System
.
currentTimeMillis
();
removeServerFromCache
(
startTime
,
endTime
,
ocrServerAddress
.
getIp
());
if
(
StringUtils
.
isEmpty
(
res
))
{
this
.
setRequestToRedis
(
2
,
startTime
,
endTime
,
null
,
ocrServerAddress
,
request
);
return
new
OcrResult
(
"007500"
,
"识别失败,请重试"
,
null
,
DateUtil
.
date
());
...
...
@@ -869,16 +917,16 @@ public class RetransmissionService {
// 获取缓存的服务器地址列表
List
<
ServerInfo
>
ocrServerList
=
serverInfoService
.
getCacheList
();
if
(
CollUtil
.
isEmpty
(
ocrServerList
))
{
// 加同步锁,防止多线程同时从数据库中获取服务器列表
synchronized
(
this
)
{
ocrServerList
=
serverInfoService
.
getCacheList
();
if
(
CollUtil
.
isEmpty
(
ocrServerList
))
{
ocrServerList
=
serverInfoMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
ServerInfo
.
class
).
eq
(
ServerInfo:
:
getAccessService
,
true
));
redisService
.
set
(
RedisConstant
.
OCR_SERVER_LIST
,
ocrServerList
,
60
,
TimeUnit
.
MINUTES
);
}
}
}
//
if (CollUtil.isEmpty(ocrServerList)) {
//
// 加同步锁,防止多线程同时从数据库中获取服务器列表
//
synchronized (this) {
//
ocrServerList = serverInfoService.getCacheList();
//
if (CollUtil.isEmpty(ocrServerList)) {
//
ocrServerList = serverInfoMapper.selectList(Wrappers.lambdaQuery(ServerInfo.class).eq(ServerInfo::getAccessService, true));
//
redisService.set(RedisConstant.OCR_SERVER_LIST, ocrServerList, 60, TimeUnit.MINUTES);
//
}
//
}
//
}
// 获取空闲的服务器列表
List
<
ServerInfo
>
notActiveServerList
=
ocrServerList
.
stream
()
...
...
@@ -912,18 +960,6 @@ public class RetransmissionService {
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
)
{
response
.
setStatus
(
code
);
response
.
setContentType
(
MediaType
.
APPLICATION_JSON_VALUE
);
...
...
src/main/java/com/gxmailu/ocrCloudPlatform/service/impl/ServerInfoServiceImpl.java
View file @
07a216ad
...
...
@@ -28,6 +28,7 @@ import java.util.ArrayList;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
@Slf4j
...
...
@@ -145,16 +146,22 @@ public class ServerInfoServiceImpl implements ServerInfoService {
@Override
public
List
<
ServerInfo
>
getCacheList
()
{
// return serverInfoMapper.selectList(new ServerInfo(true));
Object
object
=
redisService
.
getValue
(
RedisConstant
.
OCR_SERVER_LIST
);
if
(
object
==
null
)
{
if
(
ObjUtil
.
isNull
(
object
)
)
{
List
<
ServerInfo
>
serverInfos
=
serverInfoMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
ServerInfo
.
class
)
.
eq
(
ServerInfo:
:
getAccessService
,
true
));
redisService
.
set
(
RedisConstant
.
OCR_SERVER_LIST
,
serverInfos
);
redisService
.
set
(
RedisConstant
.
OCR_SERVER_LIST
,
serverInfos
,
60
,
TimeUnit
.
MINUTES
);
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
...
...
src/main/resources/application-147prod.yml
View file @
07a216ad
...
...
@@ -35,23 +35,35 @@ spring:
wall
:
config
:
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
:
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
host
:
147.2.4.5
port
:
6379
database
:
0
password
:
Docimax@1
23
password
:
GXfy20
23
lettuce
:
pool
:
max-active
:
1
28
max-active
:
1
024
max-wait
:
60s
max-idle
:
64
min-idle
:
0
min-idle
:
8
timeout
:
5000
eureka
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment