明明是工作经验越久越吃香
|
张大胖:大师,我发现我一直是站在巅峰啊! 大师:这有什么好得瑟的,你站得越高,越容易出现难以解决的抽象泄露的问题。 张大胖:抽象的泄露? 大师:对, 这是Stack Overflow的创始人Joel Spolsky提出来的一个理论:所有重大的抽象机制在某种程度上都是有泄露的! 张大胖: 不对吧! 这种分层的抽象,好处不就是每一层都可以屏蔽下层的变化嘛,我站在高层编程,根本不用理会底层, 为什么会泄露? 大师:我来给你举几个例子,你就明白了。外国有个程序员,她使用Ruby语言通过HTTP向本地的一个消息队列发送消息, 这抽象层次很高吧! 但是每次发送消息都得耗费40ms,这是不应该的, 时间太长了。 她查来查去,发现Ruby的类库没有设置TCP_NODELAY, 但是本地的HAProxy却使用了TCP delayed acknowledgement,于是双方互相等待,出现了延时。 张大胖:我听不懂! 大师:你站在抽象的巅峰,这些TCP的细节怎么能听懂呢?我给你举个简单例子吧, 比如你用了Hibernate这个ORM工具,它是一个抽象层,隐藏了SQL, 但是当出现Hibernate性能问题的时候,你怎么办? 张大胖:那我得去看Hibernate 是怎么把对象变成SQL语句的,然后慢慢调优。 大师:对啊,你看Hibernate这个抽象层没法完美地隐藏底层的信息,发生泄露了。 SQL 也是个抽象层,隐藏了读数据库表查询处理的细节,如果SQL语句出现性能问题,你怎么办? 张大胖:那...... 我只好去分析SQL的查询计划,如何利用索引,还得慢慢调优。 大师:你看SQL这个看似完美的抽象层也泄露了不是? 张大胖:有道理,哎呀,这抽象层泄露的代价很高啊,我得学习这么多底层的东西。 大师:所以Joel Spolsky说“抽象只能节省你的工作时间,不能节省你的学习时间”, 用高层的抽象来工作,会比较快,但是你还得学习底层的东西,那是跑不掉的。
张大胖:明白明白了,为了能继续好好地搬砖,我得赶紧去学学计算机的底层基础知识了。 总结看完上面常见的中间件/组件的持久化方式,应该就不用我多说了吧?思想几乎都是一样的,只是他们记录“log”的名字不一样而已。 先写buffer,然后顺序IO写Log。防止buffer的数据还没刷到磁盘,宕机导致数据丢失。 对于Log文件,中间件也不会放任它们一直膨胀,导致体积很大: 在Redis里边,会对AOF文件进行重写 在HDFS里边,editlog会定时生成fsimage
在Elasticsearch里边,translog会根据阈值触发commit操作 HBase HBase是一个能存储海量数据的数据库。 HBase在写数据的时候,会先写到Mem Store,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。
我们写数据的时候是先写到内存的,为了防止机器宕机,内存的数据没刷到磁盘中就挂了。我们在写Mem store的时候还会写一份HLog (编辑:漯河站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
