API接口调用超时问题
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 6.8k
- 派生
- 882
- 平均合并
- 4 小时 37 分钟
- 30 天内合并 PR
- 32
描述
版本:1.10.0 社区版,通过docker运行
问题描述:
SQLBot小助手高级应用设置中,我在获取高级应用 API 接口 的服务里,回调SQLBot的OpenAPI接口(/api/v1/datasource/get/{id} /api/v1/datasource/tableList/{id} /api/v1/datasource/fieldList/{id})获取数据源信息并拼接返回结果,会报读超时错误。
以下为请求路径图:
以下为界面效果图:
以下为java服务接口代码块
@RestController
@RequestMapping("/ai/faq")
@Slf4j
public class AIFAQController {
@Autowired
private SQLBotService sqlBotService;
/**
* @see "https://sqlbot.org/docs/v1/embedding_integration/#24-api"
*/
@GetMapping(value = "/sqlbot/datasource")
public ResponseEntity<RespEntity<JSONArray>> sqlbotDatasource( @RequestParam Map<String, Object> params ) {
return R.data( getExample() );
}
public JSONArray getExample() {
JSONObject requestBody = new JSONObject();
requestBody.put( "fieldName", "" );
JSONObject sqlbotDs = sqlBotService.post( "/api/v1/datasource/get/1", JSONObject.class );
JSONArray dataArray = new JSONArray();
// 数据源对象
JSONObject dataSource = new JSONObject();
// 数据库IP | 类型:string
dataSource.put( "name", sqlbotDs.getString( "name" ) );
// 数据库种类 | 类型:string
dataSource.put( "type", sqlbotDs.getString( "type" ) );
// 数据库IP | 类型:string
dataSource.put( "host", "127.0.0.1" );
// 数据库开放的端口 | 类型:integer(int32)
dataSource.put( "port", 3306 );
// 数据库用户名 | 类型:string
dataSource.put( "user", "root" );
// 数据库密码 | 类型:string
dataSource.put( "password", "root" );
// 数据库内的库名 | 类型:string
dataSource.put( "dataBase", "saa_data_agent_product" );
// 数据库模式,部分数据库会有 | 类型:string
dataSource.put( "schema", "schema" );
// 针对数据源的描述,可在数据源处查看编辑,详细的描述可以帮助 SQLBot 生成答案 | 类型:string
dataSource.put( "comment", sqlbotDs.getString( "description" ) );
JSONArray sqlbotTables = sqlBotService.post( "/api/v1/datasource/tableList/1", JSONArray.class );
// tables数组
JSONArray tablesArray = new JSONArray();
for ( int i = 0; i < sqlbotTables.size(); i++ ) {
JSONObject sqlbotTable = sqlbotTables.getJSONObject( i );
if ( sqlbotTable.getBoolean( "checked" ) ) {
JSONObject table = new JSONObject();
// 构建数据集的数据表名称 | 类型:string
table.put( "name", sqlbotTable.getString( "table_name" ) );
// 数据集的名字,详细的以及和问题相关的描述也能够帮助 SQLBot 生成答案 | 类型:string
table.put( "comment", sqlbotTable.getString( "custom_comment" ) );
// DataEase 无具体赋值 在 SQLBot 中该该字段会传值给 AiModelQuestion类,帮助 AI 以字段内容规定回答格式 | 类型:string
table.put( "rule", "" );
JSONArray sqlbotFields = sqlBotService.post( "/api/v1/datasource/fieldList/" + sqlbotTable.getString( "id" ),
JSONArray.class, requestBody );
JSONArray fields = new JSONArray();
for ( int j = 0; j < sqlbotFields.size(); j++ ) {
JSONObject sqlbotField = sqlbotFields.getJSONObject( j );
if ( sqlbotField.getBoolean( "checked" ) ) {
JSONObject field = new JSONObject();
// 字段名 | 类型:string
field.put( "name", sqlbotField.getString( "field_name" ) );
// 字段的数据类型 | 类型:string
field.put( "type", sqlbotField.getString( "field_type" ) );
// 字段描述 | 类型:string
field.put( "comment", sqlbotField.getString( "custom_comment" ) );
fields.add( field );
}
}
table.put( "fields", fields );
tablesArray.add( table );
}
}
dataSource.put( "tables", tablesArray );
dataArray.add( dataSource );
return dataArray;
}
}
以下是我个人初步原因分析:
1、sqlbot接口/api/v1/system/assistant/ds调用我的服务接口,而我的服务接口又调用SQLBot的数据源接口,由读超时判断SQLBot的API接口是单线程同步阻塞的,因为/api/v1/system/assistant/ds接口未执行完,导致我的接口服务调用SQLBot的接口就一直卡着
2、此问题是BUG还是因为社区版本的限制?
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 Java AIFAQController 示例开始,跟踪经过 /api/v1/system/assistant/ds 以及数据源端点 /api/v1/datasource/get/{id}、tableList/{id} 和 fieldList/{id} 的调用链。在 Docker 中运行的 SQLBot 1.10.0 Community 上复现超时,然后确定该行为是缺陷还是文档中说明的 Community Edition 限制;在确定原因和受支持的行为后,该 issue 即告完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java, javascript, openapi
- 领域
- api, backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 活跃
- 描述清晰度
- 需要澄清
- 新手友好度
- 35/100