看完这个故事,你就知道程序员为什么选公司就要去上升期的

https://www.toutiao.com/i6948390604984402462/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1617943363&app=news_article&utm_source=weixin&utm_medium=toutiao_ios&use_new_style=1&req_id=202104091242420102120380721500ECBC&share_token=895EC6CC-EEE7-4CEC-ACAD-0B4456097A97&group_id=6948390604984402462

人的发展,还是要看时机的。

我不由想起了呆过的一家公司。2年时间,我们的团队,由刚开始的100多人,发展到最后的2000多人,经历了一次次的技术迭代升级。这是一笔宝贵的财富,我的技术水平,也得到了极大的提升。

非常的感谢我们当时的技术总监。如果不是他亲自挂帅,带我们完成了一波波的技术升级,我不会了解到统一、正确的思路,能够节省多少时间。

这一次,我将简单的回忆一下数据治理方面的迭代,希望能从中找到一些共通的东西。

来一波重要的思路总结。

当年,入职第二天,领导给我的第一个任务,就是选一个长远的、能扩展、能维护的数据库。

由于历史的原因,公司的数据库选用了Oracle,但过了几年,噩梦开始了。Oracle极度复杂,在换了几个DBA后,没人敢动这台机器。领导萌生了换Oracle的念头,是因为一次事故。有一次,因为系统断电,Oracle死活启动不起来,给Oracle的技术支持打电话,结果来回推脱,到最后只能花了非常高的价钱,请一些代理机构来解决。大家得出的结论是:Oracle的技术支持并不可靠,还经常发生宰客行为。

核心技术要掌握在自己手里。经过在db-engines进行调研,综合国内的招聘情况,我们最终还是保守地选择了MySQL,而不是性能更高功能更全的Postgresql。

曾经想过全部使用NoSQL,但被领导果断的被判定为无知。虽然现在有各种各样的数据库,比如时序数据库、海量存储、各种NoSQL等,但目前使用最多的,还是RDBMS。在RDBMS方面,在互联网,Oracle的优势,已经完全比不上MySQL了。原因就在于MySQL的技术栈,工具全人才多,而且具有良好的扩展性。如果在一个互联网公司,领导选择采购Oracle,那一般是判定他的脑子被驴踢了,或者采购的脑子被钱砸了。

以前的领导,脑子肯定是被驴踢了。

但选择了MySQL,就要承受MySQL所带来的技术投入。随着系统的变大,这种投入也逐渐膨胀,但总体看来还是好于表面买放心的Oracle。在这期间,我经历了数据清洗、数据迁移、各种分层的数据库模型建设,是一笔非常宝贵的经验。

1. 重构填坑

在接下来很长一段时间里,我们做的工作就是重构、填坑。我知道这很难,很多公司就死在这一环,因为它需要持续的投入。在此期间,如果同时要求功能性建设的话,这个战线就会拉的很长,很少有领导能够撑过这一环。

幸运的是,我们的领导有魄力,能够向长远的目光去看,顶住了短期的无业绩压力,之后的很多改造和扩展顺风顺水,节省了很多人力和财力。但这种未雨绸缪的领导毕竟是少数的,我后面遇到的大多数公司,都是被销售和产品牵着鼻子走,到最后系统越做越烂以至于无法维护。

那对于数据库来说,我都获取了哪些经验呢?

小的系统叠加代码,可能会陷入玩SQL的状态。加功能,堆代码,一行SQL走天下,使用的SQL函数,也是越来越偏门。这个非常有意思,你的sql玩得越6,那么给后人埋的坑,越多。你的一句魔幻SQL,会给后人带来十倍甚至几十倍的重构代价。

这也是为什么不使用Oracle这样一些数据库的原因,因为里面80%的附加功能,基本上是用不到的。即使是MySQL,按照公司的规范,一些官宣的特性,在公司内也是严格禁止的。

因为功能和扩展性,完全是相反的两回事。除非是访问量固定,或者是外包这样的一锤子买卖。

随着业务的发展,系统的性能也发生了瓶颈,报应也如期而至,以前的技巧变成了现在的累赘。很快,以前用Oracle时写的一些代码,开始显现出它的弊端。

  • 各种慢查询层出不穷,查询界面一直转圈
  • 经常就发生全文扫描,DBA疲于奔命,最后撂挑子不干了
  • 想要加缓存,发现无从下手,牵一发动全身
  • 想要分库分表,结果根本找不到能分的维度,只好在一次次的讨论会中灰溜溜地承认现实

很多老板搞不明白。我原本一个好好的系统,为什么用户量才翻了一倍,大部分代码就得重写呢?很多项目经理搞不明白。技术人员在那里优化了好几个月,为什么我的功能体验不升反降呢?

那是因为。你的团队,在相当长的一段时间里,在填坑。

凡是都有规范,都有定律。照顾了工期,质量就要打折,如果加上开发人员并没有长远意识的话,接下来很大的工作,就是填坑。坑填不完,接下来的工作就无法进行。

2. 数据表的类型

首当其冲的,就是数据库表的重构。比如以什么ali规范为标准:一个超过3个表的联合查询业务,大概率是不合理的。这个虽然极端,但却是非常重要的指导意见。

忘掉什么数据库范式,我们将存在两类表:小表和宽表。

我们的改造过程,也是按照这种划分方式进行的。

小表提供了最基本的数据,可能一个简单的KV就完成了。一些联合查询,并不通过SQL进行JOIN查询,因为我们吃过这个东西的亏。

分布式系统的特点,就是消耗时的多次查询,比机器hang在那里更加有生命力。换句话说,程序里循环1000次10毫秒的查询,比单次查询耗费6秒要强的多。松散的结果,不仅在业务上能支持天马行空的自由组合,在扩展性上也更胜一筹。唯一的一个弱点,就是编码的要求高了,代码量多了,不过这也是我们所希望的。

这对一些运行系统来说,是天大的福音。但是问题又来了,统计性的工作又该怎么做?比如报表。

这就是宽表的用途了。宽表通过冗余的方式,提供了某个重要功能常用的分析数据。这种表的字段一般都特别多,在写入时通过拼接获取冗余数据,一般用在读多写少的场景。所以到最后,我们的业务数据,根据查询的维度,写了很多份。不同的团队维护着不同维度的副本,也是团队成员开始爆炸、业务开始飞速发展的开始。

为什么要这么做?主要还是解耦。有时候,我们通过MQ等分发数据;有时候,我们通过Binlog分发数据。同一份数据,因为维度的不同,有着不同的用途,最主要的业务就减少了宕机的风险。

3. 分库分表

理想很美好,但现实很骨感。在我们打算把大表小表方案落实的时候,一件更重要的事渐渐地浮上水面:我们的数据量已经到了一定级别,需要进行分库分表。

这也证明了领导的先见之明,如果采用的是Oracle数据库,我们的IT费用将会因为购入新的数据库实例急剧飙升。纵向扩展Oracle也能暂时的解决问题,但它总有爆发的一天。

分库分表分为纵向拆分和横向拆分。按照业务进行拆分这一块,我们本身就已经做的很好了,倒是单表的上限处理(比如十几亿的订单表),费了我们很大的功夫。

目前行业内的分库分表方案,集中在以代理方式存在的MyCat,还有以驱动形式存在的ShardingJDBC。为了尽量的少引入额外的维护成本,加上它们的效果都差不多,我们最后的评估,采用的就是ShardingJDBC。当然它的弱点也是很明显的:以Java驱动形式存在,不支持异构系统,比如golang开发语言。幸运的是技术爆炸这一块研发部控制的很好,我们的多数系统是Java的。

让人感叹技术统一的好处。永远不要为了尝鲜,引入一些与公司架构不一致的东西,会给所有人带来困扰。

技术组件好选,但等到真正落实下来,却非常的痛。一句原本好好运行的语句,到了分库分表环境下,竟然就不能运行。归根结底还是SQL写得太不规范了,用了一些不标准的东西,比如用了distinct、having、union等。这些在单库表的情况下,运行的很好。但到了分库分表环境下,由于组件的限制,它们通常不能好好工作。

这部分是最耗时的折腾。有些SQL由于改不动了,我们最后几乎把业务重写了一遍,最终使用最简单的CRUD完成了所有的功能。如果想要我再来第二遍的话,我会毫不犹豫地说:No。我会在项目开始设计的时候,就避免这些问题。

4. 数据同步

终于完成了数据库的扩展性,只要硬件够,可以支持到天荒地老了。现在有时间有精力,来看一下数据同步的问题了。

上面我们说了,有一大堆小表和大表,用在不同的场景。这些分库分表的原始表,我们就可以把它当作小表,需要把它同步到其他地方。

不同业务通过共享数据库来共享数据不得不说是个非常蠢的主意。这个时候就需要一些数据同步工具。我们采用了两种同步方式。一种是消息,一种是binlog。

一些有着明显业务属性的信息,我们是通过消息分享的。比如订单,在信息落地到DB后,我们会同时发送一条MQ消息。对订单信息感兴趣的业务方,只需要订阅对应的主题就可以了。当然这里有一个非常大的话题,就是分布式事务(关于这部分,我会在其他文章中分享),来保证消息能够发送成功。

一些有着共通特性的数据,因为技术原因需要扩展成宽表,或者转化为其他维度的查询数据的时候,就可以通过binlog,把数据共享出去。对于MySQL来说,国内的canal组件,能够非常容易地完成这个转变,我们选的就是这门技术。

那什么时候用MQ,什么时候用Binlog呢?MQ的信息流明显是比Binlog清晰的,但它的开发难度大,有更多要考虑的因素。如果非要找个边界的话。我觉得MQ主要用在跨业务方的数据交互上,而Binlog是用在自己业务组内的技术。

为了不对主库造成影响,我们一般会拉出多个从库,甚至是从库的从库。一部分从库参与读写分离的业务,一部分从库,就专门为Canal提供数据。

在我离开这家公司的时候,领导正在带领着兄弟们搞异地机房的数据同步。我知道很多公司可能永远用不上,但没有亲身经历这一块,还是有一点小遗憾的。

5. 数据仓库

数据同步是个非常脏的活,经常因为异常,造成了同步终止,这时候依赖的业务方就会陷入抓狂状态中。更脏的活,还是ETL。非常的佩服做数据清洗的同事们,是他们让专注于业务开发的同学,用着清清爽爽的数据。

就是这样令人啼笑皆非,因为某些需求,我们需要把分库分表完的数据,重新给合起来。比如某些报表业务需要全量的数据。那就需要把所有的数据汇总到一个地方进行查询,比如ElasticSearch、MongoDB等。

数据仓库有很多选择。如果数据量适中,就可以选择ElasticSearch,MongoDB等。如果数据量非常大,那就需要考虑Hbase,Druid等大数据产品。在我们这里,按照功能分了三个层次:

  • RDBMS(MySQL)作为原始的数据存储,提供扁平快的数据通道
  • ElasticSearch作为大型宽表,分布式的类RT的存储。用来存储一些中等规模的数据,并提供一些中延迟的搜索功能,比如商品搜索等
  • Hbase、Druid作为海量的存储系统,存储系统所有的历史记录,并提供离线分析功能

现在的风向,是使用一些分布式的数据库,比如PolarDB、TiDB等,由于它们在接入层采用的是MySQL协议,所以数据迁移起来、代码改起来是相对简单的。我们有部分非核心业务,已经迁入了这种分布式数据库,但是核心数据还是不敢动,需要更多的时间进行验证。

6. 总结

这几年走下来,我觉得最重要的收获,是对于技术的规划性,而不是车到山前必有路的勇往直前。这种工作,需要有能量的人去做。我们的技术总监,对于技术如何迭代,思路是非常清晰的,加上他一直在力推这些事情,就节省了非常多的论证时间和扯皮时间。在后面的从业生涯中,我再也没见过这样的技术总监。

看完这个故事,你就知道程序员为什么选公司就要去上升期的相关推荐

  1. 全国程序员薪酬大曝光!看完我酸了,33% 程序员月薪达到这个标准

    2023年,随着互联网产业的蓬勃发展,程序员作为一个自带"高薪多金"标签的热门群体,被越来越多的人所关注.在过去充满未知的一年中,他们的职场现状发生了一定的改变.那么,程序员岗位的 ...

  2. 全国程序员薪酬大曝光!看完我酸了,33% 程序员月薪达到.....

    2023年,随着互联网产业的蓬勃发展,程序员作为一个自带"高薪多金"标签的热门群体,被越来越多的人所关注. 在过去充满未知的一年中,他们的职场现状发生了一定的改变.那么,程序员岗位 ...

  3. 十大面试难题解惑,看完秒杀一切 HR 面。程序员必读!

    最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余. 小编收集了10个面试官最爱提的问题,虽然题目千变万化,但是万变不离其宗,只要掌握了答题的 ...

  4. 某程序员动了公司祖传代码屎山,半年没改完,惭愧后交辞职报告

    前段时间,有这样的一个话题,非常的火热,那就是关于程序员的,新入职程序员吐槽老员工写的代码就像是"一坨屎"!这样的言论瞬间就引起了程序员们的讨论. 有程序员认为,别看现在像是一坨屎 ...

  5. 必看!前辈们总结出的程序员找工作遇到的坑

    最近不管是裁员潮,还是被炒的火热的 996 有赞事件,感觉大家都不容易,今天给大家推荐的就是程序员找工作黑名单的开源库.(结尾带链接) 程序员给人的印象就是:宅,不爱说话,埋头苦敲.所以,不管什么事件 ...

  6. OSChina 周三乱弹 ——好好的程序员不做,非得去卖内衣

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @达尔文 :还阔以~分享阿细的单曲<知足(粤语版)(Cover 五 ...

  7. 开发Java,市值一度超过两千亿美元,造福无数程序员的Sun公司,也最终“陨落”...

    "那些疯狂到认为自己能够改变世界的人,才是真正能够改变世界的人." 这是乔布斯曾说过的话,也是很多技术大佬都会坚守的信念.最突出的表现则在于他们性格方面足够的特立独行,甚至是有些偏 ...

  8. 程序员在外包公司工作怎么样?

    今天刚刚好是周六,本来是可以好好休息的,计划好要去哪里玩的,但是天有不测风云,突然说银行领导要来检查,今天周末大家必须和平时一样照常上班,天呐!大哭 !也无奈,只能照常上班咯,谁让别人是地主呢?我经常 ...

  9. 初中级前端程序员面试中小型公司会问哪些问题?

    初中级前端程序员面试中小型公司会问哪些问题?不同的公司面试内容也不尽相同,有的面试过程很轻松,有的面试官是个架构师level 挺高不会问八股文,给出了几个现实中的场景,然后转换成代码的逻辑去让实现. ...

最新文章

  1. HarmonyOS Text设置换行
  2. PaddlePaddle 中的若干基础命令中的问题
  3. 世界人口钟实时数据_中美面积人口数据对比,2020年8月,值得了解的细节
  4. 通俗介绍拉普拉斯变换,傅里叶变换和z变换
  5. 什么是Ajax和JSON,它们的优缺点
  6. this指针不全等于对象地址
  7. 鼓励参与计算机考试宣传标语,诚信考试的宣传标语(精选60条)
  8. 叮!您收到一份超值Java基础入门资料! 1
  9. 开发中遇到的bug记录
  10. NET 4.0 System.Threading.Tasks学习笔记
  11. mpp文件转换excel_原来只要按下这个键,Word、PDF、PPT、Excel文件随你互相转换
  12. winform button设计(一)
  13. 【最强宝典】后端面试知识点合集
  14. 拼多多打印订单有哪些软件?哪个软件好用呢?
  15. gtp怎么安装系统_gpt分区怎么重装系统|GPT分区重装系统win10详细步骤
  16. C++ 在程序中设置环境变量
  17. 云计算机基础架构,云计算基础架构的解决方案
  18. 免签微信 HOOK 最新版 7.0.3微信
  19. 圆柱体的投影特点_机械制图常识:圆柱体
  20. 新型的火灾报警系统设有多个设备联动的模式,其能够服务于智能化以及化的火灾报警

热门文章

  1. web前端三大主流框架_web前端三大主流框架
  2. python对csv数据提取某列的某些行_python pandas获取csv指定行 列的操作方法
  3. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
  4. matlab 请验证三角等式,[转载]matlab
  5. python画大对勾_python+selenium个人学习笔记8-获取信息和勾选框
  6. python中的多线程求值串行和并行_python多线程和多进程——python并行编程实验
  7. 用python庆祝生日_奶茶妹妹章泽天欢度27岁生日,甜蜜微笑庆生,美到登热搜第一...
  8. git 撤销merge_相见恨晚的 Git 命令动画演示,一看就懂!
  9. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞
  10. k折交叉验证matlab 流程_第51集 python机器学习:分层K折交叉验证及其他方式