 新一代分布式高性能图数据库的构建 - 沈游人海致图平台产品服务于金融、政府行业有大量业务经验积累(接近客户需求) • 现有开源产品无法满足要求(受限于基础架构设计,优化性能有限) 新一代分布式图数据库需具备的特性 特性 信 雅 达 • 高可用 • 一致性(事 务) • 高性能 • 低资源消耗 • 易用 • 功能丰富 AtlasGraph 关键特性 云原生 Cloud-Native Graph Database 支持弹性伸缩,有 效利用硬件资源,高可用,高 图原生存储 索引 LSM-Tree 容灾保障 ( BR ) 元数据层 事务管理 MVOCC 计算层 Cypher AST 优化器 图计算 内存加速引 擎 服务接口 HTTP/RPC Spark 连接器 Python UDF 执行器 索引管理 一致性存储 RAFT 分片管理 元数据 集群管理 用户权限 GNN 应用层 Atlas 分布式架构性能可线性扩展 - 针对大规模图优化的存算引擎 - 配合 Atlas 图平台,实现无代码图分析 - Query 性能分析模块,启发式提示优化 - 内置多种分析函数,面向分析师友好 -MVOCC 保证事务一致性 - 多副本管理保证数据服务高可用 - 在线备份提供容灾保障 高速 易用 可靠 Why Rust ? Performance • Blazingly fast and memory-efficient0 码力 | 38 页 | 24.68 MB | 1 年前3 新一代分布式高性能图数据库的构建 - 沈游人海致图平台产品服务于金融、政府行业有大量业务经验积累(接近客户需求) • 现有开源产品无法满足要求(受限于基础架构设计,优化性能有限) 新一代分布式图数据库需具备的特性 特性 信 雅 达 • 高可用 • 一致性(事 务) • 高性能 • 低资源消耗 • 易用 • 功能丰富 AtlasGraph 关键特性 云原生 Cloud-Native Graph Database 支持弹性伸缩,有 效利用硬件资源,高可用,高 图原生存储 索引 LSM-Tree 容灾保障 ( BR ) 元数据层 事务管理 MVOCC 计算层 Cypher AST 优化器 图计算 内存加速引 擎 服务接口 HTTP/RPC Spark 连接器 Python UDF 执行器 索引管理 一致性存储 RAFT 分片管理 元数据 集群管理 用户权限 GNN 应用层 Atlas 分布式架构性能可线性扩展 - 针对大规模图优化的存算引擎 - 配合 Atlas 图平台,实现无代码图分析 - Query 性能分析模块,启发式提示优化 - 内置多种分析函数,面向分析师友好 -MVOCC 保证事务一致性 - 多副本管理保证数据服务高可用 - 在线备份提供容灾保障 高速 易用 可靠 Why Rust ? Performance • Blazingly fast and memory-efficient0 码力 | 38 页 | 24.68 MB | 1 年前3
 Rust分布式账务系统 - 胡宇需求分析 支付处理: ● 转账 ● 冻资 / 解资 ● 账户限额 ● 批处理事务 正确性:无双花或少付 审计监管:交易日志不可篡改,交易历史可回溯 条件事务:根据一定的条件决定事务执行与否 高可用:在部分节点失效的情况下,依旧可以提供正确的 服务 超低延迟:实时交易,超低响应延迟 水平扩展性:利用分布式事务实现钱包集群的的水平扩 展,应对高达 100 万 TPS 的流量 可演化性:业务逻辑与底层 API 解耦,当业务发生改变 时,底层 API 不用改变 分布式账务系统 设计理念 - Rust 是我们可靠的基石 分布式账务系统 存算分离 API 解耦 读写分离 层级账号 Rust ● 事务层与账户层分 离 ● 独立水平扩展 ● CQRS ● Event Sourcing ● 针对读场景,写场 景分别优化 ● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 ○ 使用业务 id 进行路由 ○ 执行转账计划 ○ 分发账户变动请求 ● Auticuro 账户层 ○ 使用账户 id 进行分区 ○ 执行账户变动请求 ○ 更新账户余额 分布式账务系统0 码力 | 27 页 | 12.60 MB | 1 年前3 Rust分布式账务系统 - 胡宇需求分析 支付处理: ● 转账 ● 冻资 / 解资 ● 账户限额 ● 批处理事务 正确性:无双花或少付 审计监管:交易日志不可篡改,交易历史可回溯 条件事务:根据一定的条件决定事务执行与否 高可用:在部分节点失效的情况下,依旧可以提供正确的 服务 超低延迟:实时交易,超低响应延迟 水平扩展性:利用分布式事务实现钱包集群的的水平扩 展,应对高达 100 万 TPS 的流量 可演化性:业务逻辑与底层 API 解耦,当业务发生改变 时,底层 API 不用改变 分布式账务系统 设计理念 - Rust 是我们可靠的基石 分布式账务系统 存算分离 API 解耦 读写分离 层级账号 Rust ● 事务层与账户层分 离 ● 独立水平扩展 ● CQRS ● Event Sourcing ● 针对读场景,写场 景分别优化 ● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 ○ 使用业务 id 进行路由 ○ 执行转账计划 ○ 分发账户变动请求 ● Auticuro 账户层 ○ 使用账户 id 进行分区 ○ 执行账户变动请求 ○ 更新账户余额 分布式账务系统0 码力 | 27 页 | 12.60 MB | 1 年前3
 Real world Rust
- Why and how we use Rust in TiKVSync,那么可以安全的在线程间共享 T ● Rust 的类型推导系统和编译检查跨线程传递和共享的对象 是否满足 Send + Sync TiKV ● 大规模分布式 Key-Value 数据库 ● 支持 ACID 跨行事务支持 ● 支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现0 码力 | 29 页 | 506.53 KB | 1 年前3 Real world Rust
- Why and how we use Rust in TiKVSync,那么可以安全的在线程间共享 T ● Rust 的类型推导系统和编译检查跨线程传递和共享的对象 是否满足 Send + Sync TiKV ● 大规模分布式 Key-Value 数据库 ● 支持 ACID 跨行事务支持 ● 支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现0 码力 | 29 页 | 506.53 KB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0后台(back of house)。前台是招待顾客的地方;这包括接待员为顾客安排座位、服务员接受 点单和付款、调酒师制作饮品的地方。后台则是厨师和烹饪人员在厨房工作、洗碗工清理餐 具,以及经理处理行政事务的区域。 为了以这种方式构建我们的 crate,我们可以将其功能组织到嵌套模块中。通过执行 cargo new restaurant --lib 来创建一个新的名为 restaurant 的库。然后将示例 项。这 是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到定义它们的上下文。继续我 138/562Rust 程序设计语言 简体中文版 们的比喻,把私有性规则想象成餐馆的后台办公室:后台的事务对餐厅顾客来说是不可知的, 但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知 道可以更改内部代码的哪些部分而不会破坏外部代码。不过 对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长 度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的 抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的零成本抽象 (zero-cost abstractions)之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯 特劳斯特卢普(C++ 的设计和实现者)在《Foundations0 码力 | 562 页 | 3.23 MB | 26 天前3 Rust 程序设计语言 简体中文版 1.85.0后台(back of house)。前台是招待顾客的地方;这包括接待员为顾客安排座位、服务员接受 点单和付款、调酒师制作饮品的地方。后台则是厨师和烹饪人员在厨房工作、洗碗工清理餐 具,以及经理处理行政事务的区域。 为了以这种方式构建我们的 crate,我们可以将其功能组织到嵌套模块中。通过执行 cargo new restaurant --lib 来创建一个新的名为 restaurant 的库。然后将示例 项。这 是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到定义它们的上下文。继续我 138/562Rust 程序设计语言 简体中文版 们的比喻,把私有性规则想象成餐馆的后台办公室:后台的事务对餐厅顾客来说是不可知的, 但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知 道可以更改内部代码的哪些部分而不会破坏外部代码。不过 对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长 度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的 抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的零成本抽象 (zero-cost abstractions)之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯 特劳斯特卢普(C++ 的设计和实现者)在《Foundations0 码力 | 562 页 | 3.23 MB | 26 天前3
 Rust HTTP 协议栈在终端通信场景的实践 - 胡凯服务器的程序规模小,因而通信速度很快。 ✓ 灵活:HTTP 支持传输任意类型的数据对象。 ✓ 无连接:HTTP 限制每次连接只处理一个请求,节 省传输时间。(在 HTTP/1.1 之后变更) ✓ 无状态:HTTP 协议对于事务处理没有记忆能力, 每个请求/应答之间相互独立。 Rust China Conf 2022 – 2023, Shanghai, China HTTP 协议介绍 HTTP 协议的版本演化如下:0 码力 | 26 页 | 1.25 MB | 1 年前3 Rust HTTP 协议栈在终端通信场景的实践 - 胡凯服务器的程序规模小,因而通信速度很快。 ✓ 灵活:HTTP 支持传输任意类型的数据对象。 ✓ 无连接:HTTP 限制每次连接只处理一个请求,节 省传输时间。(在 HTTP/1.1 之后变更) ✓ 无状态:HTTP 协议对于事务处理没有记忆能力, 每个请求/应答之间相互独立。 Rust China Conf 2022 – 2023, Shanghai, China HTTP 协议介绍 HTTP 协议的版本演化如下:0 码力 | 26 页 | 1.25 MB | 1 年前3
 Comprehensive Rust(简体中文) 202412目标构建 Rust 代码,该目标会设 置 +Strict-align 以防止编译器生成非对齐访问,因此在本例中应该没有问题,但一般情 况下并不一定如此。 – 如果是在虚拟机中运行该命令,可能会导致缓存一致性问题。问题在于,虚拟机是在禁用缓存 的情况下直接访问内存,而主机具有同一内存的缓存别名。即使主机并没有明确访问该内存, 推测性访问仍然会导致缓存被填充,然后在清除缓存或虚拟机启用缓存时,任何一方对于该内 aarch64-unknown-none 进行构 建,后者会设置+strict-align 以防止编译器生成非对齐访问,因此应该没有问题,但一般 情况下并不一定如此。 – 如果是在虚拟机中运行该命令,可能会导致缓存一致性问题。问题在于,虚拟机是在禁用缓存 的情况下直接访问内存,而主机具有同一内存的缓存别名。即使主机并没有明确访问该内存, 推测性访问仍然会导致缓存被填充,然后任何一方对于该内存进行的更改就会丢失。再次强0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 202412目标构建 Rust 代码,该目标会设 置 +Strict-align 以防止编译器生成非对齐访问,因此在本例中应该没有问题,但一般情 况下并不一定如此。 – 如果是在虚拟机中运行该命令,可能会导致缓存一致性问题。问题在于,虚拟机是在禁用缓存 的情况下直接访问内存,而主机具有同一内存的缓存别名。即使主机并没有明确访问该内存, 推测性访问仍然会导致缓存被填充,然后在清除缓存或虚拟机启用缓存时,任何一方对于该内 aarch64-unknown-none 进行构 建,后者会设置+strict-align 以防止编译器生成非对齐访问,因此应该没有问题,但一般 情况下并不一定如此。 – 如果是在虚拟机中运行该命令,可能会导致缓存一致性问题。问题在于,虚拟机是在禁用缓存 的情况下直接访问内存,而主机具有同一内存的缓存别名。即使主机并没有明确访问该内存, 推测性访问仍然会导致缓存被填充,然后任何一方对于该内存进行的更改就会丢失。再次强0 码力 | 359 页 | 1.33 MB | 10 月前3
 Comprehensive Rust(繁体中文)aarch64-unknown-none 目標建構 Rust 程式碼,這 會設定+strict-align,防止編譯器產生未對齊的存取,因此在本例中應該不會出錯,但這 不一定是一般情況。 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而當快取遭到清理或 VM 啟用快取時,存取之間的變更就會遺失 aarch64-unknown- none,這會設定+strict-align,防止編譯器產生未對齊的存取,因此應該不會出錯,但這 不一定是一般情況。 275 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而存取之間的變更就會遺失。同樣地,這在本例中不成問題0 码力 | 358 页 | 1.41 MB | 10 月前3 Comprehensive Rust(繁体中文)aarch64-unknown-none 目標建構 Rust 程式碼,這 會設定+strict-align,防止編譯器產生未對齊的存取,因此在本例中應該不會出錯,但這 不一定是一般情況。 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而當快取遭到清理或 VM 啟用快取時,存取之間的變更就會遺失 aarch64-unknown- none,這會設定+strict-align,防止編譯器產生未對齊的存取,因此應該不會出錯,但這 不一定是一般情況。 275 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而存取之間的變更就會遺失。同樣地,這在本例中不成問題0 码力 | 358 页 | 1.41 MB | 10 月前3
 Comprehensive Rust(繁体中文) 202406aarch64-unknown-none 目標建構 Rust 程式碼,這 會設定+strict-align,防止編譯器產生未對齊的存取,因此在本例中應該不會出錯,但這 不一定是一般情況。 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而當快取遭到清理或 VM 啟用快取時,存取之間的變更就會遺失 aarch64-unknown- none,這會設定+strict-align,防止編譯器產生未對齊的存取,因此應該不會出錯,但這 不一定是一般情況。 273 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而存取之間的變更就會遺失。同樣地,這在本例中不成問題0 码力 | 356 页 | 1.41 MB | 1 年前3 Comprehensive Rust(繁体中文) 202406aarch64-unknown-none 目標建構 Rust 程式碼,這 會設定+strict-align,防止編譯器產生未對齊的存取,因此在本例中應該不會出錯,但這 不一定是一般情況。 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而當快取遭到清理或 VM 啟用快取時,存取之間的變更就會遺失 aarch64-unknown- none,這會設定+strict-align,防止編譯器產生未對齊的存取,因此應該不會出錯,但這 不一定是一般情況。 273 – 如果是在 VM 中執行,可能會導致快取一致性問題。問題在於 VM 會在快取已停用時直接存 取記憶體,而主機具有相同記憶體的可快取別名。即使主機未明確存取記憶體,推測存取行為 仍可能導致快取填補,而存取之間的變更就會遺失。同樣地,這在本例中不成問題0 码力 | 356 页 | 1.41 MB | 1 年前3
 Rust 语言学习笔记方式达到这个目的。这个机制非常像 其他编程语言中的“读写锁”,即同一时刻,只能拥有一个“写锁”,或只能 拥有多个“读锁”,不允许“写锁”和“读锁”在同一时刻同时出现。当然这 也是数据读写过程中保障一致性的典型做法。只不过 Rust 是在编译中完成这个 (Borrowing)检查的,而不是在运行时,这也就是为什么其他语言程序在运行过 程中,容易出现死锁或者野指针的问题。 通过&符号完成 Borrowing:0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记方式达到这个目的。这个机制非常像 其他编程语言中的“读写锁”,即同一时刻,只能拥有一个“写锁”,或只能 拥有多个“读锁”,不允许“写锁”和“读锁”在同一时刻同时出现。当然这 也是数据读写过程中保障一致性的典型做法。只不过 Rust 是在编译中完成这个 (Borrowing)检查的,而不是在运行时,这也就是为什么其他语言程序在运行过 程中,容易出现死锁或者野指针的问题。 通过&符号完成 Borrowing:0 码力 | 117 页 | 2.24 MB | 1 年前3
 Rust 程序设计语言简体中文版父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这 是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿 餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知 的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知 道可以更改内部代码的哪些部分而不会破坏外部代码。不过 基本思路。 对于一个更全面的性能测试,将会检查不同长度的文本、不同的搜索单词、不同长度的单词和 所有其他的可变情况。这里所要表达的是:迭代器,作为一个高级的抽象,被编译成了与手写 的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象(zero-cost abstractions)之 一,它意味着抽象并不会引入运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现 者)在 “Foundations0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这 是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿 餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知 的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知 道可以更改内部代码的哪些部分而不会破坏外部代码。不过 基本思路。 对于一个更全面的性能测试,将会检查不同长度的文本、不同的搜索单词、不同长度的单词和 所有其他的可变情况。这里所要表达的是:迭代器,作为一个高级的抽象,被编译成了与手写 的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象(zero-cost abstractions)之 一,它意味着抽象并不会引入运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现 者)在 “Foundations0 码力 | 600 页 | 12.99 MB | 1 年前3
共 10 条
- 1













