高并发 SQL Server 日志查询服务器,使用 C++ 和 Lua 实现。
AsyncSqlServer 是一个基于 Windows IOCP(I/O Completion Ports) 的高性能日志查询服务器,提供 HTTP/JSON 接口供外部系统查询存储在 SQL Server 中的日志数据。
| 特性 | 说明 |
|---|---|
| 🚀 高并发网络层 | 基于 Windows IOCP 的异步非阻塞 I/O,支持数千并发连接 |
| 🧵 线程池 | C++17 线程池,充分利用多核 CPU |
| 🗄️ 连接池 | ODBC 数据库连接池,避免频繁建立数据库连接 |
| 📝 Lua 脚本 | 可配置的业务逻辑层,无需重新编译即可修改查询逻辑 |
| 🔒 参数安全 | ODBC 参数绑定防止 SQL 注入 |
┌─────────────────────────────────────────────────┐
│ HTTP 客户端 / 测试脚本 │
└────────────────────┬───────────────────────────┘
│ HTTP/JSON
┌────────────────────▼───────────────────────────┐
│ TCP Server(IOCP 异步 I/O) │
│ Winsock2 + AcceptEx + WSARecv/WSASend │
├─────────────────────────────────────────────────┤
│ HTTP Parser / HTTP Response │
├───────────────┬────────────────┬────────────────┤
│ Thread Pool │ Connection Pool│ Lua Engine │
│ (C++17 线程) │ (ODBC 连接池) │ (Lua 5.4 脚本) │
├───────────────┴────────────────┴────────────────┤
│ SQL Executor (ODBC) │
└─────────────────────┬───────────────────────────┘
│ ODBC
┌─────────────────────▼───────────────────────────┐
│ SQL Server (LogDB 数据库) │
└─────────────────────────────────────────────────┘
├── CMakeLists.txt # CMake 构建配置
├── README.md # 本文档
├── include/
│ ├── server/
│ │ ├── tcp_server.h # TCP 服务器(IOCP)
│ │ ├── http_parser.h # HTTP 请求解析
│ │ └── http_response.h # HTTP 响应构建
│ ├── pool/
│ │ ├── thread_pool.h # 线程池
│ │ └── connection_pool.h # 数据库连接池
│ ├── db/
│ │ └── sql_executor.h # SQL 执行器
│ ├── lua/
│ │ └── lua_engine.h # Lua 引擎封装
│ └── common/
│ ├── config.h # 配置管理
│ └── logger.h # 日志工具
├── src/ # C++ 源代码
├── scripts/ # Lua 脚本
│ ├── query_config.lua # 查询配置(SQL 构建)
│ ├── formatter.lua # 格式化输出
│ └── router.lua # 路由与参数验证
├── config/
│ └── server.conf # 服务器配置文件
├── sql/
│ └── init.sql # 数据库初始化脚本
└── test/
└── test_client.py # Python 测试客户端
- Visual Studio 2019/2022(含 C++ 桌面开发工作负载)
- CMake 3.16+(下载)
- Git
从 LuaBinaries 下载 Windows 预编译包:
- 下载
lua-5.4.x_Win64_dll17_lib.zip(MSVC 2019 版本) - 解压到
C:\lua54 - 目录结构应为:
C:\lua54\ ├── include\ # lua.h lualib.h lauxlib.h ├── lib\ # lua54.lib └── bin\ # lua54.dll
- 下载安装 ODBC Driver 17 for SQL Server
- 安装后可在"ODBC 数据源管理器"中验证驱动是否可用
- 本地安装:SQL Server Developer Edition(免费)
- 或使用 Docker:
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=YourPassword123! \ -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest
在 SQL Server Management Studio 或 sqlcmd 中执行:
sqlcmd -S localhost -U sa -P YourPassword123! -i sql\init.sql编辑 config/server.conf,填写实际的数据库连接信息:
[database]
server=localhost
port=1433
database=LogDB
username=sa
password=YourStrongPassword123!REM 创建构建目录
mkdir build
cd build
REM 配置(指定 Lua 路径)
cmake .. -DLUA_ROOT=C:\lua54 -G "Visual Studio 17 2022" -A x64
REM 编译(Release 模式)
cmake --build . --config Release
REM 可执行文件位于 build\Release\AsyncSqlServer.exeREM 进入输出目录
cd build\Release
REM 启动服务器(使用默认配置文件)
AsyncSqlServer.exe
REM 或指定配置文件路径
AsyncSqlServer.exe C:\path\to\server.conf服务器启动后显示:
[INFO] 配置文件加载成功: ./config/server.conf
[INFO] 数据库连接池初始化成功,连接数: 20
[INFO] Lua 引擎初始化成功,脚本目录: ./scripts
[INFO] 服务器已就绪,等待连接...
[INFO] API 地址: http://localhost:8080/api/health
按 Ctrl+C 优雅停止服务器。
{
"code": 0,
"message": "success",
"data": { ... }
}code 为 0 表示成功,非 0 表示错误。
curl http://localhost:8080/api/health响应:
{"status": "ok", "version": "1.0.0"}查询参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
page |
整数 | 1 |
页码 |
page_size |
整数 | 20 |
每页条数(最大 100) |
level |
字符串 | - | 日志级别(DEBUG/INFO/WARN/ERROR/FATAL) |
keyword |
字符串 | - | 消息关键词搜索 |
source |
字符串 | - | 来源模块过滤 |
start_time |
字符串 | - | 开始时间(YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS) |
end_time |
字符串 | - | 结束时间 |
format |
字符串 | json |
输出格式(json/text/csv) |
curl "http://localhost:8080/api/logs?level=ERROR&page=1&page_size=10"curl http://localhost:8080/api/logs/42curl http://localhost:8080/api/logs/stats响应示例:
{
"code": 0,
"message": "success",
"data": [{
"total_count": "150",
"error_count": "12",
"warn_count": "25",
"info_count": "100",
"debug_count": "13"
}]
}所有 Lua 脚本位于 scripts/ 目录,服务器启动时自动加载。修改脚本后需要重启服务器。
核心函数 build_query(params) 根据 HTTP 请求参数构建 SQL 语句。可自定义过滤条件、排序规则等。
核心函数 format_result(json_data, format) 处理查询结果格式化,支持 JSON、纯文本、CSV 三种输出格式。
route_request(path, method)— 路由匹配validate_params(path, params)— 参数合法性验证(返回空字符串表示通过,返回错误消息表示失败)
REM 确保服务器已启动
REM 运行所有测试
python test\test_client.py --host localhost --port 8080
REM 并发测试(100 并发请求)
python test\test_client.py --concurrency 100
REM 跳过并发测试
python test\test_client.py --skip-concurrent| 配置项 | 建议值 | 说明 |
|---|---|---|
threads |
CPU 核心数 × 2 | IOCP 工作线程数 |
pool_size |
20~50 | 数据库连接池大小 |
max_connections |
1000~5000 | 最大并发 TCP 连接数 |
注意:Windows IOCP 是 Windows 平台最高效的 I/O 多路复用机制,与 Linux 的 epoll 等效,可支持数万并发连接。
MIT License