bingoohuang / blog

write blogs with issues
MIT License
178 stars 24 forks source link

走马观花2021 #191

Open bingoohuang opened 3 years ago

bingoohuang commented 3 years ago

我在架构设计和代码开发中的一些常用原则

不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己应该怎么做。我一生中学到的最重要的东西是一种以原则为基础的生活方式,是它帮助我发现真相是什么,并据此如何行动。

——瑞·达利欧(Ray Dalio)

bingoohuang commented 3 years ago

稀疏文件英文名 sparse file

深度剖析 Linux cp 的秘密

$ 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
创建时间:-

稀疏语义接口:

  1. preallocate(预分配):提供接口可以让用户预占用文件内指定范围的物理空间

  2. punch hole(去空洞):提供接口可以让用户释放文件内指定范围的物理空间

  3. 预分配 fallocate -o 0 -l 4096 test.txt 给 text.txt [0, 4K] 的位置分配好物理空间

  4. 去空洞 fallocate -p -o 0 -l 4096 test.txt 把 test.txt [0, 4K] 的物理空间释放掉

  5. 注意: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
}
bingoohuang commented 3 years ago

码农眼中面向对象的世界 image

bingoohuang commented 3 years ago

建一个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
bingoohuang commented 3 years ago

有了这些信息就简单得多了,毕竟作为一名合格的 CCE(Ctrl C + Ctrl V + Engineer) 抄这种操作还是很简单的,直接照猫画虎写一个就行了.

来源

bingoohuang commented 3 years ago

国际惯例先放点图压压惊

我喜欢这个"国际惯例",来源

bingoohuang commented 3 years ago

国际惯例先表明“动机纯正”,然后就可以“名正言顺”了

动机 Motive 我正在开发一些处理大量时间序列数据的工具,例如Ali和Gosivy。特别是阿里,我一直面临着堆消耗随着时间的推移而增加的问题,因为它是一个旨在执行实时分析的负载测试工具。我几乎没有探索过一个提供简单 API 的快速 TSDB 库,但最终找不到,这就是我决定自己编写这个包的原因。

来源

bingoohuang commented 3 years ago

写作是你对自己思想的研究和开发。 -- David Perell

来源

bingoohuang commented 3 years ago

Explain to me Go Concurrency Worker Pool Pattern like I’m five

image

https://itnext.io/explain-to-me-go-concurrency-worker-pool-pattern-like-im-five-e5f1be71e2b0

https://github.com/godoylucase/workers-pool

bingoohuang commented 3 years ago

程序员的酒后真言

阮一峰的网络日志 昨天 美国最大的论坛 Reddit,最近有一个热帖翻译版本

一个程序员说自己喝醉了,软件工程师已经当了10年,心里有好多话想说,“我可能会后悔今天说了这些话。

  1. 好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的 CS 专业的新生理解。
  2. 成为一名优秀的工程师意味着了解最佳实践,成为高级工程师意味着知道何时打破最佳实践。
  3. 作为一名工程师,最被低估的技能是记录。说真的,如果有人可以教我怎么写文档,我会付钱,也许是 1000 美元。
bingoohuang commented 3 years ago

如何选择不同类型的数据库

https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106

图不错,拷贝一下

image

image

image

image

ACID 事务

NoSQL 数据存储支持 BASE 模型:

bingoohuang commented 3 years ago

image

虽然没看上FluentMybatis特性,但是这个图,画的挺丰富,以后介绍特性的时候,可以参考

bingoohuang commented 3 years ago

Hmily

Hmily 是一款高性能,零侵入,金融级分布式事务解决方案,目前主要提供柔性事务的支持,包含 TCC, TAC(自动生成回滚SQL) 方案,未来还会支持 XA 等方案。

https://dromara.org/zh/projects/hmily/overview/

image

功能

必要前提

TCC 事务

image

来自 https://github.com/dromara/hmily

当使用TCC模式的时候,用户根据自身业务需求提供 try, confirm, cancel 等三个方法, 并且 confirm, cancel 方法由自身完成实现,框架只是负责来调用,来达到事务的一致性。

TAC 事务

image

当用户使用TAC模式的时候,用户必须使用关系型数据库来进行业务操作,框架会自动生成回滚SQL, 当业务异常的时候,会执行回滚SQL来达到事务的一致性

bingoohuang commented 3 years ago

Go语言通用后台管理框架 汇集

https://github.com/admpub/nging

Nging支持MySQL和SQLite3数据库

Nging是一个网站服务程序,可以代替Nginx或Apache来搭建Web开发测试环境,并附带了实用的周边工具,例如:计划任务、MySQL管理、Redis管理、FTP管理、SSH管理、服务器管理等。

image

Bpazy commented 3 years ago

@bingoohuang 黄老大有生产落地的分布式事务框架不?hmily, seata 这类框架还蛮多的,现在我都是代码里人肉实现补偿、回滚😅😅

bingoohuang commented 3 years ago

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
}

image

Encoding using Thrift’s binary protocol — Photo from Designing Data-Intensive Applications.

59 bytes

image

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;
}

image

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"}}
    ]
}

image

Encoding using Avro — Photo from Designing Data-Intensive Applications.

32 bytes

总结

bingoohuang commented 2 years ago

Principles & Best practices of REST API Design

image