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 {
private Double speed = 1.0; private Double speed = 1.0;
/** Limit Duration time unit seconds default 1 day */ /** 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 */ /** 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 {
@PostMapping("/chat/completions") @PostMapping("/chat/completions")
public R chatCompletions(@Valid @RequestBody ImContent imContent) { public R chatCompletions(@Valid @RequestBody ImContent imContent) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId()); SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.chatCompletions(imContent)); return R.ok(iImContentService.chatCompletions(imContent));
} }
@ -56,6 +57,7 @@ public class ChatGptController {
@PostMapping("/audio/transcriptions") @PostMapping("/audio/transcriptions")
public R audioTranscriptions(@Valid @ModelAttribute ImContent imContent, @RequestPart(value = "file", required = false) MultipartFile file) { public R audioTranscriptions(@Valid @ModelAttribute ImContent imContent, @RequestPart(value = "file", required = false) MultipartFile file) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId()); SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.audioTranscriptions(imContent, file)); return R.ok(iImContentService.audioTranscriptions(imContent, file));
} }
@ -64,6 +66,7 @@ public class ChatGptController {
@PostMapping("/audio/speech") @PostMapping("/audio/speech")
public R audioSpeech(@Valid @RequestBody ImContent imContent) { public R audioSpeech(@Valid @RequestBody ImContent imContent) {
SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId()); SecurityUtils.openInterfaceTemporaryLoginSession(imContent.getSendUserId());
iImContentService.rateLimitRequestHandler();
return R.ok(iImContentService.audioSpeech(imContent)); 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> {
*/ */
OssFile audioSpeech(ImContent 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;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.common.core.exception.CheckedException; 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.common.security.util.SecurityUtils;
import com.cloud.kicc.system.api.entity.ImContent; import com.cloud.kicc.system.api.entity.ImContent;
import com.cloud.kicc.system.api.entity.OssFile; 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.config.OpenAiConfigProperties;
import com.cloud.kicc.system.mapper.ImContentMapper; import com.cloud.kicc.system.mapper.ImContentMapper;
import com.cloud.kicc.system.service.FileService; import com.cloud.kicc.system.service.FileService;
@ -219,32 +221,23 @@ public class ImContentServiceImpl extends ServiceImpl<ImContentMapper, ImContent
return receiveOssOssFile; return receiveOssOssFile;
} }
/** 速率限制请求处理 */ public void rateLimitRequestHandler() {
private void RateLimitRequestHandler() {
ZoneId chinaZoneId = ZoneId.of("Asia/Shanghai"); 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 startTimestamp = startTime.atZone(chinaZoneId).toEpochSecond();
// 查询当前用户在指定范围内的发送消息 // 查询当前用户在指定范围内的发送消息
long maxCount = super.count(Wrappers.<ImContent>lambdaQuery() long maxCount = super.count(Wrappers.<ImContent>lambdaQuery()
.eq(ImContent::getSendUserId, SecurityUtils.getCasUser().getId()) .eq(ImContent::getSendUserId, SecurityUtils.getCasUser().getId())
.between(ImContent::getSendTime, startTimestamp, LocalDateTime.now().atZone(chinaZoneId))); .between(ImContent::getSendTime, startTimestamp, LocalDateTime.now().atZone(chinaZoneId).toEpochSecond()));
// 检查是否大于发送次数 // 检查是否大于发送次数
if (StrUtil.equals(SecurityUtils.<KiccUser>getUser().getSubscriber(), SubscriberEnum.NON.getValue()) && maxCount > openAiConfigProperties.getNonMaxCount()) {
throw new CheckedException("普通订阅用户已超出当前最大速率限制,请过一会在试试!");
// NON("0", "非订阅"), }
// if (StrUtil.equals(SecurityUtils.<KiccUser>getUser().getSubscriber(), SubscriberEnum.BASIC.getValue()) && maxCount > openAiConfigProperties.getBasicMaxCount()) {
// BASIC("1", "基础订阅"), throw new CheckedException("基础订阅用户已超出当前最大速率限制,请过一会在试试!");
}
// 限制当前非订阅用户只能用10次
// 限制当前基础订阅用户只能用10次
// 高级订阅不受限制
} }
} }

Loading…
Cancel
Save