refactor(ai-web): 优化id的生成

This commit is contained in:
2025-06-15 22:19:05 +08:00
parent b9d707dc8f
commit e2d69bc6e8
9 changed files with 90 additions and 16 deletions

View File

@@ -0,0 +1,74 @@
package com.lanyuanxiaoyao.service.ai.core.configuration;
import java.time.Instant;
/**
* 使用雪花算法作为ID生成器
*
* @author lanyuanxiaoyao
* @date 2024-11-14
*/
public class SnowflakeId {
/**
* 起始的时间戳
*/
private final static long START_TIMESTAMP = 1;
/**
* 序列号占用的位数
*/
private final static long SEQUENCE_BIT = 11;
/**
* 序列号最大值
*/
private final static long MAX_SEQUENCE_BIT = ~(-1 << SEQUENCE_BIT);
/**
* 时间戳值向左位移
*/
private final static long TIMESTAMP_OFFSET = SEQUENCE_BIT;
/**
* 序列号
*/
private static long sequence = 0;
/**
* 上一次时间戳
*/
private static long lastTimestamp = -1;
public static synchronized long next() {
long currentTimestamp = nowTimestamp();
if (currentTimestamp < lastTimestamp) {
throw new RuntimeException("Clock have moved backwards.");
}
if (currentTimestamp == lastTimestamp) {
// 相同毫秒内, 序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE_BIT;
// 同一毫秒的序列数已经达到最大
if (sequence == 0) {
currentTimestamp = nextTimestamp();
}
} else {
// 不同毫秒内, 序列号置为0
sequence = 0;
}
lastTimestamp = currentTimestamp;
return (currentTimestamp - START_TIMESTAMP) << TIMESTAMP_OFFSET | sequence;
}
private static long nextTimestamp() {
long milli = nowTimestamp();
while (milli <= lastTimestamp) {
milli = nowTimestamp();
}
return milli;
}
private static long nowTimestamp() {
return Instant.now().toEpochMilli();
}
}

View File

@@ -8,7 +8,7 @@ import lombok.Data;
*/ */
@Data @Data
public class Group { public class Group {
private String id; private Long id;
private String name; private String name;
private String status; private String status;
private Long createdTime; private Long createdTime;

View File

@@ -1,4 +1,4 @@
package com.lanyuanxiaoyao.service.ai.web.entity; package com.lanyuanxiaoyao.service.ai.web.entity.context;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -8,8 +8,8 @@ import lombok.Data;
*/ */
@Data @Data
public class KnowledgeVO { public class KnowledgeVO {
private String id; private Long id;
private String vectorSourceId; private Long vectorSourceId;
private String name; private String name;
private String strategy; private String strategy;
private Long size; private Long size;

View File

@@ -1,7 +1,7 @@
package com.lanyuanxiaoyao.service.ai.web.service; package com.lanyuanxiaoyao.service.ai.web.service;
import club.kingon.sql.builder.SqlBuilder; import club.kingon.sql.builder.SqlBuilder;
import cn.hutool.core.util.IdUtil; import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO; import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
import com.lanyuanxiaoyao.service.common.Constants; import com.lanyuanxiaoyao.service.common.Constants;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
@@ -44,7 +44,7 @@ public class DataFileService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long initialDataFile(String filename) { public Long initialDataFile(String filename) {
long id = IdUtil.getSnowflakeNextId(); long id = SnowflakeId.next();
template.update( template.update(
SqlBuilder.insertInto(DATA_FILE_TABLE_NAME, "id", "filename") SqlBuilder.insertInto(DATA_FILE_TABLE_NAME, "id", "filename")
.values() .values()

View File

@@ -4,8 +4,8 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Pair; import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.service.ai.web.entity.EmbeddingContext;
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge; import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
import com.lanyuanxiaoyao.service.ai.web.entity.context.EmbeddingContext;
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO; import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.GroupService; import com.lanyuanxiaoyao.service.ai.web.service.knowledge.GroupService;
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.KnowledgeBaseService; import com.lanyuanxiaoyao.service.ai.web.service.knowledge.KnowledgeBaseService;

View File

@@ -3,7 +3,7 @@ package com.lanyuanxiaoyao.service.ai.web.service.knowledge;
import club.kingon.sql.builder.SqlBuilder; import club.kingon.sql.builder.SqlBuilder;
import club.kingon.sql.builder.entry.Alias; import club.kingon.sql.builder.entry.Alias;
import club.kingon.sql.builder.entry.Column; import club.kingon.sql.builder.entry.Column;
import cn.hutool.core.util.IdUtil; import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
import com.lanyuanxiaoyao.service.ai.web.entity.Group; import com.lanyuanxiaoyao.service.ai.web.entity.Group;
import com.lanyuanxiaoyao.service.common.Constants; import com.lanyuanxiaoyao.service.common.Constants;
import io.qdrant.client.ConditionFactory; import io.qdrant.client.ConditionFactory;
@@ -28,7 +28,7 @@ public class GroupService {
public static final String GROUP_TABLE_NAME = Constants.DATABASE_NAME + ".service_ai_group"; public static final String GROUP_TABLE_NAME = Constants.DATABASE_NAME + ".service_ai_group";
private static final RowMapper<Group> groupMapper = (rs, row) -> { private static final RowMapper<Group> groupMapper = (rs, row) -> {
Group vo = new Group(); Group vo = new Group();
vo.setId(String.valueOf(rs.getLong(1))); vo.setId(rs.getLong(1));
vo.setName(rs.getString(2)); vo.setName(rs.getString(2));
vo.setStatus(rs.getString(3)); vo.setStatus(rs.getString(3));
vo.setCreatedTime(rs.getTimestamp(4).getTime()); vo.setCreatedTime(rs.getTimestamp(4).getTime());
@@ -57,7 +57,7 @@ public class GroupService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long add(Long knowledgeId, String name) { public Long add(Long knowledgeId, String name) {
long id = IdUtil.getSnowflakeNextId(); long id = SnowflakeId.next();
template.update( template.update(
SqlBuilder.insertInto(GROUP_TABLE_NAME, "id", "knowledge_id", "name", "status") SqlBuilder.insertInto(GROUP_TABLE_NAME, "id", "knowledge_id", "name", "status")
.values() .values()

View File

@@ -1,9 +1,9 @@
package com.lanyuanxiaoyao.service.ai.web.service.knowledge; package com.lanyuanxiaoyao.service.ai.web.service.knowledge;
import club.kingon.sql.builder.SqlBuilder; import club.kingon.sql.builder.SqlBuilder;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge; import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
import com.lanyuanxiaoyao.service.ai.web.entity.vo.KnowledgeVO; import com.lanyuanxiaoyao.service.ai.web.entity.vo.KnowledgeVO;
import com.lanyuanxiaoyao.service.common.Constants; import com.lanyuanxiaoyao.service.common.Constants;
@@ -79,8 +79,8 @@ public class KnowledgeBaseService {
throw new RuntimeException("名称已存在"); throw new RuntimeException("名称已存在");
} }
long id = IdUtil.getSnowflakeNextId(); long id = SnowflakeId.next();
long vectorSourceId = IdUtil.getSnowflakeNextId(); long vectorSourceId = SnowflakeId.next();
template.update( template.update(
SqlBuilder.insertInto(KNOWLEDGE_TABLE_NAME, "id", "vector_source_id", "name", "strategy") SqlBuilder.insertInto(KNOWLEDGE_TABLE_NAME, "id", "vector_source_id", "name", "strategy")
.values() .values()
@@ -124,8 +124,8 @@ public class KnowledgeBaseService {
try { try {
Collections.CollectionInfo info = client.getCollectionInfoAsync(String.valueOf(knowledge.getVectorSourceId())).get(); Collections.CollectionInfo info = client.getCollectionInfoAsync(String.valueOf(knowledge.getVectorSourceId())).get();
KnowledgeVO vo = new KnowledgeVO(); KnowledgeVO vo = new KnowledgeVO();
vo.setId(String.valueOf(knowledge.getId())); vo.setId(knowledge.getId());
vo.setVectorSourceId(String.valueOf(knowledge.getVectorSourceId())); vo.setVectorSourceId(knowledge.getVectorSourceId());
vo.setName(knowledge.getName()); vo.setName(knowledge.getName());
vo.setPoints(info.getPointsCount()); vo.setPoints(info.getPointsCount());
vo.setSegments(info.getSegmentsCount()); vo.setSegments(info.getSegmentsCount());

View File

@@ -4,7 +4,7 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.service.ai.web.entity.EmbeddingContext; import com.lanyuanxiaoyao.service.ai.web.entity.context.EmbeddingContext;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.annotation.LiteflowMethod;
import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.NodeComponent;