Browse Source

chore: rateLimitRequestHandler

master
wangxiang 2 years ago
parent
commit
f8a3d416ef
No known key found for this signature in database
GPG Key ID: 1BA7946AB6B232E4
  1. 8
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java
  2. 3
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java
  3. 4
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/IImContentService.java
  4. 29
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java

8
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java

@ -43,9 +43,13 @@ public class OpenAiConfigProperties { @@ -43,9 +43,13 @@ public class OpenAiConfigProperties {
private Double speed = 1.0;
/** Limit Duration time unit seconds default 1 day */
private int rateLimitDuration = 24 * 60 * 60;
//private int duration = 24 * 60 * 60;
private int duration = 60;
/** Maximum number of visits in a specified time unit seconds */
private int rateLimitMaxCount = 10;
private int nonMaxCount = 1;
/** Maximum number of visits in a specified time unit seconds */
private int basicMaxCount = 50;
}

3
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/ChatGptController.java

@ -48,6 +48,7 @@ public class ChatGptController { @@ -48,6 +48,7 @@ public class ChatGptController {
@PostMapping("/chat/completions")
public R chatCompletions(@Valid @RequestBody ImContent imContent) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.chatCompletions(imContent));
}
@ -56,6 +57,7 @@ public class ChatGptController { @@ -56,6 +57,7 @@ public class ChatGptController {
@PostMapping("/audio/transcriptions")
public R audioTranscriptions(@Valid @ModelAttribute ImContent imContent, @RequestPart(value = "file", required = false) MultipartFile file) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.audioTranscriptions(imContent, file));
}
@ -64,6 +66,7 @@ public class ChatGptController { @@ -64,6 +66,7 @@ public class ChatGptController {
@PostMapping("/audio/speech")
public R audioSpeech(@Valid @RequestBody ImContent imContent) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.audioSpeech(imContent));
}

4
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/IImContentService.java

@ -47,4 +47,8 @@ public interface IImContentService extends IService<ImContent> { @@ -47,4 +47,8 @@ public interface IImContentService extends IService<ImContent> {
*/
OssFile audioSpeech(ImContent imContent);
/** 速率限制请求处理, 流量过大可用 sentinel 配置流控管理 */
void rateLimitRequestHandler();
}

29
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java

@ -8,9 +8,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -8,9 +8,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.common.core.exception.CheckedException;
import com.cloud.kicc.common.data.entity.KiccUser;
import com.cloud.kicc.common.security.util.SecurityUtils;
import com.cloud.kicc.system.api.entity.ImContent;
import com.cloud.kicc.system.api.entity.OssFile;
import com.cloud.kicc.system.api.enums.SubscriberEnum;
import com.cloud.kicc.system.config.OpenAiConfigProperties;
import com.cloud.kicc.system.mapper.ImContentMapper;
import com.cloud.kicc.system.service.FileService;
@ -219,32 +221,23 @@ public class ImContentServiceImpl extends ServiceImpl<ImContentMapper, ImContent @@ -219,32 +221,23 @@ public class ImContentServiceImpl extends ServiceImpl<ImContentMapper, ImContent
return receiveOssOssFile;
}
/** 速率限制请求处理 */
private void RateLimitRequestHandler() {
public void rateLimitRequestHandler() {
ZoneId chinaZoneId = ZoneId.of("Asia/Shanghai");
LocalDateTime startTime = LocalDateTime.now().minusSeconds(openAiConfigProperties.getRateLimitDuration());
LocalDateTime startTime = LocalDateTime.now().minusSeconds(openAiConfigProperties.getDuration());
long startTimestamp = startTime.atZone(chinaZoneId).toEpochSecond();
// 查询当前用户在指定范围内的发送消息
long maxCount = super.count(Wrappers.<ImContent>lambdaQuery()
.eq(ImContent::getSendUserId, SecurityUtils.getCasUser().getId())
.between(ImContent::getSendTime, startTimestamp, LocalDateTime.now().atZone(chinaZoneId)));
.between(ImContent::getSendTime, startTimestamp, LocalDateTime.now().atZone(chinaZoneId).toEpochSecond()));
// 检查是否大于发送次数
// NON("0", "非订阅"),
//
// BASIC("1", "基础订阅"),
// 限制当前非订阅用户只能用10次
// 限制当前基础订阅用户只能用10次
// 高级订阅不受限制
if (StrUtil.equals(SecurityUtils.<KiccUser>getUser().getSubscriber(), SubscriberEnum.NON.getValue()) && maxCount > openAiConfigProperties.getNonMaxCount()) {
throw new CheckedException("普通订阅用户已超出当前最大速率限制,请过一会在试试!");
}
if (StrUtil.equals(SecurityUtils.<KiccUser>getUser().getSubscriber(), SubscriberEnum.BASIC.getValue()) && maxCount > openAiConfigProperties.getBasicMaxCount()) {
throw new CheckedException("基础订阅用户已超出当前最大速率限制,请过一会在试试!");
}
}
}

Loading…
Cancel
Save