代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

27 | 怎么编写可持续发展的代码?

分析Web页面的动态数据和静态数据
具有规模扩张能力的软件的最佳实践
无状态服务的设计和实现
静态数据的缓存可以提高服务性能
分离无状态数据可以提高规模水平能力和规模垂直扩张能力
无状态数据可以降低规模水平扩张的技术复杂性
用户的状态数据是影响代码水平规模扩张的重要因素
规模水平扩张成本低,适用于高可用性系统
规模垂直扩张成本高,非线性
规模扩张主要有两种方式:规模垂直扩张(scale in/out)和规模水平扩张(scale up/down)
规模扩张能力(Scalability)和功能扩展能力(Extensibility)
增长对软件的要求,就是要有处理越来越多工作和越来越大规模的能力或者潜力
用户规模增长带来的是软件规模增长,运维复杂度增长
辛苦的努力得到回报,产品传播速度远超预期
软件可能比较简单,用户也比较少
成功的大公司,也是从小公司起步的。
怎么编写可持续发展的代码?

该思维导图由 AI 生成,仅供参考

成功的大公司,也是从小公司起步的。刚开始的时候,软件可能比较简单,用户也比较少,一台廉价的服务器,或者一个简单的虚拟机,甚至几个静态的页面就绰绰有余。
很快,辛苦的努力得到回报,产品传播速度远超预期,用户很喜欢公司的产品或者服务,数量大幅增加,需求越来越强劲。这时候也是公司最忙碌的时候,每个人眼里只有两个字:“增长”。用户规模增长随之带来的是软件规模增长,运维复杂度增长。这时候,廉价的服务器满足不了需求了,就需要更多的服务器,甚至是各种用途不一样的服务器,还需要使用更多的带宽、更多的内存、更多的 CPU,甚至更多的硬盘。
跟得上增长的公司,用户会越来越喜欢,就会脱颖而出,每一份辛苦都得到了优厚的回报;跟不上增长的,用户会越来越抱怨,公司会被迅速模仿,然后用户被抢走,公司被迅速甩开,每一份辛苦都成了一声叹息。
增长对软件的要求,就是要有处理越来越多工作和越来越大规模的能力或者潜力。这种能力,通常称之为可伸缩性(Scalability)。
不过,要提醒的是,也有人使用“可扩展性”这个词表示规模的扩张能力。可扩展性这个词汇很多时候也用于表示功能的扩展(Extensibility)。这就容易混淆规模扩展和功能扩展这两个完全不一样的概念。如果有人使用了可扩展性这个概念,要弄清楚指的是规模还是功能。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了编写可持续发展的代码所需考虑的规模扩张能力和状态数据的影响。文章提出了规模垂直扩张和规模水平扩张两种方式,并指出了它们的成本和适用性。状态数据对规模水平扩张的影响很大,有状态数据需要在多个节点间同步,而无状态数据则能顺利进行规模水平扩张。为解决这一问题,文章强调了分离无状态数据和状态数据的重要性,以提高规模扩张能力。此外,文章还讨论了无状态服务的设计原则和最佳实践,以及对Web页面动态数据和静态数据的分析和优化空间。总的来说,本文为读者提供了编写可持续发展代码的思路和方法,以及相关的解决方案和技术。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • hua168
    怎么判断代码是否使用分布式? 1.是不是看企业将来战略要求? 他们一般都会说将来用户量大,但是开发人员就那么几个,是不是一开始就弄分布式,只不过放在一两台服务器上,当用户量增加再慢慢分离? 2.看公司未来3年是否用户量增加到要代码拆分的程度? 如果用到最好前期就开始做吗? 像我们水平扩展,做分布式,前期java web比较多的组合是 nginx+spring Boot+dubbo(spring cloud)+redis+mongoDB/mysql nginx:反代,主要是处理静态,分担tomcat压力,前期和spring Boot1台 spring Boot+dubbo(spring cloud):含tomcat,解决代码水平扩展,前期1台服务器 redis:保存状态数据,一般是session比较多,前期做主从,前期一般2台 mongoDB/mysql:数据库,只在数据,前期一般2台 如果访问量过大: 1. 数据库方面:变成1主多从,如果压力大就分库,再大就分表做sharding 2. 前上面组合中前面添加多一个web代理,如nginx/haproxy, 包含代码的web服务器复制几台现来,再做七层代理,如果一个七层代理不够,前面再加4层LVS 3. redis:做成群集

    作者回复: 谢谢你的分享。这些是很好的经验! 前期要考虑代码对分布式的支持,不一定真要做成分布式的。实际的分布式方案,最终还是取决于代码是什么样的。 比方说我们文章中说到了,分离无状态数据,无状态服务。如果这些做好了,有状态服务可能只是很小的一块内容。这些早点做,可以提高系统的性能,延迟分布式的需求,简化分布式的实施。

    2019-03-07
    8
  • 轻歌赋
    所以一个web程序可以将信息简单分为三类 1. 静态数据,客户端缓存,主要思考方向在如何让客户端更多的缓存,并且服务端能够随时消除缓存 2. 无状态动态数据,可以考虑在单实例做缓存,提高效率,但是需要考虑如何通知清理缓存,怎么样设计缓存可以尽可能细粒度的清理缓存 3. 有状态数据,可以考虑在redis等系统级的缓存处缓存,考虑到系统的扩张,一台缓存可能不够用,需要算法层次考虑分散用户数据,确保一个用户只会进入一部分缓存 对于3,之前看过对于用户的ID进行hash的方式,但是感觉当缓存实例数量变化的时候取模是个问题,请问老师,这点如何在算法上进行设计呢?

    作者回复: 抱歉,我不了解redis。我猜测啊,模的值是不是可以等于缓存机器的数目? 另外,等拿到用户ID的时候,已经进入应用层了,这时候连接可能已经建立,性能的瓶颈可能就是建立连接的前置的分配器。

    2019-03-06
    2
    3
  • hua168
    老师,之后的会介绍一些简单的防攻击之类的吗?我觉得代码写的再好,如果很容易被入侵,那也是等于0,我前公司网站经常时不时被入侵还不知道怎么回事T_T,服务器安全没有什么问题。 防攻击是靠java的安全框架,还是自己手工写的防攻击代码?还是直接加多一层专门用来做防攻击过滤? 起码保证代码是安全的,如果是网络类有专业的防火墙,如DDOS防火墙。

    作者回复: 安全漏洞大部分都是代码引起的,防火墙这些措施很重要,但是只能防范一部分攻击,价值最大的防范,要在代码层解决掉。我们第三部分会重点讲代码安全。

    2019-03-07
    1
  • hua168
    如果分布式前期已确定好(如:SpringBoot+redis+mysql)代码写好之后,如果再加多一些安全过滤来防攻击,是不是在直接在SpringBoot加多一层安全过滤?因为我在网上看到过这么一句话: Any problem in computer science can be solved by anther layer of indirection. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

    作者回复: 接着的问题是,这个中间层会有多复杂呢,值不值得呢? 对于安全来说,中间层解决不了所有问题。很快,我们就进入这个专栏的第三部分了,到时候我们再聊代码安全问题。

    2019-03-07
    1
  • ifelse
    如果你要设计一个具有规模扩张能力的软件架构,分离无状态数据和状态数据,既可以提高规模水平能力,也可以提高规模垂直扩张能力。--记下来
    2022-07-26
  • 夜空中最亮的星
    有启发 有收获
    2019-03-06
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部