Rust实时数据同步库dittolive-ditto-sys的使用,实现跨平台高效数据同步与协作

Rust实时数据同步库dittolive-ditto-sys的使用,实现跨平台高效数据同步与协作

libdittoffi系统库

这是一个*-sys库,负责为您的目标平台下载底层的Ditto库并将其暴露给您的Rust应用程序。通常情况下,dittolive-ditto的用户不需要直接与这个库交互,除非用于调试目的。

构建

包含的build.rs脚本将尝试检测您的目标架构并下载适当的二进制ditto库(libdittoffi)。默认情况下,Cargo(以及Rust编译器使用的底层链接器)将会在多个位置搜索这个库。

*如果您想为不同的rustc目标交叉编译,您可能需要手动下载适当的二进制文件。*您也可以手动下载库并将其放在搜索路径中的一个位置。此外,您可以使用环境变量DITTOFFI_SEARCH_PATH来指定包含目标库的目录,这是平台无关的方式。还可以通过RUSTFLAGS环境变量向rustc明确传递-L参数来指定库搜索目录,尽管这将使所有依赖项的构建缓存失效(因为修改RUSTFLAGS会导致这种情况)。

注意,您也可以在本地Cargo的config.toml文件中覆盖构建脚本行为。

安装

在项目目录中运行以下Cargo命令:

cargo add dittolive-ditto-sys

或者将以下行添加到您的Cargo.toml中:

dittolive-ditto-sys = "4.11.2"

完整示例代码

以下是一个使用dittolive-ditto-sys实现跨平台数据同步的完整示例:

use dittolive_ditto::prelude::*;
use dittolive_ditto::store::*;
use std::sync::Arc;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建Ditto实例
    let ditto = Arc::new(Ditto::builder().build()?);
    
    // 2. 创建或获取一个集合
    let store = ditto.store();
    let collection = store.collection("people")?;
    
    // 3. 设置实时同步
    let sync_handler = ditto.sync().start()?;
    
    // 4. 插入示例数据
    let doc_id = collection.upsert(json!({
        "name": "Alice",
        "age": 30,
        "city": "New York"
    }))?;
    
    println!("Inserted document with ID: {:?}", doc_id);
    
    // 5. 订阅数据变更
    let mut subscription = collection.find_all().subscribe()?;
    
    // 6. 监听变更事件
    tokio::spawn(async move {
        while let Some(event) = subscription.next().await {
            match event {
                LiveQueryEvent::Insert(doc) => {
                    println!("New document inserted: {:?}", doc);
                },
                LiveQueryEvent::Update(doc, _) => {
                    println!("Document updated: {:?}", doc);
                },
                LiveQueryEvent::Delete(doc) => {
                    println!("Document deleted: {:?}", doc);
                },
                LiveQueryEvent::Initial(docs) => {
                    println!("Initial documents: {:?}", docs);
                }
            }
        }
    });
    
    // 7. 保持程序运行
    tokio::runtime::Runtime::new()?.block_on(std::future::pending::<()>());
    
    Ok(())
}

示例说明

  1. 首先创建Ditto实例,这是使用Ditto库的主要入口点
  2. 获取或创建一个集合(类似于数据库表)
  3. 启动实时同步功能,使数据能在不同设备间自动同步
  4. 插入示例JSON数据
  5. 订阅集合中的所有文档变更
  6. 在单独的异步任务中监听和处理数据变更事件
  7. 保持程序运行以持续接收变更

这个示例展示了Ditto的基本功能,包括数据存储、实时同步和变更监听。您可以根据需要扩展此示例,添加更多功能如:

  • 更复杂的数据模型
  • 冲突解决策略
  • 离线优先的数据处理
  • 多设备同步测试

Ditto的跨平台特性使得这个代码可以在支持Rust的各种平台上运行,包括Windows、macOS、Linux、iOS和Android等。


1 回复

Rust实时数据同步库dittolive-ditto-sys使用指南

概述

dittolive-ditto-sys是Ditto实时数据同步平台的Rust绑定库,提供了跨平台的高效数据同步与协作能力。这个库特别适合需要实时数据同步的应用程序,如协作编辑、多设备同步或分布式系统。

主要特性

  • 跨平台支持(iOS、Android、macOS、Windows、Linux)
  • 点对点网络同步(蓝牙、WiFi、LAN)
  • 端到端加密
  • 自动冲突解决
  • 离线优先设计

安装方法

在Cargo.toml中添加依赖:

[dependencies]
dittolive-ditto-sys = "0.9"

完整示例代码

下面是一个完整的示例,展示了如何使用dittolive-ditto-sys进行数据同步:

use dittolive_ditto_sys::*;
use std::thread;
use std::time::Duration;

fn main() {
    // 1. 初始化Ditto实例
    unsafe {
        let ditto = ditto_new();
        let identity = ditto_identity_online_playground("YOUR_APP_ID", "YOUR_PLAYGROUND_TOKEN");
        ditto_set_identity(ditto, identity);
        ditto_start_sync(ditto);

        // 2. 创建集合和文档
        let store = ditto_store(ditto);
        let collection = ditto_collection(store, "tasks");
        
        // 插入初始文档
        let doc = ditto_new_document();
        ditto_document_set_string(doc, "title", "Buy milk");
        ditto_document_set_bool(doc, "completed", false);
        ditto_collection_insert(collection, doc, None);
        ditto_document_free(doc);

        // 3. 查询数据
        let query = ditto_collection_find(collection, "{}");
        let cursor = ditto_query_exec(query);
        
        println!("Initial tasks:");
        while ditto_cursor_next(cursor) {
            let doc = ditto_cursor_current_document(cursor);
            let title = ditto_document_get_string(doc, "title");
            let completed = ditto_document_get_bool(doc, "completed");
            println!("- {}: {}", title, completed);
        }
        
        ditto_cursor_free(cursor);
        ditto_query_free(query);

        // 4. 实时订阅数据变更
        let observer = ditto_collection_observe(collection, "{}", |docs, _| {
            println!("\nData changed! Current tasks:");
            for i in 0..ditto_documents_count(docs) {
                let doc = ditto_documents_get(docs, i);
                let title = ditto_document_get_string(doc, "title");
                let completed = ditto_document_get_bool(doc, "completed");
                println!("- {}: {}", title, completed);
            }
        });

        // 5. 高级功能 - 冲突解决
        ditto_register_resolver(ditto, "tasks", |local_doc, remote_doc, resolved_doc| {
            if ditto_document_is_deleted(remote_doc) {
                ditto_document_copy(local_doc, resolved_doc);
            } else {
                let local_modified = ditto_document_get_date(local_doc, "modified");
                let remote_modified = ditto_document_get_date(remote_doc, "modified");
                
                if local_modified > remote_modified {
                    ditto_document_copy(local_doc, resolved_doc);
                } else {
                    ditto_document_copy(remote_doc, resolved_doc);
                }
            }
        });

        // 6. 同步策略配置
        let sync_policy = ditto_sync_policy_new();
        ditto_sync_policy_set_peers(sync_policy, DITTO_PEERS_ALL);
        ditto_sync_policy_set_network(sync_policy, DITTO_NETWORK_ALL);
        ditto_set_sync_policy(ditto, sync_policy);
        ditto_sync_policy_free(sync_policy);

        // 模拟运行60秒以观察变更
        println!("\nRunning for 60 seconds to observe changes...");
        thread::sleep(Duration::from_secs(60));

        // 清理资源
        ditto_subscription_free(observer);
        ditto_free(ditto);
    }
}

代码说明

  1. 初始化Ditto实例:创建Ditto实例并设置身份验证
  2. 创建集合和文档:在"tasks"集合中创建初始文档
  3. 查询数据:查询并打印当前所有任务
  4. 实时订阅:设置观察者回调,当数据变化时打印最新状态
  5. 冲突解决:注册自定义冲突解决逻辑
  6. 同步策略:配置全网络同步策略

注意事项

  1. 示例中使用了unsafe代码块,因为大多数API都是不安全的
  2. 必须正确释放所有分配的资源
  3. 生产环境应使用更安全的身份验证方式
  4. 示例为了简单省略了错误处理,实际应用中应添加

性能建议

  1. 对于大型应用,考虑将同步操作放在后台线程
  2. 对大型数据集使用分页查询
  3. 合理设置同步策略以减少网络流量
  4. 为常用查询字段创建索引
回到顶部