大规模高性能区块链架构设计模式与测试框架-李世敬大规模高性能区块链架构 设计模式与测试框架 Gopher Meetup 深圳站 2021 年 8 ⽉ 21 号 趣�科技 李世敬 目录 区块链概述 01 大规模高性能区块链架构设计介绍 02 基于Go插件的区块链性能测试工具 03 写在最后 04 区块链概述 4 趣链科技 版权所有 ©2016-2021 4 趣链科技 版权所有 ©2016-2021 4 趣链科技 版权所有 ©2016-2021 共识全节点层 Consensus Layer ⾮共识节点层 Provable Layer 轻客户端层 Edge Layer 轻节点层 Gateway Layer 核⼼技术 多类型节点分层部署模式 1 3 动态⾃发现⽹络转发模型 2 ⼤规模组⽹⾼效共识算法 1.提⾼数据处理效率 2.提升终端异构性能⼒ 3.提供实时计算与验证服务 4.解决数据真实性“第⼀公⾥” 问题 ⾯向海量节点⼤规模应⽤场景, 区块数据库 索引数据库 区块链平台底层采用Filelog+IndexDB混合存储模型,以应对当前业务场景对高磁盘I/O频率和吞吐量的高要求。数据随区块 存储在区块链专用存储引擎Filelog,索引数据存储在由多个LevelDB构成的IndexDB中,保证数据读写性能不受存量数据增加 的影响。 混合存储模型 区块链平台关键技术-混合存储模型 23 趣链科技 版权所有 ©2016-2021 23 趣链科技0 码力 | 39 页 | 56.58 MB | 1 年前3
2.2 龚浩华(月牙寂)p2p缓存系统 基于Golang的Aop设计模式LOGO p2p缓存系统 基于Golang的Aop设计模式 龚浩华 QQ 29185807 月牙寂 背景 v Web缓存(类似CDN技术) § 网页、图片 § 普通下载 § 普通视频 v P2P缓存 § 下载(bt等) § 视频(qvod、百度影音等) 背景 v P2P缓存好处 § 一次获取,多次利用 § 减少局域网出网流量 1、针对 缺乏全局状态知识 全局状态是可以获取到的 2、针对 缺乏全局时间 全局时间是一致的 3、非确定 仍然存在不确定性 现实世界的设计模式直接可以拿来借鉴 P2P缓存框架 P2P缓存框架 1、入口监听模块 常驻 功能监听识别连接 2、任务管理模块 常驻 1、全局收集任务,根据任务连接数排名,在 前n的任务给分发下载时间片。 2、任务定时更新自己的时间片 效果 效果 Golang总结 1、全新的设计模式 代码少、逻辑直观简单 2、代码维护简单 松散耦合 3、快速开发 4、性能高 Golang一些经验 1、程序雪崩与GC问题0 码力 | 29 页 | 338.20 KB | 1 年前3
Go 入门指南(The way to Go)和多核应用的基本技巧的讲解(第 14 章)。最后,我们会讨论如何将 Go 语言应用到分布式和 Web 应用 中的相关网络技巧(第 15 章)。 我们会在本书的第四部分向你展示许多 Go 语言的开发模式和一些编码规范,以及一些非常有用的代码片 段(第 18 章)。在前面章节完成对所有的 Go 语言技巧的学习之后,你将会学习如何构造一个完整 Go 语言项目(第 19 章),然后我们会介绍一些关于 下载书中的代码(译者注:所有代码文件已经包括在 GitHub 仓库中), 并获得有关本书的勘误情况和内容更新。 为了让你在成为 Go 语言大师的道路上更加顺利,我们会专注于一些特别的章节以提供 Go 语言开发模式 的最佳实践,同时也会帮助初学者逃离一些语言的陷阱。第 18 章可以作为你在开发时的一个参考手册, 因为当中包含了众多的有价值的代码片段以及相关的解释说明。 最后要说明的是,你可以通过完整的索 看起来并不相同。但是它通过接口 (interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级 之说。因此可以说这是一门混合型的语言。 在传统的面向对象语言中,使用面向对象编程技术显得非常的臃肿,它们总是通过复杂的模式来构建庞大 的类型层级,这违背了编程语言应该提升生产力的宗旨。 函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在第六章,我们会看到 Go0 码力 | 380 页 | 2.97 MB | 1 年前3
Go 入门指南(The way to Go)13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 13.8 测试的具体例子 13.9 用(测试数据)表驱动测试 13.10 性能调试:分析并优化 Go 程序 第 14 14.5 通道、超时和计时器(Ticker) 14.6 协程和恢复(recover) 14.7 新旧模型对比:任务和worker 14.8 惰性生成器的实现 14.9 实现 Futures 模式 第 15 章 网络,模板和网页应用 15.1 tcp服务器 15.2 一个简单的网页服务器 15.3 访问并读取页面 15.4 写一个简单的网页应用 第 16章 常见的陷阱与错误 16 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18.6 函数 18.7 文件 180 码力 | 466 页 | 4.44 MB | 1 年前3
Go Web编程false } if failureY { return false } return true } 如果有很多调用defer,那么defer是采用后进先出模式,所以如下代码会输出4 3 2 1 0 for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } 函数作为值、类型 函数作为值、类型 转换为实际IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作 原理可用下图来表示。 图3.2 DNS工作原理 更详细的DNS解析的过程如下,这个过程有助于我们理解DNS的工作模式 1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果 有,就先调用这个IP地址映射,完成域名解析。 2. 如果hosts里没有 系,则调用这个IP地址 映射,完成域名解析,此解析不具有权威性。 5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行 查询,如果未用转发模式,本地DNS就把请求发至 “根DNS服务器”,“根DNS服务器”收到请求后会判断这 个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息 后,将会联系负责0 码力 | 295 页 | 5.91 MB | 1 年前3
2.2.1 深入Go ModuleGO111MODULE • on或者未设置: 启用module模式,即使go.mod不存在 • off: 禁用module模式,使用GOPATH模式 • auto: go.mod存在或者任意的父目录存在,启用module模式 go-proxy & private modules • 代理所有的module • 混合代理 • 直接访问私有库 • 实践中 创建一个项目0 码力 | 46 页 | 3.85 MB | 1 年前3
如何用GO支撑海外电商的快速发展-吕梦楼02. 架构演变过程 架构演变 03. 单体应用 演变 仅PC站,页面通过服务端渲染 新增M站,核心服务抽离到Core 架构演变 04. 为什么用GO? 架构演变 05. 混合模式 新增GO商城服务,迁移下单流程中的订单结算、收银台等功能 PC和M站相关功能,请求下发到GO商城服务,页面仍通过PHP服务端渲染 架构演变 06. 前后端分离 核心流程全部迁移到GO0 码力 | 33 页 | 3.80 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.alen IntegerType) Pointer。 此函数在一个(非 安全)指针表示的地址上添加一个偏移量,然后返回表示新地址的一个指 针。 此函数以一种更正规的形式部分地覆盖了下面将要介绍的使用模式3 中展示的合法用法。 func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType。 此函数用来从一个任意(安全)指针派生出一个指定长度的切片。 这些转换摧毁了Go的类型系统(不包括非类型安全指针部 分)精心设立的内存安全屏障。 我们必须遵循本文后面要介绍的一些用法指 示来使用非类型安全指针才能写出合法并安全的代码。 我们需要知道的一些事实 在开始介绍合法的非类型安全指针使用模式之前,我们需要知道一些事实。 事实一:非类型安全指针值是指针但uintptr值是整数 每一个非零安全或者不安全指针值均引用着另一个值。但是一个uintptr值并不 引用任何值,它被看作是一个整数,尽管常常它存储的是一个地址的数字表 | pp = (*unsafe.Pointer)(p) 11 | } 如何正确地使用非类型安全指针? unsafe标准库包的文档中列出了六种非类型安全指针的使用模式 ? 。 下面将 对它们逐一进行讲解。 使用模式一:将类型*T1的一个值转换为非类型安全指 针值,然后将此非类型安全指针值转换为类型*T2。 利用前面列出的非类型安全指针相关的转换规则,我们可以将一个*T1值转换 为0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a今后的某个Go版本开始将不再能编译通过,或者运行行为发生了变化。 如果出于种种原因,你确实希望在你的代码中使用非类型安全指针,你不仅需 要提防上述风险,你还需遵守Go官方文档中列出的非类型安全指针使用模式, 并清楚地知晓使用非类型安全指针带来的效果。否则,你很难使用非类型安全 指针写出安全的代码。 关于unsafe标准库包 非类型安全指针在Go中为一种(第14章)特别的类型。 我们必须引入unsafe标 len IntegerType) Pointer。 此函数在一个(非安 全)指针表示的地址上添加一个偏移量,然后返回表示新地址的一个指 针。 此函数以一种更正规的形式部分地覆盖了下面将要介绍的使用模式3 中展示的合法用法。 func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType。 此 函数用来从一个任意(安全)指针派生出一个指定长度的切片。 这些转换摧毁了Go的类型系统(不包括非类型安全指针部分) 精心设立的内存安全屏障。 我们必须遵循本文后面要介绍的一些用法指示来使 用非类型安全指针才能写出合法并安全的代码。 我们需要知道的一些事实 在开始介绍合法的非类型安全指针使用模式之前,我们需要知道一些事实。 事实一:非类型安全指针值是指针但uintptr值是整数 每一个非零安全或者不安全指针值均引用着另一个值。但是一个uintptr值并不 引用任何值,它被看作是一个整数,尽管常常它存储的是一个地址的数字表0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a使用了非类型安全指针的代码可能从今后的某个Go版本开始将不再能编译通过,或 者运行行为发生了变化。 如果出于种种原因,你确实希望在你的代码中使用非类型安全指针,你不仅需要提 防上述风险,你还需遵守Go官方文档中列出的非类型安全指针使用模式,并清楚地 知晓使用非类型安全指针带来的效果。否则,你很难使用非类型安全指针写出安全 的代码。 关于unsafe标准库包 非类型安全指针在Go中为一种(第14章)特别的类型。 我们必须引入unsafe标准 len IntegerType) Pointer。 此函数在一个 (非安全)指针表示的地址上添加一个偏移量,然后返回表示新地址的一个指 针。 此函数以一种更正规的形式部分地覆盖了下面将要介绍的使用模式3中展 示的合法用法。 func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType。 此函数用来从一个任意(安全)指针派生出一个指定长 安全指针部分)精心设立 的内存安全屏障。 我们必须遵循本文后面要介绍的一些用法指示来使用非类型安全 指针才能写出合法并安全的代码。 我们需要知道的一些事实 在开始介绍合法的非类型安全指针使用模式之前,我们需要知道一些事实。 事实一:非类型安全指针值是指针但uintptr值是整数 每一个非零安全或者不安全指针值均引用着另一个值。但是一个uintptr值并不引用 任何值,它被看作是一个整0 码力 | 591 页 | 21.40 MB | 1 年前3
共 44 条
- 1
- 2
- 3
- 4
- 5













