Open bingoohuang opened 3 years ago
$ 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
}
$ 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
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
图不错,拷贝一下
Hmily 是一款高性能,零侵入,金融级分布式事务解决方案,目前主要提供柔性事务的支持,包含 TCC, TAC(自动生成回滚SQL) 方案,未来还会支持 XA 等方案。
https://dromara.org/zh/projects/hmily/overview/
来自 https://github.com/dromara/hmily
当使用TCC模式的时候,用户根据自身业务需求提供 try, confirm, cancel 等三个方法, 并且 confirm, cancel 方法由自身完成实现,框架只是负责来调用,来达到事务的一致性。
当用户使用TAC模式的时候,用户必须使用关系型数据库来进行业务操作,框架会自动生成回滚SQL, 当业务异常的时候,会执行回滚SQL来达到事务的一致性
Nging支持MySQL和SQLite3数据库
Nging是一个网站服务程序,可以代替Nginx或Apache来搭建Web开发测试环境,并附带了实用的周边工具,例如:计划任务、MySQL管理、Redis管理、FTP管理、SSH管理、服务器管理等。
@bingoohuang 黄老大有生产落地的分布式事务框架不?hmily, seata 这类框架还蛮多的,现在我都是代码里人肉实现补偿、回滚😅😅
Use Binary Encoding Instead of JSON
{
"userName": "Martin",
"favoriteNumber": 1337,
"interests": ["daydreaming", "hacking"]
}
82 bytes
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
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.
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
我在架构设计和代码开发中的一些常用原则