(7)方案设计
1.谈谈你做架构设计过程?
在系统架构设计阶段,我一般会首先做数据建模。根据业务模型和功能列表,已经可以分清楚大概的系统、模块和功能,由此数据库的概念模型基本能够确定下来。通过数据库的概念模型设计,结合需求分析阶段产出的功能需求列表,整个系统的详细需求基本可以被印在大脑中了。同时经过概念模型的设计,不同数据实体之间的关系已经相对清晰,服务或领域的划分也具备初步的雏形了。完成数据库的概念模型后,开始进行详细的系统架构设计和技术选型阶段。
在系统架构设计阶段,我会按照分层架构设计的思想,逐步做细化展开。在目前的主流技术方案中,前后端分离基本上是默认的标准,核心原因一方面是前后端技术演进快速发展,技术专业人员分工更明确;另一方面当前的产品开始移动化,前后端一体的架构无法支撑当前移动端特别是App类应用的开发,前后端分离也成为不得不为之的举措。按照分层架构设计的思想,将整个架构分为前端接入层、服务层、数据访问层、数据存储层。在部分高并发的系统中,还会有缓存相关技术贯穿在整个架构层级之间。
2.什么因素确定架构设计,是否要关注全部功能?
- 性能
性能就是核心要素之一。系统可以粗略的分为访问层、服务层、缓存层、数据层。每一层都有相应的性能优化手段,但是精力有限,没有必要都关注。在系统发展的初期,通常考虑首先优化数据库的查询。
- 可用性
可用性通常指高可用的应用、服务、数据和监控。衡量系统架构设计是否高可用,是假设系统中任何一台或者多台服务器宕机时,系统整体是否依然可用。一般三个手段、冗余、集群化、分布式。
网站高可用的主要手段就是冗余,应用部署在多台服务器上同时提供服务,数据存储在多台服务器上相互备份,任何一台服务器都不会影响应用的整体可以,通常的实现手段即把多台服务器通过负载均衡设备组成一个集群。
- 安全性
安全的5个要素:机密性、完整性、可用性、可控性和可审查性。衡量系统安全架构的标准,是针对现存的攻击、窃密手段是否有可靠的应对策略。
安全服务是指计算机网络提供的安全防护措施,包括认证服务、访问控制、数据机密服务、数据完整服务和不可否认服务。
特定的安全机制是用来实施安全服务的机制,包括加密机制、数据签名机制、访问控制机制、数据完整性机制、认证交换机制、流量填充机制、路由控制机制和公证机制。
普遍性的安全机制不是为任何特定的服务而特设的,属于安全管理方面,分为可信功能度、安全标记、事件检测、安全审计跟踪和安全恢复。
- 扩展性
扩展性指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。表现在系统基础设施稳定不需要经常变更,应用之间较少依赖和耦合,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。这个没啥好说。扩展性依赖于前期良好的架构设计。合理业务逻辑抽象,水平/垂直切割分布式化等等。
网站可扩展架构的主要手段是事件驱动架构和分布式服务。事件驱动通常利用消息队列实现,通过这种方式将消息生产和处理逻辑分隔开。服务器服务则是将业务和可复用服务分离开来,通过分布式服务框架调用。新增加产品可用通过调用可复用的服务来实现自身的业务逻辑,而对现有产品没有任何影响。
- 伸缩性
服务尽量同构。DB、cache在考虑分布式时尽量提前设计好扩展方案。也可以采用一些主流的对水平伸缩支持较好的nosql、memcached、hbase等。
3.怎么确定产品的核心功能?
一般产品功能可以分为:基础功能和核心功能。
基础功能:就是满足用户基本需求过程的功能。比如用户要上网订外卖,基础功能包括:找饭店、找菜单、下单、付款。这些功能都是为了满足最基础的订外卖的需求。
核心功能:就是在基础功能上,更好地满足用户最真实需求的功能。用户网上订外卖的真实需求是“简单、快速地买到自己想吃的食物”,核心功能就是满足用户更快、更便捷的订餐。
确定核心功能的方法是,找到满足用户需求的“功能重点”和“关键因素”。
- 功能重点
在做用户需求分析时,我们要知道满足用户需求的过程中哪个是用户难点、或是满足用户需求的关键节点,那么这个点就是“功能重点”。找到功能重点的流程为:
- 通过用户需求分析,确定产品定位。
- 确定产品基础功能,满足用户需求的目的和行为。
- 在基础功能上进行功能分解和用户流程描述。
- 确定用户流程中某个环节,对满足用户需求最关键。
- 关键因素
在用户需求分析中,用户的真实需求才是驱使用户使用产品的根本原因。在10年前,用户在网上下歌曲,经常会因为歌曲很少或者无法下载,那个时候如果哪个产品能够实现“搜得到,能下载”,那么它就能很好的满足用户下载歌曲的需求。所以用户的真实需求就是满足用户需求的关键因素。找到用户需求的关键因素流程为:
- 通过用户需求分析,确定产品定位。
- 确定产品基础功能,满足用户需求的目的和行为。
- 在基础功能上如何更好地满足用户需求。
- 确定如何更好的满足用户需求,就找到了关键因素。
4.设计一个搜索引擎,像谷歌那样只有两个页面,不考虑搜索逻辑,如何让性能最大化?
- 前端
- Javascript:采用原生脚本校验表单,操作DOM,可以获得JS最佳的执行性能。
- CSS: 合并多个文件到一个CSS文件,减少网络请求次数。
- 图片:合并多个图片到一章图片,利用CSS控制展示,减少网络请求次数。
- 异步:接口异步加载搜索结果列表,减少用户的延迟感知。
- 压缩:压缩静态资源文件,提供网络请求性能。
- 传输
- 引入全域的CDN。
- 浏览器设置本地缓存。
- 服务端开启GZip。
- 后端
- 分布式:采用分布式系统提高并发能力。
- 数据存储:采用NoSQL数据库存储海量数据。
- 数据缓存:采用分布式系统缓存搜索结果。
5.假设架构一个车联网系统,要考虑哪些问题?
https://www.woshipm.com/pd/1296408.html/comment-page-1
参考(摘抄的文字版权属于原作者)
https://blog.csdn.net/cool_rain_man/article/details/1803430
https://baijiahao.baidu.com/s?id=1622915990743250739&wfr=spider&for=pc