开发运维视角下,影响软件高可扩展性的6个因素( 三 )


用于可扩展软件的NoSQL数据库
NoSQL数据库非常灵活的地方在于我们可以像Redis一样使用NoSQL的内存键值存储 。
使用像Redis这样的内存数据库来提供所有产品详情将大大降低响应时间 。
另一个用途可以是使用Solr或ElasticSearch来实现类似查询“中号阿迪达斯牌红色T恤”这样的快速多条件搜索 , 而不是运行复杂的SQL查询 。 Solr是一个支持事务的NoSQL数据库 , 它有助于提高软件的可扩展性和弹性 。
Redis和Solr/ElasticSearch都需要提前准备一些数据才能正常工作 , 但这肯定比每次客户端请求都要查询关系数据库要好得多 。
对于每个写请求 , 都需要写入关系数据库 。
例如客户的每次购买都必须存储在关系数据库中 , 而在所有浏览场景至少有80-90%流量我们可以使用NoSQL数据库 , 这可以让软件更具可扩展性 。
最终一致性和CAP理论
NoSQL数据库之所以速度快 , 是因为它们采取了最终一致性的折衷方案 。 为更好理解数据存储 , 我非常建议您更新一下CAP理论的相关知识——一致性、可用性和分区容错性 。
在这篇关于高可扩展性的文章中 , 您可以了解到更多关于从100万到1100万用户如何扩展的信息 。 因为NoSQL数据库还可以作为高效缓存工作 , 这就引出我的的下一个关于使用高效缓存来实现软件可扩展性的要点 。
缓存实现软件的可扩展性正如PhilCarlton所说
在计算机科学领域只有两个难题:缓存失效和命名 。
缓存失效也是面临的一个有趣问题 。 您将需要一个大规模的缓存 , 因为没有缓存的普通方式不再可扩展 。 对于优秀的软件可扩展性来说 , 不同层级的缓存起着至关重要的作用 。 以下是您可以利用缓存来实现更可扩展的软件的一些方法 。
Memoization
第一级的缓存可以在代码层面进行 , 其中一个基本方法是Memoization 。
Memoization是其他缓存函数的高阶函数 。 它可以优化一些慢函数 。 它将函数第一次调用后的结果进行缓存 , 在后续调用时只要参数相同就可以直接在缓存中找到结果 。
您可以看一个Node.jsMemoization的例子 , 服务器可以缓存响应1分钟 。 因此在1分钟以内 , 即使数据发生了变化 , 客户端也会得到相同的旧数据 。
https://geshan.com.np/blog/2020/11/nodejs-for-php-developers/#memoization-example
HTTP缓存
另一个级别的缓存可以在HTTP层上完成 。 通过良好的使用HTTPheaders可以按需要将响应缓存一段时间 。 HTTP缓存也可以使用像Cloudflare这样的应用程序来实现 , 通过规则设置使响应缓存数分钟甚至数小时以减少服务器负载 。 这种类型的缓存机制有助于我们获得高水平的软件可扩展性 。
如果您有足够容量可以管理全量HTTP缓存和HTTP加速器 , Varnish是一个很好的选择 。 Varnish声称:
根据您的架构 , 它通常以300-1000倍的速度提高交付 。
目前VarnishDocker映像的下载多达100多万次 , 我认为人们为了获得其无与伦比的软件可扩展性和巨大的HTTP缓存 , 很可能已经在Kubernetes上大量使用了 。
我不确定读副本是不是一种纯粹的数据库缓存机制 。 但是我非常确信 , 从读副本上进行查询能大幅降低对主数据库的压力并有助于提高软件可扩展性 。 当然还有很多在多层应用程序上实现缓存的其他方法 。 在了解软件可扩展性后 , 您很可能根据自己的情况希望添加缓存来提高系统速度 。
4总结软件扩展性是一个困难的问题 , 而运行环境使其变得更加复杂 。
一家中型公司眼中的大规模概念在FAANG公司的眼中可能根本排不上号 。 究竟什么水平才算得上是大规模 , 取决于您的软件系统日常处理的RPM/RPS 。
我没有实际处理过每秒十万或上百万次请求的系统 , 我只听说过那样的规模 。 我实际遇见并处理过的系统有每秒有100到1000次请求 , 即使是这样规模满足软件可扩展性也是非常有趣和富有挑战性的问题 。
原文链接:
InfoQ读者交流群上线啦!各位小伙伴可以扫描下方二维码 , 添加InfoQ小助手 , 回复关键字“进群”申请入群 。 回复“资料” , 获取资料包传送门 , 注册InfoQ网站后 , 可以任意领取一门极客时间课程 , 免费滴!大家可以和InfoQ读者一起畅所欲言 , 和编辑们零距离接触 , 超值的技术礼包等你领取 , 还有超值活动等你参加 , 快来加入我们吧!
点个在看少个bug