32cpu
128内存
1T硬盘
5万一台,3年有效期
服务冗余、放在不同的机柜,防止机柜断电,系统要做到无状态化(快速扩容、快速缩容)。
服务分级(制定一些规则,分出服务优先级)
网关层热切换(读取配置)、根据是否打印日志或者看app超时时间来决定是否关闭服务
防火墙设置只出不进也可以达到热切换能力
QQ好友列表,时间换空间,各方都有一个版本号,每次登录对比版本号,一样则不拉取好友,不一样就拉取。
hashmap处理100万数据
CopyOnWriteArrayList ArrayList 对CopyOnWriteArrayList以及所有操作加锁的List进行测试
二维数组在内存中是一个大的一维数组
mysql超过30%数据量基本就会不查索引了
mysql判断使用索引的条件
漏斗过滤处理秒杀流量,进行层层过滤,最后一层做数据一致性校验,层层过滤的目的是让每一层处理这些流量进行过滤掉,避免所有请求都到数据库。最后再形成闭环,避免能访问数据库的人再去访问数据,这才是目的。
布隆过滤器(使用hash算法,然后存储再bit上)的作用是只判断是否存在,不存储数据,与hashMap还是有区别的,hashMap也是使用hash算法,然后存储数据,比布隆过滤器更浪费空间。
缓存在数据层,业务逻辑也要缓存,针对水平拆分,缓存放的位置要搞清楚,分层缓存。
feed流朋友圈是push,微博是pull。push再分的话,两种思路(1、分组进行退 2、活跃用户推,非活跃用户慢慢推),最终高并发的话,也可以两种思路结合进行操作。
确定是否为活跃用户进行浏览计数操作,或者登陆操作。
根据每个模块数据类型的不同,来选择不同的存储。
微博是一个很好学习架构的例子。
webscoket其实底层也是长轮训,因为浏览器调不了tcp。
session放在网关层,离用户最近的地方。
单工通道、双攻通道
异步servlet是解决高并发的,在客户端并没有感觉,异步servlet的优势
delegate模式 委托或派发,委托就是组合,也就是属性来处理,并返回想要的值,两个对象之间没有关系,比如项目经理和开发人员。
阅读源码具体走的哪个类:可以用断点跟踪
安全管理器:不能访问私有属性等,java特有的一些安全级别,可以通过反射进行暴力破解,来进行调用。
java内省机制,是基于反射的,针对bean(value-Object)提供的一套快速操作的API.可以获取指定的getter、setter方法。
AOP是一种思想,面向切面编程,横向的,所以语言无关,其他语言也有这种方式。java里面是系统类级别的操作,和业务无关,对OOP继承纵向体系的补充,实现方式是通过预编译和运行期动态代理来实现,java是通过运行期动态代理来实现的。
系统接口中的幂等性、与数据库中的一致性(consistency),事务的特性,也就是属性有acid四个,并对四个特性都有一定的要求,事务导致的并发问题是由于acid的隔离性导致的。
事务可以回滚,是因为由于事务缓冲区的存在,写在数据库中的数据是不可以回滚的,事务隔离也是隔离的缓冲区,不可重复读对于同一条记录,update操作,幻读对于表来说,insert,delete操作。
脏读、不可重复读、幻读是事务并发导致的问题,事务隔离级别是解决这些问题的方法,每种方法能解决一个或者几个问题,数据库实现有四种隔离级别方案,使用锁来解决的隔离级别,mysql只实现了两种。
开闭原则,可以使用委托模式,定好架子,各个功能由其他的类实现,这样主类就不会重新编写。
装饰模式和静态代理一样,适配器模式将一个类的接口转换成客户希望的接口,将不同功能的接口,转换成相同的接口。
策略模式类似于锦囊妙计,对外来说,这些锦囊妙计长的都一样,但表现出的行为是完全不同的。
硅,是因为该元素处于元素周期表金属元素和非金属元素中间,所以是半导体,沙子中含有大量的硅。
芯片内部进行计算,基本原理是通过各种门电路的与或非、异或电路来使电路进行通电计算的,传入不同数据,会导致不同的电路联通。
光电效应是指光照在金属板上导致金属板的电子溢出现象。
源码名词:wrapper装饰模式、Tokenizer 分词、adapter 适配器、Factory工厂模式、strategy策略模式,resolver解析器,解决类型,返回适合的数据
REST是架构思想,表述性(资源)状态转换,规定了一些条件和范围,RESTful是实现了该架构的应用。restful不可以有参数,所以不适用多参数,url都是名词,所以rest架构比较鸡肋。
restful和非festful最大的区别在于get方式,理解上URI是URL的父类。
异常:持久层自定义一个异常抛出,业务层自定义一个或多个异常抛出。项目异常处理思路:不要让客户看到404、500等错误信息,不要所有的异常都显示同样的信息。
后端try catch的话一定要记录日志。要不然前端不知道后端有问题了。
spring mvc父子容器,子容器是springmvc的,父容器是spring的。跨域是指js ajax请求,不是超链接。
codis类似于mycat,是redis的代理层,并且支持集群,支持横向扩容。当128片到256片的时候,需要做数据迁移。静默登录(是因为扩容导致session丢失做的一个操作)。低峰期做这个事情,高峰期很容易把缓存压蹦。
分布式算法:一致性hash(网络瞬端,造成节点漂移,对数据要求比较高的场景,会导致数据重新归置)、取模,两个各有优缺点。(查询资料)
F5、lvs、nginx等都是狭义负载均衡。广义负载均衡:故障自动发现、故障自动摘除、请求自动重试、服务恢复自动发现(zk解决这事)。
负载也存在进程假死,而心跳线程还存在,导致请求一直失败,zk判断服务或机器挂掉,网关来判断假死(rpc框架来做)。熔断半关闭状态。
HTTP、RPC(HTTP短链接,需要频繁创建连接,并且数据头部固定,利用率不高),服务器内部通信基本采用RPC。
读请求不需要幂等,因为不会对数据发生改变,写请求可能需要幂等。 针对不同的层需要针对设计幂等。高并发产生无响应:未做降级、请求为丢弃等导致请求累计
架构设计主要是去状态机,停止系统时,优雅停机方案(对于没处理完的请求处理):通过发送信号量给进程,进程捕捉到信号量后,拒绝接受请求,处理完内存请求,然后kill进程。
ulimit -n fd命令作用。往前补偿和往后补偿看业务场景,有一些操作不一定完全要回滚。熔断、幂等、事务尽量不要放在一起。