dataease / dataease/SQLBot

API接口调用超时问题

Đang mở
#1,288 5 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Done feature
Ngôn ngữ chính
JavaScript
Star
6.8k
Fork
882
Merge trung bình
4 giờ 37 phút
Pull request đã merge (30 ngày)
32

Mô tả

版本:1.10.0 社区版,通过docker运行

问题描述:
SQLBot小助手高级应用设置中,我在获取高级应用 API 接口 的服务里,回调SQLBot的OpenAPI接口(/api/v1/datasource/get/{id} /api/v1/datasource/tableList/{id} /api/v1/datasource/fieldList/{id})获取数据源信息并拼接返回结果,会报读超时错误。

以下为请求路径图:

Image

以下为界面效果图:

Image

以下为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还是因为社区版本的限制?

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu với ví dụ Java AIFAQController và lần theo chuỗi lệnh gọi qua /api/v1/system/assistant/ds cùng các endpoint datasource /api/v1/datasource/get/{id}, tableList/{id} và fieldList/{id}. Tái hiện timeout trên SQLBot 1.10.0 Community đang chạy trong Docker, sau đó xác định liệu hành vi này là lỗi hay là một giới hạn đã được ghi nhận của Community Edition; issue được xem là hoàn tất khi nguyên nhân và hành vi được hỗ trợ đã được xác lập.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java, javascript, openapi
Lĩnh vực
api, backend
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Sôi nổi
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.