构建高性能、实时数据同步与响应式UI的现代Web应用
Drogon C++框架提供10K+ QPS处理能力,适合高并发场景
TrailBase CDC实现亚毫秒级数据变更推送
SolidJS细粒度更新DOM,无虚拟DOM开销
# 安装 Drogon(需 vcpkg)
vcpkg install drogon drogon[ctl] sqlite3
# 创建 SolidJS 项目(TypeScript 模板)
npx degit solidjs/templates/ts web-frontend
cd web-frontend && npm install
# 下载 Trailbase(v0.4.0+ 支持实时 API)
git clone https://github.com/trailbase/trailbase
cd trailbase && make build
drogon_ctl create project server
cd server/controllers
drogon_ctl create controller -h ApiController
编辑 ApiController.h 定义RESTful路由
查询TrailBase数据(通过SQLite API)
void ApiController::asyncHandleHttpRequest(...) {
auto db = drogon::app().getDbClient();// SQLite 连接
auto result = db->execSqlSync("SELECT * FROM data_table");
auto jsonResp = formatResultToJson(result);// 结果转 JSON
callback(HttpResponse::newHttpJsonResponse(jsonResp));
}
实时数据推送(WebSocket + CDC)
void ApiController::handleNewWebSocket(const HttpRequestPtr& req) {
auto ws = WebSocketConnection::newWebSocket();
TrailBase::subscribe("data_table", [ws](const Json::Value& change) {
ws->send(change.toStyledString());// 通过 CDC 推送变更
});
}
drogon::app().registerPostHandlingAdvice(
[](const HttpRequestPtr&, const HttpResponsePtr& resp) {
resp->addHeader("Access-Control-Allow-Origin", "*");
resp->addHeader("Access-Control-Allow-Methods", "GET,POST");
}
);
import { Route, Router } from "@solidjs/router";
import { lazy, createSignal, onCleanup } from "solid-js";
const DataView = lazy(() => import("./pages/DataView"));
const routes = [
{ path: "/", component: lazy(() => import("./pages/Home")) },
{ path: "/realtime", component: DataView }
];
// 在入口文件渲染路由
render(() => {routes} , document.getElementById("app"));
export default function DataView() {
const [data, setData] = createSignal([]);
let ws: WebSocket;
onMount(() => {
ws = new WebSocket("ws://localhost:8080/api/subscribe");
ws.onmessage = (e) => {
const change = JSON.parse(e.data);
setData(prev => [...prev, change]);// 增量更新
};
});
onCleanup(() => ws.close());// 清理连接
return {item => {item.message}} ;
}
// 查询初始数据
const fetchData = async () => {
const res = await fetch("http://localhost:8080/api/data");
setData(await res.json());
};
app().setThreadNum(std::thread::hardware_concurrency())PRAGMA journal_mode=WAL;
createMemo 缓存计算密集型结果修改TrailBase数据,观察前端自动更新(亚毫秒级延迟)
# Drogon 后端
cd server/build
cmake -DCMAKE_TOOLCHAIN_FILE=[vcpkg]/scripts/buildsystems/vcpkg.cmake ..
make -j$(nproc)
# SolidJS 前端
npm run build# 生成 dist 静态文件
# 启动 TrailBase(数据层)
./trailbase --db-path ./data.db
# 启动 Drogon(托管前端静态文件)
./server/bin/server -d ./web-frontend/dist
Upgrade头)app().setSSLFiles("cert.pem", "key.pem"))使用Protobuf定义Drogon API接口,生成SolidJS的TS类型
此架构可实现单机 10K+ QPS(Drogon异步IO)+ 亚毫秒级实时更新(TrailBase CDC),适合金融、物联网等高并发场景。