Files
ViewDesignEngine/include/vde/cloud/cloud_native.h
T
茂之钳 69888621cd
CI / Build & Test (push) Failing after 30s
CI / Release Build (push) Failing after 38s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
feat(v9): distributed computing + cloud-native + KBE + WASM + digital twin
v9.1 — Distributed Computing (超越 Parasolid):
- cluster_engine: ClusterManager, TaskScheduler(DAG+Kahn), 4 load-balance strategies
- distributed_boolean, distributed_marching_cubes, distributed_ray_tracing
- grpc_service: BrepOps/MeshOps/SdfOps RPC, streaming, TLS, connection pool
- ~750 lines

v9.2 — Cloud-Native + KBE + WASM + Digital Twin (34/34 tests passing):
- cloud_native: CloudSession, OperationalTransform, DeltaSync, Serverless, ObjectStorage
- knowledge_engine: CheckMate(13 rules), RuleEngine, DesignTable, GA+Adam optimizer
- vde_wasm: WasmBridge, WebWorkerPool, SharedArrayBuffer, IndexedDB
- dt_engine: DigitalTwin, MQTT/OPC-UA, RealTimeSync, PredictiveMaintenance(RUL)
- 3950 lines, 34 tests all passing

Pending: AI/ML integration (retrying)

18 files, ~4700 lines
2026-07-26 23:44:24 +08:00

349 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
/// @file cloud_native.h 云原生协同设计基础设施
/// @ingroup cloud
#include <string>
#include <vector>
#include <map>
#include <set>
#include <memory>
#include <optional>
#include <functional>
#include <chrono>
#include <cstdint>
#include <mutex>
#include <shared_mutex>
namespace vde::cloud {
// ═══════════════════════════════════════════════════════
// 基础数据结构
// ═══════════════════════════════════════════════════════
/// 操作类型枚举
enum class OpType : uint8_t {
INSERT,
DELETE,
MODIFY,
MOVE,
ROTATE,
SCALE
};
/// 增量操作单位(DeltaSync 同步单元)
struct DeltaOp {
OpType type;
uint64_t entity_id; // 面/边/体 ID
uint64_t timestamp; // UTC 微秒时间戳
std::vector<uint8_t> data; // 序列化增量数据
};
/// 模型变更集(一次同步的增量集合)
struct ChangeSet {
uint64_t base_version; // 基于哪个版本
uint64_t new_version; // 新的版本号
std::string user_id;
std::vector<DeltaOp> ops;
std::chrono::system_clock::time_point t;
};
// ═══════════════════════════════════════════════════════
// OT (Operation Transform)
// ═══════════════════════════════════════════════════════
/**
* @brief 操作变换 —— 实时协作冲突解决引擎
*
* 实现 OT 算法核心:对并发的操作对进行变换,
* 确保多用户编辑最终一致。
*
* @ingroup cloud
*/
class OperationalTransform {
public:
OperationalTransform() = default;
/// 变换 op1 使其与 op2 兼容(op1' = OT(op1, op2)
DeltaOp transform(const DeltaOp& op1, const DeltaOp& op2) const;
/// 组合变换:将整个 changeset 变换到另一个 changeset 之后
ChangeSet transform_set(const ChangeSet& cs1,
const ChangeSet& cs2) const;
/// 检查两个操作是否冲突
[[nodiscard]] bool conflicts(const DeltaOp& a, const DeltaOp& b) const;
/// 合并两个并发变更集
ChangeSet merge(const ChangeSet& cs1, const ChangeSet& cs2) const;
private:
bool same_entity(const DeltaOp& a, const DeltaOp& b) const;
DeltaOp rebase_insert(const DeltaOp& op, const DeltaOp& against) const;
DeltaOp rebase_delete(const DeltaOp& op, const DeltaOp& against) const;
DeltaOp rebase_modify(const DeltaOp& op, const DeltaOp& against) const;
};
// ═══════════════════════════════════════════════════════
// DeltaSync
// ═══════════════════════════════════════════════════════
/**
* @brief 增量同步引擎
*
* 仅同步被修改的面/边/体,而非完整模型。
* 基于版本链的变更日志实现高效增量传输。
*
* @ingroup cloud
*/
class DeltaSync {
public:
DeltaSync() = default;
/// 生成相对于 base_version 的增量
ChangeSet diff(uint64_t base_version) const;
/// 应用远程增量
bool apply_remote(const ChangeSet& cs);
/// 提交本地变更
void commit_local(const std::vector<DeltaOp>& ops,
const std::string& user_id);
/// 获取当前版本号
[[nodiscard]] uint64_t version() const { return current_version_; }
/// 获取所有已追踪的 entity_id
[[nodiscard]] std::vector<uint64_t> dirty_entities() const;
/// 检查指定实体是否已修改
[[nodiscard]] bool is_dirty(uint64_t entity_id) const;
/// 回滚到指定版本
bool rollback(uint64_t target_version);
private:
uint64_t current_version_ = 0;
std::vector<ChangeSet> change_log_;
std::set<uint64_t> dirty_set_;
std::map<uint64_t, uint64_t> entity_version_; // entity_id → last changed version
mutable std::shared_mutex mutex_;
};
// ═══════════════════════════════════════════════════════
// CloudSession
// ═══════════════════════════════════════════════════════
/// 用户信息
struct UserInfo {
std::string user_id;
std::string display_name;
uint32_t color = 0xFF0000; // 协同光标颜色
bool online = false;
};
/**
* @brief 多用户协作会话
*
* 管理多个用户的实时协同编辑会话。
* 集成 OT 冲突解决与 DeltaSync 增量同步。
*
* @ingroup cloud
*/
class CloudSession {
public:
explicit CloudSession(std::string session_id);
~CloudSession();
/// 加入会话
bool join(const UserInfo& user);
/// 离开会话
bool leave(const std::string& user_id);
/// 提交操作(经 OT 变换后合并)
bool submit_operation(const std::string& user_id,
const std::vector<DeltaOp>& ops);
/// 拉取当前用户未接收的变更
ChangeSet pull_changes(const std::string& user_id);
/// 获取会话基本信息
[[nodiscard]] const std::string& session_id() const { return session_id_; }
/// 在线用户列表
[[nodiscard]] std::vector<UserInfo> online_users() const;
/// 当前模型版本
[[nodiscard]] uint64_t version() const;
/// 获取用户的版本游标(该用户已拉到哪个版本)
[[nodiscard]] uint64_t user_cursor(const std::string& user_id) const;
private:
std::string session_id_;
OperationalTransform ot_;
DeltaSync sync_;
std::map<std::string, UserInfo> users_; // user_id → UserInfo
std::map<std::string, uint64_t> user_cursor_; // user_id → 已拉取版本
std::map<std::string, uint64_t> pending_seq_; // user_id → 待合并 seq
mutable std::shared_mutex mutex_;
};
// ═══════════════════════════════════════════════════════
// Serverless Function (AWS Lambda / Cloud Functions)
// ═══════════════════════════════════════════════════════
/// 函数调用请求
struct FunctionRequest {
std::string function_name;
std::vector<uint8_t> payload;
std::map<std::string, std::string> headers;
std::chrono::milliseconds timeout{30000};
};
/// 函数调用响应
struct FunctionResponse {
int status_code = 200;
std::vector<uint8_t> body;
std::map<std::string, std::string> headers;
std::chrono::milliseconds duration{0};
bool ok = false;
};
/**
* @brief Serverless 函数部署与调用接口
*
* 支持 AWS Lambda / Google Cloud Functions 等无服务器平台。
* 用于部署设计验证规则、模型转换管道等无状态函数。
*
* @ingroup cloud
*/
class ServerlessFunction {
public:
ServerlessFunction() = default;
virtual ~ServerlessFunction() = default;
/// 调用远程函数
virtual FunctionResponse invoke(const FunctionRequest& req);
/// 异步调用(fire-and-forget
void invoke_async(const FunctionRequest& req);
/// 部署函数到云端
virtual bool deploy(const std::string& function_name,
const std::string& code_path,
const std::string& runtime = "provided.al2023");
/// 更新函数配置
virtual bool update_config(const std::string& function_name,
int memory_mb = 256,
std::chrono::seconds timeout = std::chrono::seconds(30));
/// 列出已部署的函数
virtual std::vector<std::string> list_functions() const;
/// 删除函数
virtual bool remove_function(const std::string& function_name);
/// 设置云端端点
void set_endpoint(const std::string& url) { endpoint_ = url; }
protected:
std::string endpoint_;
std::string region_ = "us-east-1";
std::string credentials_path_;
};
// ═══════════════════════════════════════════════════════
// ObjectStorage (S3 / MinIO)
// ═══════════════════════════════════════════════════════
/// 对象元信息
struct ObjectMeta {
std::string key;
uint64_t size_bytes = 0;
std::string content_type;
std::string etag;
std::chrono::system_clock::time_point last_modified;
};
/**
* @brief 对象存储 —— S3/MinIO 模型仓库
*
* 管理 3D 模型文件(STEP/IGES/glTF/OBJ 等)的云端存储。
* 支持分片上传、断点续传、版本管理和预签名 URL。
*
* @ingroup cloud
*/
class ObjectStorage {
public:
ObjectStorage() = default;
virtual ~ObjectStorage() = default;
/// 配置存储后端
void configure(const std::string& endpoint,
const std::string& bucket,
const std::string& access_key,
const std::string& secret_key);
/// 上传对象
virtual bool put_object(const std::string& key,
const std::vector<uint8_t>& data,
const std::string& content_type = "application/octet-stream");
/// 分片上传(大文件自动分片)
bool multipart_upload(const std::string& key,
const std::vector<uint8_t>& data,
size_t part_size_mb = 5);
/// 下载对象
virtual std::optional<std::vector<uint8_t>> get_object(const std::string& key);
/// 检查对象是否存在
virtual bool object_exists(const std::string& key) const;
/// 列出前缀下的对象
virtual std::vector<ObjectMeta> list_objects(const std::string& prefix = "",
int max_keys = 1000) const;
/// 删除对象
virtual bool delete_object(const std::string& key);
/// 生成预签名下载 URL
virtual std::string presigned_get_url(const std::string& key,
std::chrono::seconds expires);
/// 生成预签名上传 URL
virtual std::string presigned_put_url(const std::string& key,
std::chrono::seconds expires);
/// 复制对象
bool copy_object(const std::string& src_key, const std::string& dst_key);
/// 获取对象元信息
virtual std::optional<ObjectMeta> head_object(const std::string& key);
/// 模型文件快捷存储(.stp / .igs / .gltf 等)
bool store_model(const std::string& model_name,
const std::vector<uint8_t>& model_data,
const std::string& format);
/// 模型文件快捷下载
std::optional<std::vector<uint8_t>> load_model(const std::string& model_name,
const std::string& format);
/// 删除模型
bool delete_model(const std::string& model_name,
const std::string& format);
protected:
std::string endpoint_;
std::string bucket_;
std::string access_key_;
std::string secret_key_;
std::string region_ = "us-east-1";
bool use_ssl_ = true;
};
} // namespace vde::cloud