关于互联网三高的看法总结

3H

Posted by LICSLAN on September 7, 2018

现在,软件架构变得越来越复杂了,好多技术层出不穷,令人眼花缭乱,解决这个问题呢,就是要把复杂问题简单化,核心就是要把握本质。

软件刚开始的时候是为了实现功能,随着信息量和用户的增多,【大数据和高并发和高可用】 成了软件设计必须考虑的问题,那么大数据和高并发本质是什么呢?

本质很简单,【一个是慢,一个是等】 。两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也就解决了等,解决了等,也就解决了慢。

关键是如何解决慢和等,【核心一个是短,一个是少,一个是分流,一个是确保机器不是单机有可替代性,主备服务】。

短是指路径要短。典型的mvc结构是请求->controller->model->dao->view,然后把页面返回给用户。要想短的话,

1,页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新。

2,使用缓存- 第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性。

3,使用储存过程-那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。

4,批量读取 - 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数

5,延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据,

6, 使用索引 - 索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。

少是指查询的数据要少。

1,分表 - 把本来同一张表的内容,可以按照地区,类别等分成多张表,很简单的一个思路,但是要尽量避免分出来的多表关联查询。

2,分离活跃数据 - 例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表,这也类似与缓存啦。

3,分块 - 数据库层面的优化,对程序是透明的,查询大数据只用找到相应块就行。

分流三种。

1,集群 - 将并发请求分配到不同的服务器上,可以是业务服务器,也可以是数据库服务器。

2,分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。

3,CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。

主备配置 至少两台或是集群配置

1.对服务器集群和主备配置 一台挂机 另外一台(多台)随时待命补上去

随着用户量提升 需要考虑方面还是比较多的 偏Java

对之前的[单体架构]—->进行[垂直架构]—->改造进而[升级SOA]—>使用到[分布式服务管理(rpc)框架](dubbo/springcloud)

—->[MSOA] —–> 数据管理—->数据合理使用 —–> 大数据实时计算/离线计算—-> 人工智能基础数据训练使用

在演进的过程中需要考虑的问题主要有:

1.接口的幂等性 如何设计接口?

2.分布式事务 (想想单节点事务ACID/事务隔离级别) CAP/BASE/POCSX 如何保证数据一致性?

3.分布式锁 (想想单节点中的锁/JUC) 如何考虑多个跨节点的线程对共享资源的合理访问?

4.前后端分离 Vue/AngualJs/nodeJs 如何开发提升效率?

5.持续集成 Jenkins/gitlab-ci devops k8s docker 如何搭建CICD工具 ?

6.对于某些消息需要用到中间件框架(MQ —-> kafka ativeMq rabbitMq rocketMq….) 解耦/异步/最终一致性 如何根据业务场景选型和使用合理的MQ技术 ?

7.对于数据流持续计算(实时计算) spark/hodoop/strom/jstrom (大数据) 离线计算 kafka+redis+hbase+jstrom 如何考虑时间滑动窗口和数据丢失问题?

8.了解Netty mybatis spring jvm/GC linux shell springcloud springboot?

9.了解常用集合/juc 线程池 web应用服务器 tomcat jetty jboss Nginx hapoxy?

10.如何优雅写代码 effective java 如何在代码设计中合理使用23中设计模式?

11.了解计算机结构 运行机制 网络协议 Tcp/Ip协议簇?

12.合理使用nosql数据库容器 关系型数据库容器?

13.如何合理运用大量数据 将大量数据转变为 tensflow 用户训练数据 进一步深度学习 做出有意义的人工智能产品 语言无限制(java/pyhton/go/c)?