bingoohuang/blog

走马观花2021

Opened this issue · 16 comments

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

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

——瑞·达利欧(Ray Dalio)

稀疏文件英文名 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
}

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

建一个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

来源

程序员的酒后真言

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

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

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

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

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

图不错,拷贝一下

image

image

image

image

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. 在未来的某个时刻,数据会变得一致,但不能保证什么时候

image

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

Hmily

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

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

image

功能

  • 高可靠性 :支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂。
  • 易用性 :提供零侵入性式的 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 事务

image

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

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

TAC 事务

image

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

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

https://github.com/admpub/nging

Nging支持MySQL和SQLite3数据库

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

image

Bpazy commented

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

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

总结

  • 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.