需求背景

背景:业务需要对接中台的功能,实现根据excel文件 + 当前工程信息,得出该excel文件的相关特点,以供后续分析。

特点:高并发,中台并发量有限,需要业务端控制。

解决方案

采用异步编排+消息队列+轮询

异步编排

执行的功能主要分成三个步骤:

  1. 解析excel文件,调用中台智能分析接口
  2. 进一步处理解析后的文件以及当前工程文件,处理成业务需要的形式
  3. 根据上述两步的结果,拼接返回新的结果给前端。

特点:步骤1,步骤2执行时不会相互影响,并且步骤3的结果依赖1, 2。

所以使用CompletableFuture异步编排,分别分配线程运行1 2。然后1 2 都运行完以后运行3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
代码示例:

// 任务一
CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务1开始: " + Thread.currentThread().getId());
int count = 10 / 4;
System.out.println("任务1运行结果: ");
return count;
}, executor);

// 任务二
CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务2开始: " + Thread.currentThread().getId());
System.out.println("任务2执行结果: ");
return "Hello";
}, executor);

/*future01.runAfterBothAsync(future02,()->{
System.out.println("任务3开始");
},executor);*/ //不能获取前两者的返回值,不能更改返回值

/* future01.thenAcceptBothAsync(future02,(f1,f2)->{
//void accept(T t, U u);
System.out.println("任务3开始...之前的结果:"+f1 +"--->"+f2);
},executor);*/ //可以获取前两者的返回指,不能更改返回指

/*CompletableFuture<String> future = future01.thenCombineAsync(future02, (f1, f2) -> {
//R apply(T t, U u);
return f1 + ": " + f2 + "->HaHa";
}, executor);*/ //可以获取前两者的返回指,可以更改返回指
System.out.println("结束........."+future.get());

消息队列 + 轮询

针对高并发场景,多个用户同一时间点击其功能,缓解中台的压力并且保证用户执行以后不会无效。

因为服务是集群的,所以如果用线程池,每个线程池只控制该服务器。比如线程池最大线程数10,如果集群机器数是10,发送给中台的请求可能到10*10=100条。

消息队列:保证用户请求(消息)都能到中台,中台把解析结果存放在redis中,这边轮询查找。

补充

AI相关概念:

prompt:给AI的提示

Token:模型用来表示自然语言文本的基本单位,可以直观的理解为“字”或“词”;通常一个中文词语、一个英文单词、一个标点符号位一个Token。(任何大模型都有单次提问token的限制,所以题目和选项数不能太多,太多的话需要分批生成不过该项目不涉及到这个问题,不是大模型问答