企业web应用技术讨论

基于兴趣和职业发展的考虑,我参加了上次关于“增量配网产品”架构的讨论会议,对公司现有的产品,人员,技术储备有了一定的了解。 会上对未来几年公司使用的技术栈有了指导性的意见,但候选项只有项目中已经使用的几个非常成熟的技术,个人认为欠缺广度和深度。

  • 仅有限的几个同事参与,意味着可能公司有人掌握了某项技术,但没有成为一个候选项。
  • 除了手边会用的工具, 也应该到市面上找更合适的工具。
  • 一定的技术预研和储备是非常必要的

故写了这篇文章,抛出我的观察和思考,然后看看“沉默的大多数"中有没有志同道合的人,可以将一些更先进(合适)的技术引入公司业务, 助力公司发展。

由于我们讨论的是企业web应用,所以需要关心的问题大概有下面几类,我们依次讨论。

web, 即前端

一些传统的企业开发不重视前端,觉得能用就行,分工上也没有专门的前端工程师,而是由后端工程师一把梭。 但前端的工作量并不小,开发维护成本很高,且易用性美观度等也大大影响用户对软件的整体印象。 如果有多端显示,小程序等需求,则难度和成本更是直线上升。

传统的 js 和 jquery 应用缺乏模块管理,依赖管理,组件化支持等关键特性,

为了解决这些问题,前端的生态发展很快,工程化和模块化水平已经不输后端,出现了 angular, reactjs, vue, svelet 等优秀的 mvvm 框架, 以及 typescript 这样的强类型编译语言,解决了前端大代码量下的开发效率问题。

对于需要 seo 的应用, 纯静态页面和后台生成页面还有一定市场,但对于企业开发,mvvm是完美的解决方案, 也就意味着前后端的完全分离, 后端只提供数据,展示和交互逻辑完全由前端负责。下面简单介绍一下几个 mvvm 框架的特点。

相同点

  • 组件化
  • 响应式数据绑定
  • 状态和路由管理

不同点

  • reactjs,facebook 出品,生态丰富,使用 jsx 抽象程度高,学习成本高,大公司使用较多。

  • vue,华人出品,生态较丰富,使用模板抽象程度较高,学习成本低,中小公司和国内使用较多。

  • svelet 较新,基于一种新的思路,即将运行时的问题提前到编译器解决,目前在前后端均出现了这样的案例。优势是没有运行时,代码小,性能高,很适合做组件开发。

应用层,即后端

移动互联网的发展催生了很多高并发和大数据量的业务,也造就了云厂商的繁荣和容器技术的发展,devops 和云原生等技术被提出,用于解决后端日益复杂的开发运维问题。以 k8s 的出现为标志,基本解决了云环境下的cpu,内存,网络,存储这些计算资源管理和分配问题,有人说 k8s 是云环境下的操作系统,所以后端的开发不得不考虑基础设施到底是啥的问题。

CNCF Landscape全景图

  • 底层设施是啥? 是否基于云和第三方平台?是公有云还是私有云,是托管的还是自己部署?有没有使用容器技术,有没有使用 k8s。

  • 数据量和运行性能要求是啥? 用户量是多少?几百几万还是几亿?数据量是多少,日增量是MB,GB,还是TB级别?并发量是多少,高峰, 平均,低谷分别是多少?

  • 单体, 分布式, serverless? 单体应用支持的数据量和运行性能有限,且高峰时扩容,低谷时资源闲置的问题严重。 如果超过单体应用的支撑上限,则分布式应用成为必须选择。微服务架构是最近比较火的一种分布式架构。serverless 则进一步解决了资源利用率等问题,按需自动扩容缩容,让应用开发人员不需要再考虑性能问题和底层基础设施。

开发语言选择

java 是企业web开发领域的王者语言,因为它性能优秀,生态丰富,学习成本较低,开发效率较高,各方面都比较均衡。但云原生环境下,java的一些缺点被放大,使得它在云原生环境下竞争力下降。

  • 基于虚拟机,镜像中必须包含虚拟机,导致镜像动则几百M。
  • 启动和第一次响应时间较长,不适合云环境下容器需频繁创建销毁的场景
  • 内存占用较大
  • 并发开发难度较高

java 社区也出了一些解决方案试图解决这些问题, 如:

  • graalvm, 使用 aot 技术将java编译成机器码
  • quarkus 和 micronuat 等框架,限制使用动态加载, 反射和代理等技术,提高响应速度,降低内存占用。
  • Vert.x 等异步编程技术,解决并发问题

但 java 历史包袱较重,总体还不成熟,或者限制较多,还需努力。

云原生和网络场景下的后端王者语言可能是 go,它完美解决了上述几个 java 存在的问题。下面这些如雷贯耳的应用都是基于 go 的,包括虚拟化,api网关,代理,数据库等各个领域:

docker, k8s, hugo, grafana, tidb, etcd, consul, traefik, ethereum…

而最近几年似乎较少看到 java 产出的杀手级应用。

数据库

这几年数据库的发展很快,国内也是,是三大基础软件数据库, 操作系统, 编译器中可能最先打破国外垄断的。它的发展有两个方向,一是通用数据库,但底层原理和实现不一样了。 而是出现了特定领域的数据库,即特别适合某些特定场景下使用。分别大致介绍一下:

通用数据库

  • oracle ,mysql,PostgreSQL 领先的通用关系型数据库,需要建模,支持事务,统一性和易用性优秀。

  • mongodb,CouchDB, redis nosql,非关系型,非结构化数据的存储,以放宽ACID原则为代价,增加海量数据处理能力。

  • tidb,CockroachDB newsql,新关系型,使用计算存储分离,分布式等新技术来结合SQL和NoSQL中最好的部分,希望将ACID和可扩展性以及高性能结合

专用数据库

  • elasticsearch Elasticsearch 是一个分布式搜索和数据分析引擎, 典型使用场景是搜索,也可用于数字、文本、地理位置、结构化数据、非结构化数据等的存储和查询。

  • clickhouse ClickHouse是近年来备受关注的开源列式数据库,适用于大宽表, 读多写少等,主要用于数据分析(OLAP)领域。

  • TDengine TDengine是一个高效的存储、查询、分析时序大数据的平台,专为物联网、车联网、工业互联网、运维监测等优化而设计。特别适合数据采集场景

值得注意的是,tidb 和 TDengine 都是国产数据库,且在不少领域已经有不少案例。

质量和效率

测试 自动化运维 回归测试

我们的选择

公司发展有基于业务赚钱的,一般是传统垄断行业吧,烟草,电力,石油,金融等。 有基于技术赚钱的,如各种云厂商,中间价厂商,软件厂商等。 或者将两者结合的很好的,比如阿里和腾讯了。

如果要在竞争中取胜,需要在业务和技术两方面努力,技术是为业务服务的,在主流和先进的技术中投资, 能力和效率跟上,质量和成本得到保证,业务才能更好落地,才能产生效益。 综合我司业务和产品,现有人员技术储备,我们可以考虑投资和引入下面这些技术:

  • vue
  • java(quarkus) + go
  • docker + k8s
  • tidb + TDengine + mysql + elasticsearch

打点鸡血

走出舒适圈总是有点不舒服的,上坡路总是更累的。如果有人有“我不会”,“成本接受不了”等顾虑,不妨看看下面这个例子:

PingCAP 成立于 2015 年,一群没用过 rust 这门很新语言的开发者,在短短4年时间内,完成一个2020年11月 D 轮融资 2.7亿美元的产品的故事, 这一数字创下了全球数据库融资新纪录。 其中讲述者提到,在我们的实践经验中,我们的工程师从零开始接触 Rust,到能够高效进行开发的时间大概是 1 个月。

我们为什么要选择小众语言 Rust 来实现 TiKV?

参考