diff --git a/src/main/java/com/ycwl/basic/facebody/adapter/AliFaceBodyAdapter.java b/src/main/java/com/ycwl/basic/facebody/adapter/AliFaceBodyAdapter.java index 1062eaa..566a73c 100644 --- a/src/main/java/com/ycwl/basic/facebody/adapter/AliFaceBodyAdapter.java +++ b/src/main/java/com/ycwl/basic/facebody/adapter/AliFaceBodyAdapter.java @@ -38,6 +38,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter { private static final Map addFaceLimiters = new ConcurrentHashMap<>(); private static final Map addDbLimiters = new ConcurrentHashMap<>(); private static final Map listDbLimiters = new ConcurrentHashMap<>(); + private static final Map listFaceLimiters = new ConcurrentHashMap<>(); private static final Map searchFaceLimiters = new ConcurrentHashMap<>(); private static final Map deleteDbLimiters = new ConcurrentHashMap<>(); private static final Map deleteEntityLimiters = new ConcurrentHashMap<>(); @@ -62,40 +63,21 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter { private IRateLimiter getLimiter(LOCK_TYPE type) { switch (type) { case ADD_DB: - if (addDbLimiters.get(config.getAccessKeyId()) == null) { - addDbLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); - } - return addDbLimiters.get(config.getAccessKeyId()); + return addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); case ADD_ENTITY: - if (addEntityLimiters.get(config.getAccessKeyId()) == null) { - addEntityLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); - } - return addEntityLimiters.get(config.getAccessKeyId()); + return addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); case ADD_FACE: - if (addFaceLimiters.get(config.getAccessKeyId()) == null) { - addFaceLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); - } - return addFaceLimiters.get(config.getAccessKeyId()); + return addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); case LIST_DB: - if (listDbLimiters.get(config.getAccessKeyId()) == null) { - listDbLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(500, TimeUnit.MILLISECONDS)); - } - return listDbLimiters.get(config.getAccessKeyId()); + return listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS)); + case LIST_FACE: + return listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2)); case SEARCH_FACE: - if (searchFaceLimiters.get(config.getAccessKeyId()) == null) { - searchFaceLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(200, TimeUnit.MILLISECONDS)); - } - return searchFaceLimiters.get(config.getAccessKeyId()); + return searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS)); case DELETE_DB: - if (deleteDbLimiters.get(config.getAccessKeyId()) == null) { - deleteDbLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); - } - return deleteDbLimiters.get(config.getAccessKeyId()); + return deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); case DELETE_ENTITY: - if (deleteEntityLimiters.get(config.getAccessKeyId()) == null) { - deleteEntityLimiters.put(config.getAccessKeyId(), new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); - } - return deleteEntityLimiters.get(config.getAccessKeyId()); + return deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); default: return new FixedRateLimiter(600, TimeUnit.MILLISECONDS); } @@ -240,6 +222,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter { @Override public List listFace(String dbName, String prefix, Integer offset, Integer size) { + IRateLimiter listFaceLimiter = getLimiter(LOCK_TYPE.LIST_FACE); ListFaceEntitiesRequest listFaceEntitiesRequest = new ListFaceEntitiesRequest(); listFaceEntitiesRequest.setDbName(dbName); listFaceEntitiesRequest.setOrder("asc"); @@ -256,6 +239,10 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter { } try (ClientWrapper clientWrapper = getClient()) { IAcsClient client = clientWrapper.getClient(); + try { + listFaceLimiter.acquire(); + } catch (InterruptedException ignored) { + } try { ListFaceEntitiesResponse response = client.getAcsResponse(listFaceEntitiesRequest); return response.getData().getEntities().stream().map(ListFaceEntitiesResponse.Data.Entity::getEntityId).collect(Collectors.toList()); @@ -337,6 +324,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter { ADD_ENTITY, ADD_FACE, LIST_DB, + LIST_FACE, SEARCH_FACE, DELETE_DB, DELETE_ENTITY, diff --git a/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java b/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java index 57a5cf9..2341f13 100644 --- a/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java +++ b/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java @@ -320,45 +320,21 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter { private IRateLimiter getLimiter(LOCK_TYPE type) { switch (type) { case ADD_DB: - if (addDbLimiters.get(config.getAppId()) == null) { - addDbLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return addDbLimiters.get(config.getAppId()); + return addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); case ADD_FACE: - if (addFaceLimiters.get(config.getAppId()) == null) { - addFaceLimiters.put(config.getAppId(), new FixedRateLimiter(config.getAddQps())); - } - return addFaceLimiters.get(config.getAppId()); + return addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps())); case LIST_DB: - if (listDbLimiters.get(config.getAppId()) == null) { - listDbLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return listDbLimiters.get(config.getAppId()); + return listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); case LIST_FACE: - if (listFaceLimiters.get(config.getAppId()) == null) { - listFaceLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return listFaceLimiters.get(config.getAppId()); + return listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); case SEARCH_FACE: - if (searchFaceLimiters.get(config.getAppId()) == null) { - searchFaceLimiters.put(config.getAppId(), new FixedRateLimiter(config.getSearchQps())); - } - return searchFaceLimiters.get(config.getAppId()); + return searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps())); case DELETE_DB: - if (deleteDbLimiters.get(config.getAppId()) == null) { - deleteDbLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return deleteDbLimiters.get(config.getAppId()); + return deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); case DELETE_ENTITY: - if (deleteEntityLimiters.get(config.getAppId()) == null) { - deleteEntityLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return deleteEntityLimiters.get(config.getAppId()); + return deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); case DELETE_FACE: - if (deleteFaceLimiters.get(config.getAppId()) == null) { - deleteFaceLimiters.put(config.getAppId(), new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); - } - return deleteFaceLimiters.get(config.getAppId()); + return deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); default: return new FixedRateLimiter(500, TimeUnit.MILLISECONDS); }