2018-09-28

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

BIONIOAIO

aone/spring/maven

aone

  • 构建:分支合并、编译

  • 打二方包

  • 部署

  • 发布

  • 代码规约

  • 集成测试

    构建常见的问题:

    1. 环境变量缺失
    2. 多分支构建时,找不到某个类的某个方法/某个变量,但是本地编译ok,啥原因?

分批发布:保持对外提供的服务在线,不影响线上使用;

第一批暂定:观察,看日志,

## alitomcat&pandora

  1. tomcat原理

    启动时会加载自己lib/库,以及应用程序的lib,以及应用程序类class。

    自身类库与应用程序所依赖类库的隔离,如何实现的?

    通过类加载器实现的

    jvm的3种加载器:启动类加载器、扩展加载器、系统加载器

    jsp是怎么被编译的,加载器的机制是怎么样的?

    jsp是一个servlet,被类加载器加载

  2. Spring-boot与tomcat的关系

    spring-boot集成了tomcat,所以spring-boot可以直接执行main()函数进行启动,或者执行jar相关命令即可

    而传统的tomcat启动方式,需要依赖startup.sh启动脚本

    spring-boot

    的优点和缺点?优点很多,总结成一句话—减少各种配置、集成时间,提高开发和调试效率

  3. 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注解定义

注意:

  1. 确定好自己服务的超时时间,一般是3秒;时间过长,占用连接池,阻塞应用
  2. 异常处理,hsf接口返回值一般都封装为result。为什么要封装?和http访问一样,status,定义友好的返回信息
  3. 调用hsf服务时,要先判断result.isSuccess,接下来判断result.data是否为null或者列表是否为空,否则可能NPE
  4. 循环调用:循环调用别人的hsf服务时,要控制循环次数,如果超过20次,容易把别人的hsf线程池打爆。如何解决?循环要控制次数
  5. 限流与降级:大促期间根据qps,进行限流和降级。
  6. 入参大小控制:如果上游调用时传入的参数很大,如果调用很频繁、并且内部处理很耗时,会导致什么结果?频繁GC、甚至引发FGC,并造成hsf线程池被打爆,使整个系统不可用。如果入参真的很大,怎么处理

metaq(异步调用)

  1. 同一个topic,但是不同应用消费不同的内容,需要加tag,形成topic+tag两级标识。特别是tag,直接在mq服务端就进行过滤,不需要push到客户端

  2. 消息风暴:如果编程不当,或者消费业务本身就很复杂,消费一次要处理很久,导致本次消费还没结束,服务器以为消费失败,于是重发消息,从而导致应用服务器消息堆积。这种堆积是指数级的,很快就会把应用搞挂。通过mq控制台可以看消息堆积量。解决办法:重启服务器;如果消息过多,重启消息服务器不行的话,到消息平台,先清空消息。

    在代码中如何避免?先返回给用户成功,然后异步去处理;或者构建缓存区,来处理用户的请求和消息

diamond

  1. 原理

    基于推拉模式,主要基于拉

    长连接和短连接的原理是啥? 需要看底层

    http协议,1.1开始就是长连接;长连接表示keepLive

    长短连接的优缺点?

    长连接:建立连接之后,不断开;优点:交流方便;缺点:连接是系统资源,占用系统内存

    一台linux服务器支持的最大连接数是

    diamond

  2. double check 两次检查

    解析:文本按换行符split,遍历数组,转换成对象或map

    (1)推送开关时,必须要double check

    (2)解析开关值时,要注意健壮性。特例:

    若一个开关包含多个参数,如果其中一个解析失败,会带来什么问题,如何解决?

JVM内存

  1. jvm内存

三大块:堆 栈 方法区

so,有哪几种oom场景?

堆的溢出、栈溢出、方法溢出

栈:方法调用是引用栈内存,无限调用

方法区:

堆:

只要有一个溢出,jvm就会直接退出

  1. 常见问题

    查询DB没做分页,导致频繁GC甚至FGC

    接受参数太大,并且QPS高,直接将系统搞死

    死循环,导致stack oom

    批处理耗时,并且QPS较高,系统load飙升,假死

  2. JVM问题排查

    top, jmap, jstack, jps, load, rt...

    各个工具怎么用,用来分析什么问题?

  3. 举例

    某个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。

参考