什么是Drasi数据源(Source)?

Source提供了与系统的连接,Drasi 可以将这些系统视为变化源。source 在 Drasi 中执行三个重要功能:

  • 处理源系统生成的更改日志/源,并将这些更改推送到使用该源作为输入的每个连续查询
  • 将源更改数据转换为一致的属性图数据模型,以便订阅的 Continuous Queries 可以使用该数据,就像使用 Nodes 和 Relations 的图形一样。对于图形源(如 Gremlin),无需转换。但对于非图形源,例如 PostgreSQL 和 Kubernetes,Source 会转换数据(更多详细信息在各个 Sources 部分中提供)。
  • 为 Continuous Queries 提供一种方法,以便在启动时查询源系统以初始化 Continuous Query 结果的状态。

Drasi Sources SDK 是一个用于实现 Drasi 数据源的多语言开发工具包,目前支持 Java、.NET、Rust 等编程语言。这个 SDK 的主要目的是帮助开发者创建和管理 Drasi 平台的数据源。扩展Drasi Sources的文档参见 https://github.com/drasi-project/docs/blob/main/docs/content/how-to-guides/extend-drasi/implement-a-source.md

每个数据源由两个核心部分组成:

  1. 两个主要组件:

    a) Source Reactivator(数据源响应器):负责监控和处理数据变化

    • 监听源数据存储的变更流
    • 将数据转换为图结构
    • 将变更推送到持续查询系统
    • 支持状态存储,用于保存游标等信息

    b) Source Proxy(数据源代理):负责初始数据的获取和加载 :

    • 处理新的持续查询的初始化
    • 通过查询数据存储获取初始状态
    • 将数据转换为图结构
  2. 支持的数据操作:

    • 节点(Node)的创建和管理
    • 关系(Relation)的创建和管理
    • 属性(Properties)的管理
    • 变更事件的处理
    • 控制事件的处理
  3. 特点和优势
  • 多语言支持:提供 Java、.NET、Rust 等多种语言的实现
  • 异步处理:支持异步流式处理数据变更
  • 状态管理:提供状态存储功能,支持游标管理
  • 配置灵活:支持自定义配置属性
  • 容器化部署:支持容器化部署和管理
  • 事件驱动:基于事件驱动架构处理数据变更

SDK 的设计理念是提供一个统一的接口来实现各种数据源的接入,同时保持足够的灵活性以适应不同的使用场景。无论是简单的数据源还是复杂的数据处理系统,都可以通过这个 SDK 来实现与 Drasi 平台的集成。

实现自定义数据源的步骤

第一步:实现Source Proxy(数据源代理)

Source Proxy主要负责在查询部署时获取初始数据。它需要提供一个HTTP服务器,并实现/acquire接口来处理初始数据的加载。

using System.Runtime.CompilerServices;

using System.Text.Json.Nodes;

using Drasi.Source.SDK;

using Drasi.Source.SDK.Models;

using Microsoft.Extensions.Configuration;

var proxy = new SourceProxyBuilder()
     .UseBootstrapHandler<BootstrapHandler>()
     .Build();

await proxy.StartAsync();

class BootstrapHandler : IBootstrapHandler

{
     public BootstrapHandler(IConfiguration configuration)
     {
         Console.WriteLine($"Connection string: {configuration["connectionString"]}");
     }

public async IAsyncEnumerable<SourceElement> Bootstrap(BootstrapRequest request, [EnumeratorCancellation]CancellationToken cancellationToken = default)
     {
         if (request.NodeLabels.Contains("Person"))
         {

yield return new SourceElement("person-1", ["Person"], new JsonObject
             {
                 { "name", "Alice" },
                 { "age", 30 }
             });

yield return new SourceElement("person-2", ["Person"], new JsonObject
             {
                 { "name", "Bob" },
                 { "age", 40 }
             });
         }

if (request.RelationLabels.Contains("Knows"))
         {
             yield return new SourceElement("1-2", ["Knows"], new JsonObject
             {
                 { "since", 2010 }
             }, "person-1", "person-2");
         }
     }

}

数据模型

  1. SourceElement 类

    • 支持节点和关系数据
    • JSON 属性支持
    • 标签系统

第二步:实现Source Reactivator(数据源响应器)

Source Reactivator负责监控数据变化并通过Dapr的pub/sub(发布/订阅)功能将变化事件发送给其他组件。

数据变化事件格式

所有的数据变化事件都需要包含三个必须字段:

  • op:操作类型
  • payload:数据负载
  • ts_ms:时间戳(毫秒)

1. 新增数据事件格式

{
"op": "i", // i 表示 insert(插入)
"payload": {
"after": {
"id": "001",
"labels": ["用户", "VIP"],
"properties": {
"name": "张三",
"age": 30
}
},
"before": {}, // 新增时before为空
"source": {
"table": "node", // node表示节点,relation表示关系
"ts_ms": "1676908799000"
}
},
"ts_ms": 1676908799000
}

2. 更新数据事件格式

{
"op": "u", // u 表示 update(更新)
"payload": {
"after": {
"id": "001",
"labels": ["用户", "VIP"],
"properties": {
"name": "张三",
"age": 31
}
},
"before": {
"id": "001",
"labels": ["用户", "VIP"],
"properties": {
"name": "张三",
"age": 30
}
},
"source": {
"table": "node",
"ts_ms": "1676908799000"
}
},
"ts_ms": 1676908799000
}

3. 删除数据事件格式

{
"op": "d", // d 表示 delete(删除)
"payload": {
"after": {}, // 删除时after为空
"before": {
"id": "001",
"labels": ["用户", "VIP"],
"properties": {
"name": "张三",
"age": 31
}
},
"source": {
"table": "node",
"ts_ms": "1676908799000"
}
},
"ts_ms": 1676908799000
}

注册你的数据源

创建SourceProvider配置

要注册新的数据源类型,你需要创建一个SourceProvider配置文件。这个配置描述了数据源的组件和配置选项。

apiVersion: v1

kind: SourceProvider

name: MySource

spec:
   services:
     proxy:
       image: my-proxy
       externalImage: true
       dapr:
         app-port: "80"
     reactivator:
       image: my-reactivator
       externalImage: true
       deprovisionHandler: true
       dapr:
         app-port: "80"
   config_schema:
     type: object
     properties:
       connectionString:  # sample config property
         type: string

使用数据源

创建Source配置文件来使用已注册的数据源:

apiVersion: v1

kind: Source

name: test-source

spec:
   kind: MySource
   properties:
     connectionString: "my-connection-string"

部署和管理命令

# 注册数据源提供者
drasi apply -f source-provider.yaml # 查看所有可用的数据源类型
drasi list sourceprovider # 部署具体的数据源实例
drasi apply -f source.yaml

调试和验证

  1. 配置文件验证

    • 使用Drasi CLI:drasi apply --dry-run -f your-source.yaml
    • 使用VSCode插件:安装Drasi VSCode扩展,可以自动验证配置文件
  2. 常见问题排查

    • 确保Docker镜像已正确推送到镜像仓库
    • 检查服务端口配置是否正确
    • 验证数据库连接信息
    • 查看容器日志排查问题
  3. 最佳实践

    • 在开发环境中充分测试
    • 使用环境变量管理敏感信息
    • 实现健康检查接口
    • 添加详细的日志记录

常见问题

  1. Q: 如何确保数据源的安全性? A: 使用环境变量存储敏感信息,启用SSL连接,实施适当的访问控制。

  2. Q: 数据源支持哪些类型的数据变化监控? A: 支持新增(insert)、更新(update)和删除(delete)三种基本操作的监控。

  3. Q: 如何处理大量数据的初始加载? A: 考虑使用分页加载,实现断点续传,或者使用批量处理机制。

Drasi Sources SDK的更多相关文章

  1. [原]Android开发环境搭建

    [Date]2014-04-20 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Keywords]android . 离线a ...

  2. android 55

    智能家居:可以联网可以用指令操作可以返回状态.智能微波炉智能眼镜智能手表. Android作者Andy Rubin,2007年正式由谷歌推广,开源的. 安卓体系结构和开发一个闹钟的调用结构图: 安卓和 ...

  3. jenkins集成sonar

    用于我的sonar已经在一台机器上搭建好了,但是每次都要人工去执行sonar-run,很麻烦,所以就想着集成到jenkins上,在jenkins上点点按钮就可以看sonar结果,所以很抱歉,本博客不设 ...

  4. 在Ubuntu环境下搭建esp32开发环境

    第一步:下载必要的库文件   sudo apt-get install git make gcc libncurses5-dev flex bison gperf python-serial     ...

  5. Android SDK 在线更新镜像服务器资源

    本文转自:http://blog.kuoruan.com/24.html.感谢原作者. 什么是Android SDK SDK:(software development kit)软件开发工具包.被软件 ...

  6. Android开发加快sdk更新速度

    1.在:\Windows\System32\drivers\etc目录下找到host文件,不能再这个目录修改host文件,需要先拷贝到桌面 然后把一下地址添加到host文件的最末尾 203.208.4 ...

  7. 搭建Android开发环境附图详解+模拟器安装(JDK+Eclipse+SDK+ADT)

    ——搭建android开发环境的方式有多种,比如:JDK+Eclipse+SDK+ADT或者JDK+Eclipse+捆绑好的AndroidSDK或者Android Studio. Google 决定将 ...

  8. Android SDK Manager 更新代理配置

    转自:http://www.cnblogs.com/tao560532/p/4483067.html 出现问题: 消除SDK更新时,有可能会出现这样的错误:Download interrupted: ...

  9. Eclipse更新SDK速度慢,解决办法

    在SDK Manager -> tools -> options中: HTTP Proxy Server: mirrors.neusoft.edu.cn HTTP Proxy Port: ...

  10. 在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包

    .NET 的开源,有了更多的DIY乐趣.这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb ...

随机推荐

  1. 将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了

    将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了 命令 查看缓存文件夹的具体路径 dotnet nuget locals all --list 第一步 在文件资源管理器输入%AppDat ...

  2. 【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力

    当前,数字化转型已经成为时代共性课题在政策和技术的双重指引下金融机构逐渐走向差异化竞争的格局面对转型阵痛以契合.明晰的战略规划及企业架构调整来辅助业务变革成为助力企业数字化转型的有效路径金融机构也纷纷 ...

  3. 【MyBatis】学习笔记08:批量删除

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  4. Qt编写视频监控系统70-OSD标签和图形信息(支持写入到文件)

    一.前言 作为一个完整的视频监控系统,用户还需要自定义一些OSD标签信息显示在对应通道上面,而且不止一个OSD标签信息,位置可以在四个角或者指定坐标显示.最开始本系统设计的时候,由于本人擅长的是pai ...

  5. Qt编写安防视频监控系统27-GPU显示

    一.前言 之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv.dxva2.d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了, ...

  6. 15条 Karpenter 最佳实践,轻松掌握弹性伸缩

    Karpenter 是一款高性能.灵活的开源 Kubernetes 集群自动扩展工具,目前已支持 AWS 和阿里云.它可以根据不断变化的应用负载,快速启动大小合适的计算资源,进而提升应用的可用性. 相 ...

  7. spark (二) spark wordCount示例

    目录 实现思路 实现1: scala 基本集合操作方式获取结果 实现2: scala map reduce方式获取结果 实现3: spark 提供的map reduce方式获取结果 FAQ: 实现思路 ...

  8. VSTO踩坑记录(2)- 运用outlook对象模型发送邮件

    概述 上篇文章记录了怎么样让vsto插件显示在功能区上面,这篇文章来说说怎么运用微软提供的对象方法对outlook进行操作,附上官方文档. 这次示例我们来用代码发一封邮件,先简单拉几个控件,分别代表要 ...

  9. Solution Set -「LOCAL」冲刺省选 Round XXVII

    \(\mathscr{Summary}\)   还行,B 题挺不错,C 题就省选来说有点水(? \(\mathscr{Solution}\) \(\mathscr{A-}\) 分裂   初始时,你有一 ...

  10. React源码解析(1): JSX语法与react项目渲染过程

    好家伙   0.前言 由于工作的需要,我不得不入手了react的全家桶,曾经我的主要技术栈是vue. 从vue转到react,一开始我感到非常不适应,jsx的语法的不了解,react hooks的使用 ...