大量报表的生成优化办法

前言

一个页面,加载耗时1.3分钟,分析后发现用的O/RM,我记得12306以前爆是因为用的hibernate,而且没用好。

O/RM有各种硬伤,但总是有优化办法。我改进后测试1秒。

痛点

澳大利亚很多政府/企业财年结束(6月30日)便需要进行一些年度操作,譬如给客户发送年度报告等等。

澳大利亚最大的养老金管理也不例外,需要给数百万用户发送一个流水账单(PDF文件格式),根据多年来的观察和官方的说明,一般需要等到9月底到10月初,这意味着需要起码2个月来处理。

分析

简单计算,意味着顺序处理的话,大概每秒完成一个客户,听起来不算慢。

大家会觉得,一年的流水,多则几百条记录,取出来0.4秒,生成PDF是0.5秒,发送0.1秒,那相当合理。

在这个系列操作中,单个业务的瓶颈可能是:

  • 数据获取/计算
  • PDF生成
  • Email发送

优化

最佳的优化,彻底理解业务逻辑后作出相应的改动。在没有理解业务逻辑之前,我们一般提供效率的做法可能有:

  • 分而治之:多个服务器并行操作,每个负责某个用户组,譬如如果有10台机器,那机器1可以处理10%,如此
  • 队列异步:数据获取/计算、生成PDF和Email都分开队列,异步处理,这样每一步的操作不会因为其中一部堵塞后续的操作
  • 内存操作:PDF生成无需写入磁盘再作为附件发送出去
  • 外部资源:邮件发送可以使用第三方的支持异步的服务,譬如Sendgrid,除了独特的功能之外,我们需要的是无阻塞的异步高性能操作

关于数据获取/计算,如果要做优化,可以在设计上做一些改动,譬如加入每月统计,这样到财年末的时候只需要统计过去12个月的月统计便可。而且这些流水如账本那样,只会append only,不会对现有记录进行改动,所以无需考虑重新统计。

另外,单数据库会是性能(还有安全)瓶颈,完全可以把流水/统计数据放到多节点NoSQL里面,取的时候性能优于关系型数据库。

 

当然,还有一些更高级、复杂的优化实践,有兴趣的同学们可以根据右边二维码加我的微信。

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈之旅:软件开发人员的分级、职业发展路径等

疑惑

受微软(亚洲)首席研发经理邹欣老师的邀请,为其《构建之法》的学员作业提供一个个人见解,某学员在作业中提出了几个问题:

  • 国内目前对初、中、高级工程师的评价是否有严格标准?比如个人代码行数?代码质量?
  • 关于五个职业态度:临时性的寄托或者工作===>工作===>职业===>投身的事业===>理想的呼唤,
    • (1)五个职业态度的等级是渐进的嘛?是否可以跨越式提升?比如从第三阶段直接跨度到第五阶段?
    • (2)第三阶段即“职业”阶段,所描述的“职业道德”具体指什么?去年著名的阿里用脚本抢月饼时事件中当事人的行为算不算违反了职业道德?

我在这里尝试一下提出我的一点见解。

职业生涯

路径

一般的技术生涯的路径是:

  • 开发人员:初级程序员、中级程序员、高级程序员、小头目(Team Lead/Tech Lead)、首席开发人员(Principle Developer)
  • 架构师:应用架构师(Application Architect),系统架构师(System Architect),企业架构师(Enterprise Architect – EA)
  • 技术管理:研发经理、高级研发经理、技术副总(VPE)、CTO

这些我都在《爆栈之旅》课程里深入讨论过差异、需要多长时间、需要什么才可以逐步升级。

初级程序员

在大学学习的知识,和社会上实际需要的技能,是有一个差距的。所以初出茅庐的开发人员,一般需要恶补一些实战的技巧、知识,譬如去自行修炼、请教高手,或者参加培训班。

我从业10多年,从业初期是互联网刚起步的阶段,身边一些刚毕业的朋友,会参加那种用目前眼光来看是属于“野鸡”的培训班,这些培训班质量参差,其中不乏各种刻板的、一刀切、让学员造假、”浅入没出”的培训老师。

刚出道的开发人员,不管从哪个途径进入市场,开始的2-3年,都会被称为初级开发人员,职称一般不看代码量。关于代码量,有个段子,就是有开发人员,从网上克隆了著名开源项目的整个源代码,然后签入,他的代码量就是过百万了。

这个阶段的程序员应该像海绵那样吸收新知识,到了2-3年后,能单独维护一个模块。

中级程序员

一般要求4-6年经验,这些同学应该可以独当一面,负责设计、开发某个模块。

高级程序员

需要7-9年经验,他们可以设计和开发某个程序,系统里面的大模块、基础架构等。

小头目

9-11年,负责团队的建设、交付和代码质量管理等等,

首席研发人员

12+年,是某个团队最核心的开发人员,遇到技术问题,最后都会找这个人来解决。

具体的分类和路线,可以参考我写的:《爆栈思想 – 究竟怎样才能技术专家》。

态度的转变

我高考报志愿的时候,一些同学报计算机专业,纯粹是因为这个专业开始热,赚钱。所以,一些同学对其的态度,在开始时候,把它作为纯粹的混口饭吃的工具,是可以理解的。

但是,你思考一下:白天绝大部分的时间,你不是在上班,就是在上下班的路上,如果你不喜欢这份工作,you are f***ed!更糟糕的是,国内一些公司还搞996,你周末的时间都被占用了,那多么悲惨啊!

做一行,爱一行。到了老的时候,你回头一看,这辈子,奉献给了不喜欢的事业,那是多悲伤的事情。

软件开发是创造性的工作,需要专注和创意,如果不喜欢,那真的很难会有成就。所以,当你把这份工作当成事业来经营,那会是一个很大的改变:你会热衷于起早摸黑,孜孜不倦地钻研,为了一个解决不了问题/实现不了的功能而不能入眠。

一些不甘于做老油条,推崇“如果人没有梦想,那和咸鱼有什么区别”的同学,可能在某个阶段,为自己干活,创业去了。但是,这就像投资,风险更高。

当然,一些觉悟比较高、能力比较出众的同学,在职业的初期,便下海去了。所以,职业的路线,还是因人而异,没有所谓的“最短路径”,这可不是让你写Dijkstra算法。

更多的职业/职场心得,可以参考我写的:

 

对于有志于参与软件开发事业的同学能从我写的文章中获益,我深感欣慰。我特意写这篇文章,希望能给你们一点火花,激化出更多的学习动力。

其实软件开发这个生涯,是修炼,也是享受,苦与乐同在,失败与成功并存,坚持不懈,继续前行。

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈心得 – .NET源代码的高效使用方法

盘古初开

.NET刚推出的时候,微软自带ildasm等工具,但是功能非常单一,譬如只能看一个文件的中间语言(IL)。

.NET从第一版本开始变将其标准化,开源了核心框架。

商业化

后来市面上出现了一些反编译工具,譬如ILSpy、Reflector(后来商业化)、DotPeek、Just Decompile等工具,都能很好地查看各种未被混淆的程序集的源代码,譬如能在类里面进行关联跳转等。

彻底开源

几年前,微软把.NET生态链开源(框架、基础类库、编译等),托管在GitHub。你可以使用GitHub搜索、查看源代码,但是没有Visual Studio里面那样方便。

更用户友好的查看方法

微软把基础类库的源代码放在自家的Reference Source网站了,你可以使用它来快速查看、跳转。

 

 

爆栈思想 – 怎么样才算是某个领域的专家

我们发现,很多简历充斥着各种“精通”,尽管刚毕业不久,没有多少实际项目经验。

 

究竟怎么样才算是某个领域的专家呢?

 

应该分几方面看:
  • 技术深度
  • 影响力
  • 对社区的反哺/贡献
譬如数据库存储这块,拿SQL Server做例子,应该掌握以下技术的原理、解决办法和最佳实践:
  • 数据类型/对象
    • 各种数据类型的转换优先级、差异
      • 看似简单,举2个例子:
        • SELECT 1 + ‘+’ + 1
        • 4种不同的临时表/表类型差异和最佳实践
  • 访问
    • 各种DDL/DML/DCL/TCL的最佳实践
  • 内核机制
    • 调度器
    • 各种hint
      • 升级、优先级和差异
      • 堵塞
      • 死锁
    • 等待/延迟
    • IO Stall
    • 进程/请求/任务/连接
    • 缓存/缓冲
  • 最大限制与版本差异
    • 各种级别/方面的最大/最小限制
    • 不同版本的差异
    • 不同版本的新特性、失效特性
  • 深入排错
    • 错误的级别和哪些会在客户端触发
    • 排错的多种方式
  • 调优
    • 表、列设计的最佳实践
    • 索引、扫描、各种Lookup、Bookmark
      • 各种类型的索引的差异
      • 性能相差数万倍的设计
      • 索引管理最佳实践
    • 执行计划
      • 如何找到性能瓶颈
      • 编译、损坏与修复
      • 如何强制刷新(多种方法和副作用)
    • 不同方法的性能巨大差异
      • 譬如COALESCE vs FOR XML vs STRING_AGG
    • 利用多核的最佳实践
    • 数据库/日志文件切分、存储的最佳实践
    • 数据库/日志备份/恢复的最佳实践
    • 内存调度最佳实践
    • 内联
    • 各种trace flags
  • 海量数据处理
    • 高效分库分表
      • 各种切分的优缺点
    • 如何实现大量数据的导入和导出
  • 安全和访问控制
    • 如何实现实例、数据库、表、行、列多级访问控制
    • 如何防止注入和入侵
    • 跨库访问的最佳实践
  • 审计和记录
    • 审计的最佳实践
    • 如何高效实现修改操作记录
  • 容灾、高可用最佳实践
    • AlwaysOn / HAG
    • 如何fail over
    • 备份的多种方式、差异和最佳实践
  • 扩展
    • SQL CLR
  • 管理/自动化
    • 任务
    • DMV
    • DBCC
  • BI
    • SSIS
    • SSAS
    • SSRS
如果详细写下来,这会是一本《SQL Server专家》。

 

关于影响力、对社区的反哺和贡献,这主要是看是否参与社区的讨论/问题解决、代码贡献等。

 

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈代码方案 – 如何实现快速文件比较和去重

现有方案

我们判断文件是否重复,一般是给两个需要比较的文件进行哈希,然后比较哈希值。

这个做法有个问题,就是比较慢:

  • 如果文件大小不一样,那还需要比较吗?
  • 如果文件的一部分不一样,那还需要比较吗?

新的方案

步骤如下:

  1. 把文件列表按文件大小分组,大小不一的文件会被认为不一样,尽管有可能差异只是空格或者空行(回车换行)
  2. 快速比较文件头、尾、中间的三个部分可定义的一定数量的内容,如果不一样,则会视为不是一样的文件
  3. 渐进式比较区块,任何一个区块的哈希值不一样,则文件为不一样

事实上,BT等下载引擎也是用了类似的办法。

方案特色

  • 支持并行计算,使用MapReduce方式,分而治之,加快比较速度
  • 支持保留比较结果,以备以后和别的文件比较,而且这个比较逻辑和批量比较是一致的

项目开源,地址在这里

 

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈思想 – 怎么样的开发人员才是合格的?

基本要求

地铁上,一个妈妈用手遮着孩子的鞋子,为了不弄脏旁边乘客的衣服。评论者说:“这不是很基本要求的吗?”

是的,这位同学说得没错。但是,究竟做这个的是多数还是少数呢?

很多时候,我们想当然地以为,一些基本的东西,实际上我们都没有做到:

  • 譬如不随地吐痰扔垃圾
  • 譬如给老幼病残孕妇让座
  • 不在公共场合大声喧哗
  • 不要在社交媒体做没脑的喷子
  • 不要为了蝇头小利出卖自己的人性,譬如做5毛

素质与底线

很多时候,我们可以简单粗暴地归纳,上述那些人没素质。同理,很多开发人员并没有基本的素质:

  • 不管代码质量,填满工作时间便可,善于挖坑,“我离职后,哪管洪水滔天!”
  • 懒散,故意拖进度
  • 老油条,得过且过
  • 拿网上有版权等代码据为己有

更有甚者,在犯罪:

  • 大学毕业后第一份工作,一个离职员工,把硬盘格式化,还破坏分区
  • 还是第一份工作,部门经理偷公司的源代码去卖

不奢求每个开发人员都写高质量代码,但是起码的是,代码能被维护,程序跑起来不会随意崩溃,用户体验不会顿卡,等等。

父母从小教导我们,不属于自己的东西不要去贪图,这个包括各种手段,譬如偷、抢等。邀功、推塞责任等都是罪恶。

八荣八耻

  • 以踏实编码为荣 以心浮气躁为耻
  • 以详细注释为荣 以注释残缺为耻
  • 以勤于测试为荣 以懒于测试为耻
  • 以简明文档为荣 以冗余文档为耻
  • 以注重团队为荣 以孤傲自大为耻
  • 以刻苦钻研为荣 以敷衍了事为耻
  • 以善于总结为荣 以不思进取为耻
  • 以质效并进为荣 以单取其一为耻

来自这里

 

  • 以动手实践为荣,以只看不练为耻。
  • 以打印日志为荣,以出错不报为耻。
  • 以局部变量为荣,以全局变量为耻。
  • 以单元测试为荣,以手工测试为耻。
  • 以代码重用为荣,以复制粘贴为耻。
  • 以多态应用为荣,以分支判断为耻。
  • 以定义常量为荣,以魔法数字为耻。
  • 以总结思考为荣,以不求甚解为耻

来自这里

欲望与追求

合格的开发人员,应该有自我提升的想法并且付诸行动,譬如下班后去学习一下新技术,在工作中,遇到不满的代码会尝试改进。人如果没有梦想,那和咸鱼有什么区别?

懂的交流

码农不应该是那种刻板的书呆子不善于交流的形象。技能分两种,软技能和硬技能,前者如人际交流、情感控制等,后者如对某种特定技术的掌握等。

人是群体动物,软件开发是团队协作,一个人难以完成一个系统,所以基本交流技巧必须掌握。

不管产品经理如何虐你千百遍,你还是得待他们如初恋,尽管一般都有比较苦涩的结局。

 

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈思想 – 数据库“状态”字段如何设计

前言

之前在文章《学员问答精选 – 1 – 数据库表拆分》中提及过一个数据库的设计问题。今天,微博上的@火丁日记 说:

表里有一个 status 字段,用来表示数据的状态,比如订单的已付款,已关闭等。以前我习惯把它定义为 INT 类型,但是慢慢的,我就记不清楚 1,2,3 到底指的是什么意思了,也想过用 ENUM 类型,但是不方便扩展,最后,我觉得直接用 VARCHAR 类型算了,去它的三范式。

百家争鸣

  • 一些网友赞同使用varchar
  • 一些还是觉得应该enum
  • 一些觉得最原始的int是最好的
  • 一些觉得要用字典表

各种考量

其实,一个字段类型的考量,主要包括:

  • 准确性/精确性:必须能满足业务需求,不能丢数据,溢出等
  • 性能:一般来说,int的运算比varchar要快
  • 空间:尽可能占用最少的空间,一条记录浪费1字节,10亿记录就浪费1GB空间了
  • 辅助性:譬如方便功能上的排序、方便开发人员记忆等

如果要为开发人员着想:

  • 数据库里,表的字段可以添加描述,譬如0: Pending, 1. Paid, 2: Processing, 3: Delivered, 4: Cancelled
  • 如果不满足,那可以用char(1),26个字符足够表达各种状态了吧?不够就char(2),再不行就char(3),主要是省空间。为什么不用varchar(n)而用char(固定数值)?因为varchar(n)要运算做各种trimming,起码在SQL Server里,譬如len()就是后面空格去掉后的长度,和datalength()不一样。这个一般是单词的首字母,记起来比int舒服些。我发现一些公司就是这样做的。

如果要追求节省空间,完全可以用tinyint甚至varbinary,毕竟1个字节有8位,一般订单也就那么几个状态吧?

首先,如果用varchar,那么要考虑:

  • 你这个状态的值,是放英文还是中文?你的产品是否全球化的?
  • 如果是放英文,那你还是需要本地化。
  • 而且,既然要本地化,就没必要放完整的单词,char(1)便可,原因参考上面。

如果使用int,那么要考虑:界面文本显示,开发人员友好。

如果要考虑界面显示如排序等,一般来说,界面需要先根据条件过滤出来某种状态,但是,如果你的业务逻辑就是要同时显示多种状态的数据,这要考虑目标数据只是已经在界面的,还是在数据库的:

  • 界面:那数据库的类型还是最精简的varbinary(1),在界面对值进行解释然后根据解释出来的规则进行排序

当然,有些业务系统会使用字典表,相当于外键,如果返回结果的时候就join,这里会比case xx when 1 then ‘某状态’ 的效率要差些,而且字典表还是需要做语言本地化的。

总结

其实,不管用哪种方案,都没有完美的,还是应该具体业务需求来。

 

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈思想 – 时间都去哪里了?怎么高效使用时间?

苦恼

我的一个学员问我:“我已经入职了,有点苦恼,感觉现在一天没什么时间是自己的,不过公司这边就有安排导师就是带着我,现在在慢慢地熟悉一些东西。我现在还好,没负责什么项目,所以一天还有一些时间可以自己学习一下,可是看周围的人都感觉好忙,可能就没剩什么时间了,老师,您是怎么解决这个问题的?”

存在即合理

周围的人很忙没有时间剩下来?这不是正常吗?老板给钱你来上班就是努力干活啊,哪里有所谓的”me time”。

所以一般人想学新的东西,除非公司上新项目/改造系统,否则只能自己回家慢慢学,譬如跟我学 😉

专注

工作中,多样事情同时发生,譬如你写代码的时候,刚来公司的新人张三来请教你,可能还没有回答完,隔壁老王又来找你讨论产品的修改。

我们做个小游戏:你同时把左手放胸口搓圆型,和右手拍打脑袋,有点别扭,是吧?

同理,很可惜,很少人能同时应付多个任务,毕竟,你不是多核CPU可以并行计算,你顶多可以并发处理,就是跟CPU那样不断做context switch,在不同的项目中来回切换。

但是,这个的效果其实并不好,因为思路很容易打断,而且继续做的时候要思考一下之前做到哪里,接下来怎么做。

如果是你想合理控制时间,你需要把时间集中起来,某个时间段内任何其它东西都不做,只专注一样东西,这样更容易有实际的产出,譬如每天安排:

  • 上班中,多个30分钟,都只做一样事情
  • 下班后,30分钟看看新闻
  • 下班后,30分钟研究你的领域里的新技术
  • 下班后,30分钟做一下你的个人爱好
  • 下班后,30分钟刷一下社交媒体跟进一下好友动态

站在巨人的肩膀上

经过研究后还是不懂就马上问,别浪费时间,合理搜索正确答案和利用第三方解决方案。不要钻牛角尖,掉坑里爬出来可能是几天甚至几周之后的事情。

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈思想 – .NET/C# 能力和使用范围

有同学质疑C#的能力和使用范围,我说,C#可以在多个平台跑,包括移动设备(通过Xamarin写iOS/Android)、嵌入式,智能设备、电视、冰箱(如三星Tizen)等。

还有同学说质疑:“说C#能写驱动吗?” 我说:“C#还可以写操作系统 ” (atomixos  和 cosmos)。然后这位同学说:“那java呢,不就更应该建议采用java了”

其实,这种争论,犹如:“飞机可以到处飞,为什么要汽车?” 般没有意义。

你要去探望在小溪的对面的邻居,你会走桥、坐船、开汽车、坐飞机还是乘宇宙飞船过去呢?拿一种技术不擅长或者不能做的事情说事,没有意思。

不同的场景用不同的技术。按照那种“那为什么建议采用xxx技术”的观点,那其它语言都没有存在的价值了,因为每种语言都有优缺点。

而且,我喜欢C#为什么就不能推荐/支持C#了?

我觉得很多技术人对.NET/C#有相当多的偏见,而且这种偏见还是刻舟求剑式的,他们不知道.NET生态开源了,不知道现在C#在多个测试中的性能比Java还好。

微软出的开源的Visual Studio Code,越来越多的在Mac/Linux上做开发的同学用这个了,最近参加几个meetup,做aws/nodejs等等,都用这个演示。

这种偏见,一部分来自对微软的不喜甚至憎恨,譬如最近微软收购了GitHub,有一些用户就马上迁移到GitLab,尽管之前GitLab丢过客户数据。

 

最近,我花了些时间,写了2万多字的《.NET前世、今生和将来》,全面讲解.NET生态圈的历史、作用和潜力,晚点发布。

 

 

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈思想 – 数据库技术的革新

前言

数据库是大中小型系统的基石,所有操作,最终都需要和数据打交道,一切来源自数据,一切回归数据。

传统的非关系型数据存储

XML、JSON、CSV等文件,没有关系约束。

关系型数据库系统RDBMS

传统关系型数据库系统很难横向扩展(scale-out),很多时候我们都是仔细设计怎么对数据进行分库分片,可能垂直拆分(业务给表分块),也可能是水平拆分(表按时间、地区、自增ID等切分),还可能混合拆分。

传统关系型数据库因为追求强一致性,所以一般高可用性是通过各种形式的日志备份(log backup/log shipping等)。

分布式

当单机无法支撑业务的时候,我们可能会优先考虑升级硬件(scale-up),但单机迟早有物理限制(譬如有些机器最多支持1TB的内存),这种情况下,我们会实现分布式,所谓的scale-out。

但是,根据CAP理论,一般分布式系统做不到C(强一致性),所以他们会实现2PC(Two Phase Commit,二阶段提交)。

NoSQL

NoSQL天生支持分布式、多节点、高可用性,高性能是他们的卖点,但他们一般只强调A(高可用性)和P(分区容错),而做不到或者很基础的支持C。

MongoDB

MongoDB是NoSQL界的旗帜,他们无孔不入的宣传手段让这个问题诸多的解决方案成为很多公司的首选。

坑这么多的 MongoDB 到底是怎么做起来的?其背后的公司运作得不错:在各地区搞了用户组,给组长资金支持,组长办线下活动、找“专家”开讲座/写博客违心地夸奖 MongoDB,文章在这里《MongoDB 背后的营销策略》。

NewSQL

而如MongoDB之类的NoSQL虽然天生支持scale-out,但无法解决CAP定理指出的问题: 一致性、可用性、分区容错三者不可兼得

所以NewSQL的出现尝试解决这个问题,他们的目标是拥有NoSQL的高可用性和分区容错,还拥有传统关系型数据库系统的强一致性。

CockcroachDB

CockcroachDB是相对成熟的新型分布式数据库系统,底层基于PostgreSQL,所以支持传统的SQL查询,做得相当智能,可以自动根据数据的访问频率来把热点数据推送到最近的节点。

特点:是CP非A(强一致性和分区容错),兼容PostgreSQL。

官网在这里,开源。

Fauna

Twitter一些工程师离职后搞的数据库系统,高可用性、高性能、分布式、支持最严格的ACID。这篇文章拿MongoDB 4.x支持ACID来比较,实际上MongoDB并不支持强ACID,而且只有他们收购的WiredTiger引擎才支持,而且只支持本地节点而已。

官网在这里

ActorDB

分布式数据库,特别适合作为手机App的服务器端存储,开源项目

比较

其实,大部分的观点是,NoSQL比传统关系型数据库快,这个定义必须明确一下:

  • NoSQL的存取是读写一个文本(主要是JSON/B SON格式),一般没有外键约束等检查,没有关联查询,所以简单粗暴的操作是来得快
  • 关系型数据库系统,一般的读写要做以下操作
      • 规范化:一条记录根据业务关系拆分别存储到不同的表
      • 外键约束
      • 更新索引
      • 关联表

所以你看见,关系型数据库系统,需要额外的操作,自然会“慢”。但是,说传统关系型数据库就是慢的同学,估计没有用Bulk Copy。

应用场景

你要去探望在小溪的对面的邻居,你会走桥、坐船、开汽车、坐飞机还是乘宇宙飞船过去呢?

同理,不同的场景用不同的数据库系统。

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。