redis
持久化:AOF/RDB
IO多路复用:select epoll evport kqueue
Nmap 虚拟内存 内存映射
网络转换 分发
binlog记录过程
redis 的AOF 只记录结果
内存数据结构 支持更多的数据结构 相对于memcached
linux
pgm -A `armory -leg projectnamehost` "grep 'Exception' /home/admin/projectname/logs/service.log"
BIONIOAIO
aone/spring/maven
aone
构建:分支合并、编译
打二方包
部署
发布
代码规约
-
集成测试
构建常见的问题:
- 环境变量缺失
- 多分支构建时,找不到某个类的某个方法/某个变量,但是本地编译ok,啥原因?
分批发布:保持对外提供的服务在线,不影响线上使用;
第一批暂定:观察,看日志,
## alitomcat&pandora
-
tomcat原理
启动时会加载自己lib/库,以及应用程序的lib,以及应用程序类class。
自身类库与应用程序所依赖类库的隔离,如何实现的?
通过类加载器实现的
jvm的3种加载器:启动类加载器、扩展加载器、系统加载器
jsp是怎么被编译的,加载器的机制是怎么样的?
jsp是一个servlet,被类加载器加载
-
Spring-boot与tomcat的关系
spring-boot集成了tomcat,所以spring-boot可以直接执行main()函数进行启动,或者执行jar相关命令即可
而传统的tomcat启动方式,需要依赖startup.sh启动脚本
spring-boot
的优点和缺点?优点很多,总结成一句话—减少各种配置、集成时间,提高开发和调试效率
-
war包结构
web应用打成war包之后,tomcat在部署时会先对其解压,解压后形成webapp/WEB-INF/classes和webapp*/WEB-INF/lib,classes下面放的是你的java包。
spring-boot之后,我们打的是jar包,解压生成的是webapp**/BOOT-INF
发布完成之后,需要去服务器上看看这个目录,尤其是lib目录。尤其是当出现jar包冲突时,更要看看,是否真的有两个一样的jar包在该目录下
HSF(同步调用)
hsf定义:添加hsf注解
hsf消费:spring-boot:在config中通过@Consumer注解定义
注意:
- 确定好自己服务的超时时间,一般是3秒;时间过长,占用连接池,阻塞应用
- 异常处理,hsf接口返回值一般都封装为result。为什么要封装?和http访问一样,status,定义友好的返回信息
- 调用hsf服务时,要先判断result.isSuccess,接下来判断result.data是否为null或者列表是否为空,否则可能NPE
- 循环调用:循环调用别人的hsf服务时,要控制循环次数,如果超过20次,容易把别人的hsf线程池打爆。如何解决?循环要控制次数
- 限流与降级:大促期间根据qps,进行限流和降级。
- 入参大小控制:如果上游调用时传入的参数很大,如果调用很频繁、并且内部处理很耗时,会导致什么结果?频繁GC、甚至引发FGC,并造成hsf线程池被打爆,使整个系统不可用。如果入参真的很大,怎么处理
metaq(异步调用)
同一个topic,但是不同应用消费不同的内容,需要加tag,形成topic+tag两级标识。特别是tag,直接在mq服务端就进行过滤,不需要push到客户端
-
消息风暴:如果编程不当,或者消费业务本身就很复杂,消费一次要处理很久,导致本次消费还没结束,服务器以为消费失败,于是重发消息,从而导致应用服务器消息堆积。这种堆积是指数级的,很快就会把应用搞挂。通过mq控制台可以看消息堆积量。解决办法:重启服务器;如果消息过多,重启消息服务器不行的话,到消息平台,先清空消息。
在代码中如何避免?先返回给用户成功,然后异步去处理;或者构建缓存区,来处理用户的请求和消息
diamond
-
原理
基于推拉模式,主要基于拉
长连接和短连接的原理是啥? 需要看底层
http协议,1.1开始就是长连接;长连接表示keepLive
长短连接的优缺点?
长连接:建立连接之后,不断开;优点:交流方便;缺点:连接是系统资源,占用系统内存
一台linux服务器支持的最大连接数是
diamond
-
double check 两次检查
解析:文本按换行符split,遍历数组,转换成对象或map
(1)推送开关时,必须要double check
(2)解析开关值时,要注意健壮性。特例:
若一个开关包含多个参数,如果其中一个解析失败,会带来什么问题,如何解决?
JVM内存
- jvm内存
三大块:堆 栈 方法区
so,有哪几种oom场景?
堆的溢出、栈溢出、方法溢出
栈:方法调用是引用栈内存,无限调用
方法区:
堆:
只要有一个溢出,jvm就会直接退出
-
常见问题
查询DB没做分页,导致频繁GC甚至FGC
接受参数太大,并且QPS高,直接将系统搞死
死循环,导致stack oom
批处理耗时,并且QPS较高,系统load飙升,假死
-
JVM问题排查
top, jmap, jstack, jps, load, rt...
各个工具怎么用,用来分析什么问题?
-
举例
某个hsf请求处理很耗时,并且占用大量资源,怎么快速定位?
top -h 那个线程跑的最多,最耗时
jstack 根据pid,看对应那个类
## tair(缓存)
* 如何保证tair与db之间的一致性?
* tair异常:写成功,读不到,啥原因?
tair满了,写不进去
* tair失效:一定要进行失效机制,这是保证数据一致性的根本措施。容忍短时间内的数据不一致性,但是绝不允许长时间不一致
* 写>读的场景下,是否要使用tair?不需要
* 本地cache:tair自带本地cache热点数据功能,但是必须根据业务特点设置何时的失效期
* 缓存分流:多个系统如果都依赖basic系统的缓存数据,当QPS很大时,basic系统因为tair访问流量过大触发tair限流,导致basic频繁读取DB,造成性能降低,如何破解?
重复访问少,缓存命中概率低
## mysql
b+tree的结构是啥?为啥比其他树快
status字段能建索引吗?不需要键,因为状态值比较少
批量查询时,limit start step查询如何提升效率 id,order by, 100w条的时候,需要注意
## eagleeye(鹰眼)
load cpu时间片 任务
在一个时间片内没做完,又来一个任务,load+1
一个时间片时间没到就做完了,load=0
load/qps的关系:
qps高,load一定高吗?
load的含义是啥
如何设计程序,使qps即使很低,load也很高
4核处理器上,load的健康值是多少
正常业务系统的qps健康值是多少
正常业务系统的线程数量是多少
服务治理框架
hsf:
序列化 hessian 支持跨语言,速度慢
dubbo序列化也是hessian2
普通的轮询方案会给服务器带来过多访问压力,而且很多时候轮询请求都没有配置更新,白跑一趟,Diamond采用的是改进的长轮询方案,长短轮询结合,即轮询配置是否更新时,使用长轮询,减少配置没更新时无意义的访问;在获取配置时,使用短轮询,及时获取配置。
基于Http长轮询模型,这样减少了无意义的轮询请求量,提高了轮询的效率;也降低了系统负载,提升了整个系统的资源利用率。这种推拉结合的策略,做到了在长连接和短连接之间的平衡,实现上让服务端不用太关注连接的管理,效果上又获得了类似TCP长连接的信息推送的实时性。由于轮询之间的间隔,无法保证连续的配置更新,都会被客户端接受,但最后一次的配置更新一定会被客户端接受到,例如发布了A B C 配置,可能客户端只接受到了 A C,也可能只接受到 B C,或者只接收到 C。