diff --git a/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/SnowflakeId.java b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/SnowflakeId.java new file mode 100644 index 0000000..59da9ee --- /dev/null +++ b/service-ai/service-ai-core/src/main/java/com/lanyuanxiaoyao/service/ai/core/configuration/SnowflakeId.java @@ -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(); + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/Group.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/Group.java index 9540aeb..3d41dd4 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/Group.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/Group.java @@ -8,7 +8,7 @@ import lombok.Data; */ @Data public class Group { - private String id; + private Long id; private String name; private String status; private Long createdTime; diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/EmbeddingContext.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/context/EmbeddingContext.java similarity index 93% rename from service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/EmbeddingContext.java rename to service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/context/EmbeddingContext.java index b85f588..f8d0d5e 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/EmbeddingContext.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/context/EmbeddingContext.java @@ -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.Map; diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/vo/KnowledgeVO.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/vo/KnowledgeVO.java index 699b0c0..a7d4bb2 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/vo/KnowledgeVO.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/vo/KnowledgeVO.java @@ -8,8 +8,8 @@ import lombok.Data; */ @Data public class KnowledgeVO { - private String id; - private String vectorSourceId; + private Long id; + private Long vectorSourceId; private String name; private String strategy; private Long size; diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/DataFileService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/DataFileService.java index 8856a2b..d19b88b 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/DataFileService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/DataFileService.java @@ -1,7 +1,7 @@ package com.lanyuanxiaoyao.service.ai.web.service; 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.common.Constants; import org.springframework.jdbc.core.JdbcTemplate; @@ -44,7 +44,7 @@ public class DataFileService { @Transactional(rollbackFor = Exception.class) public Long initialDataFile(String filename) { - long id = IdUtil.getSnowflakeNextId(); + long id = SnowflakeId.next(); template.update( SqlBuilder.insertInto(DATA_FILE_TABLE_NAME, "id", "filename") .values() diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/EmbeddingService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/EmbeddingService.java index 6cdd3fa..49588ff 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/EmbeddingService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/EmbeddingService.java @@ -4,8 +4,8 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.IdUtil; 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.context.EmbeddingContext; 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.KnowledgeBaseService; diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/GroupService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/GroupService.java index 444bd86..1c1c9cf 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/GroupService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/GroupService.java @@ -3,7 +3,7 @@ package com.lanyuanxiaoyao.service.ai.web.service.knowledge; import club.kingon.sql.builder.SqlBuilder; import club.kingon.sql.builder.entry.Alias; 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.common.Constants; 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"; private static final RowMapper groupMapper = (rs, row) -> { Group vo = new Group(); - vo.setId(String.valueOf(rs.getLong(1))); + vo.setId(rs.getLong(1)); vo.setName(rs.getString(2)); vo.setStatus(rs.getString(3)); vo.setCreatedTime(rs.getTimestamp(4).getTime()); @@ -57,7 +57,7 @@ public class GroupService { @Transactional(rollbackFor = Exception.class) public Long add(Long knowledgeId, String name) { - long id = IdUtil.getSnowflakeNextId(); + long id = SnowflakeId.next(); template.update( SqlBuilder.insertInto(GROUP_TABLE_NAME, "id", "knowledge_id", "name", "status") .values() diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/KnowledgeBaseService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/KnowledgeBaseService.java index 7a4f5be..30667bf 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/KnowledgeBaseService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/knowledge/KnowledgeBaseService.java @@ -1,9 +1,9 @@ package com.lanyuanxiaoyao.service.ai.web.service.knowledge; import club.kingon.sql.builder.SqlBuilder; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; 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.vo.KnowledgeVO; import com.lanyuanxiaoyao.service.common.Constants; @@ -79,8 +79,8 @@ public class KnowledgeBaseService { throw new RuntimeException("名称已存在"); } - long id = IdUtil.getSnowflakeNextId(); - long vectorSourceId = IdUtil.getSnowflakeNextId(); + long id = SnowflakeId.next(); + long vectorSourceId = SnowflakeId.next(); template.update( SqlBuilder.insertInto(KNOWLEDGE_TABLE_NAME, "id", "vector_source_id", "name", "strategy") .values() @@ -124,8 +124,8 @@ public class KnowledgeBaseService { try { Collections.CollectionInfo info = client.getCollectionInfoAsync(String.valueOf(knowledge.getVectorSourceId())).get(); KnowledgeVO vo = new KnowledgeVO(); - vo.setId(String.valueOf(knowledge.getId())); - vo.setVectorSourceId(String.valueOf(knowledge.getVectorSourceId())); + vo.setId(knowledge.getId()); + vo.setVectorSourceId(knowledge.getVectorSourceId()); vo.setName(knowledge.getName()); vo.setPoints(info.getPointsCount()); vo.setSegments(info.getSegmentsCount()); diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/node/EmbeddingNodes.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/node/EmbeddingNodes.java index 8c02fd0..9842180 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/node/EmbeddingNodes.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/node/EmbeddingNodes.java @@ -4,7 +4,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; 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.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent;