架构设计
2020-05-14 本文已影响0人
John13
常见优化技术
Cache:缓存,万金油,哪里不行优先考虑
Queue:消息队列,常见使用Linkedin的kafka
Asynchronized:批处理+异步,减少系统IO瓶颈
Load Balance: 负载均衡,可以使用一致性hash技术做到尽量少的数据迁移Parallelization:并行计算,比如MapReduce
Replication:提高可靠性,如HDFS,基于位置感知的多块拷贝
Partition:数据库sharding,通过hash取摸
常见知识
- 最简单粗暴也是实践中最常用的应对方案就是:升级机器、加机器(所以架构的时候要考虑好水平扩展)
- 大多数应用都是读大于写,解决方案很简单:加缓存+读写分离
- 对于写大于读的方案,见 (关系型)数据库优化总结
- Nginx:能轻松的处理c100k问题,内存越大,能处理的并发量越高
- Redis: https://redis.io/topics/benchmarks 表明,对于GET/SET来说,QPS 10-100k没啥大问题
- MySQL: https://www.mysql.com/why-mysql/benchmarks/ 表明,对于只读,QPS 几百k没啥问题,对于写,MySQL 5.7 QPS 100k 几乎是上限
- PG: https://www.percona.com/blog/2017/01/06/millions-queries-per-second-postgresql-and-mysql-peaceful-battle-at-modern-demanding-workloads/ 也是差不多
- B, M, G, T, PB之间的关系换算要清楚
- 需要长时间处理的任务或者是强依赖网络(而网络不确定性大的问题),妥妥的用队列,例如消息推送
- 性能优化套路:加机器 - 加缓存 - 优化数据库索引 - 垂直拆数据库表 - 水平拆数据库表 - 垂直分库 - 水平分库
常见的软件架构套路
-
分层模式
这种模式主要是将设计分层,每一层为其上层提供服务。例如:web开发中我们常常将某些常用的RESTful接口抽象出一个service层。
-
客户端-服务端模式
客户端和服务端分离,从而解耦。通过这样设计,服务端可以同时为多个客户端提供服务。例如:微信。手机上的微信就是一个客户端, 而服务器则在腾讯。
-
主从模式
将整个软件区分为两块,一个是master,中文常叫做主,另一个是slave,中文常叫做从。例如:Nginx就使用了这种模式,因此master 可以方便的管理多个slave。
-
管道模式
将一个函数或者软件的输出作为下一个函数或者软件的输入,然后把他们串起来,就形成了管道模式。例如:bash中的|
。
-
消息传递模式
broker,最常见到这个词语的地方就是任务队列。我们通过一个中间介质,把消息的发布者和消费者解耦。例如:Celery。
-
点对点模式
大名鼎鼎的P2P,这是一种没有中央服务器的模式。例如:种子。
-
event-bus模式
这种模式和消息传递模式很像,区别在于,消息传递模式,消费者主动监听可以消费的队列,而这种模式,是注册事件,由owner调用,例如:安卓中的路由监听。
-
MVC模式
这是web开发中最常见的一种模式了。 通过将Model(提供数据),View(处理视图),Controller(粘合两者)区分开来,Model和View提供服务,Controller负责整合。