走马观花2021
Opened this issue · 16 comments
不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己应该怎么做。我一生中学到的最重要的东西是一种以原则为基础的生活方式,是它帮助我发现真相是什么,并据此如何行动。
——瑞·达利欧(Ray Dalio)
稀疏文件英文名 sparse file
$ truncate -s 100G test.txt
$ stat test.txt
文件:"test.txt"
大小:107374182400 块:0 IO 块:4096 普通文件
设备:fd02h/64770d Inode:2148513031 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1010/ license) Gid:( 1010/ license)
最近访问:2021-03-24 16:24:29.641180221 +0800
最近更改:2021-03-24 16:24:29.641180221 +0800
最近改动:2021-03-24 16:24:29.641180221 +0800
创建时间:-
$ ls -lh ./test.txt
-rw-rw-r-- 1 license license 100G 3月 24 16:24 ./test.txt
du -sh ./test.txt
0 ./test.txt
$ fallocate -o 0 -l 4096 ./test.txt
$ stat test.txt
文件:"test.txt"
大小:107374182400 块:8 IO 块:4096 普通文件
设备:fd02h/64770d Inode:2148513031 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1010/ license) Gid:( 1010/ license)
最近访问:2021-03-24 16:24:29.641180221 +0800
最近更改:2021-03-24 16:27:05.514505728 +0800
最近改动:2021-03-24 16:27:05.514505728 +0800
创建时间:-
]$ fallocate -p -o 0 -l 4096 ./test.txt
$ stat test.txt
文件:"test.txt"
大小:107374182400 块:0 IO 块:4096 普通文件
设备:fd02h/64770d Inode:2148513031 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1010/ license) Gid:( 1010/ license)
最近访问:2021-03-24 16:24:29.641180221 +0800
最近更改:2021-03-24 16:29:15.567778635 +0800
最近改动:2021-03-24 16:29:15.567778635 +0800
创建时间:-
稀疏语义接口:
-
preallocate(预分配):提供接口可以让用户预占用文件内指定范围的物理空间
-
punch hole(去空洞):提供接口可以让用户释放文件内指定范围的物理空间
-
预分配
fallocate -o 0 -l 4096 test.txt
给 text.txt [0, 4K] 的位置分配好物理空间 -
去空洞
fallocate -p -o 0 -l 4096 test.txt
把 test.txt [0, 4K] 的物理空间释放掉 -
注意:punch hole 的调用要保证 4k 对齐才能释放空间(因为磁盘的物理空间是划分成 4k 的 block)。
// 预分配实现:
func PreAllocate(f *os.File, sizeInBytes int) error {
// use mode = 1 to keep size
// see FALLOC_FL_KEEP_SIZE
return syscall.Fallocate(int(f.Fd()), 0x0, 0, int64(sizeInBytes))
}
// 去空洞实现:
// mode 0 change to size 0x0
// FALLOC_FL_KEEP_SIZE = 0x1
// FALLOC_FL_PUNCH_HOLE = 0x2
func PunchHole(file *os.File, offset int64, size int64) error {
err := syscall.Fallocate(int(file.Fd()), 0x1|0x2, offset, size)
if err == syscall.ENOSYS || err == syscall.EOPNOTSUPP {
return syscall.EPERM
}
return err
}
建一个5M的文本文件
$ head -c 5MB /dev/urandom | base64 > 5m.txt
$ ls -lh 5m.txt
-rw-rw-r-- 1 license license 6.5M 4月 20 15:21 5m.txt
$ du -sh 5m.txt
6.5M 5m.txt
$ head -1 5m.txt
5edINEUWpMO2LRUNDLKg5/jYKOlqHS/xbqrgF/U5GzynpmNj4YJrapZT5IvkZHSRUi7nedVoa80I
$ truncate -s 5M 5m.txt
$ ls -lh 5m.txt
-rw-rw-r-- 1 license license 5.0M 4月 20 15:21 5m.txt
$ du -sh 5m.txt
5.0M 5m.txt
有了这些信息就简单得多了,毕竟作为一名合格的 CCE(Ctrl C + Ctrl V + Engineer) 抄这种操作还是很简单的,直接照猫画虎写一个就行了.
国际惯例先放点图压压惊
我喜欢这个"国际惯例",来源
国际惯例先表明“动机纯正”,然后就可以“名正言顺”了
动机 Motive
我正在开发一些处理大量时间序列数据的工具,例如Ali和Gosivy。特别是阿里,我一直面临着堆消耗随着时间的推移而增加的问题,因为它是一个旨在执行实时分析的负载测试工具。我几乎没有探索过一个提供简单 API 的快速 TSDB 库,但最终找不到,这就是我决定自己编写这个包的原因。
写作是你对自己**的研究和开发。
-- David Perell
Explain to me Go Concurrency Worker Pool Pattern like I’m five
https://itnext.io/explain-to-me-go-concurrency-worker-pool-pattern-like-im-five-e5f1be71e2b0
如何选择不同类型的数据库
https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106
图不错,拷贝一下
ACID 事务
- 原子性:任何更新多行的事务都被视为一个单元。成功的事务执行所有更新。失败的事务不执行任何更新,即数据库保持不变。
- 一致性:每个事务都将数据库从一种有效状态带到另一种有效状态。它保证维护所有数据库不变量和约束。
- 隔离:多个事务的并发执行使数据库处于与事务顺序执行相同的状态。
- 持久性:提交的事务是永久性的,即使系统崩溃也能存活。
NoSQL 数据存储支持 BASE 模型:
- Basic Availability: 基本可用性: Data is replicated on many storage systems and available most of the time. 数据在许多存储系统上复制,并且大部分时间是可用的
- Soft-state: 软状态: Replicas are not consistent all the time; so the state may only be partially correct as it may not yet have converged. 副本并不总是一致的; 因此状态可能只是部分正确,因为它可能还没有聚合
- Eventual consistency: 最终一致性 Data will become consistent at some point in the future, but no guarantee when. 在未来的某个时刻,数据会变得一致,但不能保证什么时候
Hmily
Hmily 是一款高性能,零侵入,金融级分布式事务解决方案,目前主要提供柔性事务的支持,包含 TCC, TAC(自动生成回滚SQL) 方案,未来还会支持 XA 等方案。
https://dromara.org/zh/projects/hmily/overview/
功能
- 高可靠性 :支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂。
- 易用性 :提供零侵入性式的 Spring-Boot, Spring-Namespace 快速与业务系统集成。
- 高性能 :去中心化设计,与业务系统完全融合,天然支持集群部署。
- 可观测性 :Metrics多项指标性能监控,以及admin管理后台UI展示。
- 多种RPC : 支持 Dubbo, SpringCloud,Motan, brpc, tars 等知名RPC框架。
- 日志存储 : 支持 mysql, oracle, mongodb, redis, zookeeper 等方式。
- 复杂场景 : 支持RPC嵌套调用事务。
必要前提
- 必须使用 JDK8+
- TCC模式下,用户必须要使用一款 RPC 框架, 比如 : Dubbo, SpringCloud,Motan
- TAC模式下,用户必须使用关系型数据库, 比如:mysql, oracle, sqlsever
TCC 事务
来自 https://github.com/dromara/hmily
当使用TCC模式的时候,用户根据自身业务需求提供 try, confirm, cancel 等三个方法, 并且 confirm, cancel 方法由自身完成实现,框架只是负责来调用,来达到事务的一致性。
TAC 事务
当用户使用TAC模式的时候,用户必须使用关系型数据库来进行业务操作,框架会自动生成回滚SQL, 当业务异常的时候,会执行回滚SQL来达到事务的一致性
Go语言通用后台管理框架 汇集
https://github.com/admpub/nging
Nging支持MySQL和SQLite3数据库
Nging是一个网站服务程序,可以代替Nginx或Apache来搭建Web开发测试环境,并附带了实用的周边工具,例如:计划任务、MySQL管理、Redis管理、FTP管理、SSH管理、服务器管理等。
@bingoohuang 黄老大有生产落地的分布式事务框架不?hmily, seata 这类框架还蛮多的,现在我都是代码里人肉实现补偿、回滚😅😅
JSON 二进制编码
Use Binary Encoding Instead of JSON
JSON 文本
{
"userName": "Martin",
"favoriteNumber": 1337,
"interests": ["daydreaming", "hacking"]
}
82 bytes
Thrift
struct Person {
1: string userName,
2: optional i64 favouriteNumber,
3: list<string> interests
}
Encoding using Thrift’s binary protocol — Photo from Designing Data-Intensive Applications.
59 bytes
Encoding using Thrift Compact Protocol — Photo from Designing Data-Intensive Applications.
** 34 bytes**
Protocol Buffer
message Person {
required string user_name = 1;
optional int64 favourite_number = 2;
repeated string interests = 3;
}
Encoding using Protocol Buffers — Photo from Designing Data-Intensive Applications.
Avro
record Person {
string userName;
union { null, long } favouriteNumber;
array<string> interests;
}
"type": "record",
"name": "Person",
"fields": [
{"name": "userName", "type": "string"},
{"name": "favouriteNumber", "type": ["null", "long"]},
{"name": "interests", "type": {"type": "array", "items": "string"}}
]
}
Encoding using Avro — Photo from Designing Data-Intensive Applications.
32 bytes
总结
- 82 bytes with JSON encoding
- 33 bytes using Thrift and Protocol Buffers
- 32 bytes using Avro encoding.
- Binary formats offer several compelling advantages over JSON for sending data over the wire between internal services.