zoukankan      html  css  js  c++  java
  • JAVA关键技术

    通用技术方面

    MVC

    1)概念

    MVC是一个架构模式,它分离了表现与交互。它被分为三个核心部件:模型-model、视图-view、控制器-controller

    2)工作原理

    所有的终端用户请求被发送到控制器。
    控制器依赖请求去选择加载哪个模型,并把模型附加到对应的视图。
    附加了模型数据的最终视图做为响应发送给终端用户。

    struts2

    1)struts2的基本流程

    1、客户端浏览器发出HTTP请求。
    2、根据web.xml配置,该请求被FilterDispatcher接收。
    3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。
    4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。在Action被调用前后,可以注入拦截器
    5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
    6、返回HTTP响应到客户端浏览器。 
     
    2)拦截器的作用及常见拦截器
    作用:在action执行前后,执行特定模块。甚至可以阻止action的执行
    框架提供的拦截器:i18n:记录用户选择的区域环境   logger:输出Action的名字  params:将请求中的参数设置到Action中去。
     

    spring

    1)IOC概念

    将在编译阶段还不能确定的类的调用关系,放在配置文件中,在执行阶段动态调用。

    2)AOP概念

    默认使用java动态代理实现

    3)作用域

    1. singleton:单实例
    2. prototype:一个bean可以定义多个实例。
    3. request:每次HTTP请求都会创建一个新的Bean。
    4. session:一个HTTP Session定义一个Bean。
    5. globalSession:同一个全局HTTP Session定义一个Bean。

    bean默认的scope属性是’singleton‘。

    4)事务

    Spring本身不实现事务,而是为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。

    5)Spring 中的设计模式

    单例模式:jdbc connectionter

    代理模式:AOP

    工厂模式:用SpringFactory创建特定的bean

    观察者模式:根据SpringContext的配置方式,决定AOP的模式

    hibernate

    1)get和load的不同

    get:如果缓存中没有,hibernate将会直接访问数据库,并初始化一个持久化对象

    load:如果缓存中没有,hibernate将会创建代理对象,只有真正需要使用这个对象的时候,参会从数据库中加载数据,即延迟加载。

    2)save、persist和saveOrUpdate以及update比较

    save:只能insert记录,返回的是Serializable对象

    saveOrUpdate:既能insert,也能update

    persist:返回的是void

    update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。

    update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法

    saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会  更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。

    3)瞬态,游离态,持久态如何转换

    刚new出一个对象,还未保存到数据库,是瞬态

    调用save()保存进数据库,就成了持久态(即session缓存中的状态)

    当关闭session后,数据库中有,session中没有,叫游离态

    4)Hibernate并发控制

    问题:hibernate中的session是线程非安全的,如果多个线程共享将导资源争用,进而导致脏读,幻读等问题

    解决方案:设置JDBC事务隔离级别

        Serializable:串行化。隔离级别最高  
        Repeatable Read:可重复读  
        Read Committed:已提交数据读  (默认)
        Read Uncommitted:未提交数据读。隔离级别最差  
        设置锁:乐观锁和悲观锁。  
        乐 观锁:使用版本号或时间戳来检测更新丢失

        悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象

    redis/cache

    1)虚拟内存

    当你的key很小而value很大时,使用VM的效果会比较好

    当你的key不小时,可以考虑将key,value组合成一个新的value.

    vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

    2)分布式

    a)读写分离——主从模式

    redis支持主从的模式。原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

    通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高,但是集群的扩展能力受限于单个节点的存储能力。

    b)数据分片(类似数据库水平拆分)

    分布式总结:结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

    3)MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略,有以下几种策略

    随机淘汰

    淘汰最少使用的

    淘汰过期数据集中最少使用的

    淘汰将要过期的

    4)redis性能问题

    写内存快照会阻塞主线程,因此master最好不要写快照

    重写AOF会占用高内存,且AOF文件过大会影响master重启和恢复速度,因此maste人最好不要做任何持久化工作,包括内存快照和aof,二用slave执行aof

    主从最好在同一局域网内提高主从复制的性能

    5)redis适用场景

    Redis最适合所有数据in-momory的场景而不是持久化,相当于加强版的memcache

    A)会话缓存,例如购物车信息,可以持久化

    B)全页缓存

    C)做队列使用

    D)排行榜和计数器

    E)发布订阅

    6)如果出对列阻塞了怎么办

    redis分片,缩短单个队列长度

    优化consomer,调查处理慢的原因

    增加consumer(即分布式的集群服务器)

    允许请求超时 /失败,做好失败后处理

    做好内存报警和配置好内存回收策略

    jms,消息队列

    1)特性

    异步通信,松耦合的系统集成

    websphere MQ是FIFO的,AWS的MQ是random的

    并发性能

    我们公司面试也经常问这种问题,很多人答很大面的东西,例如JVM调优,负载均衡,但是作为一个程序员,有谁专门在这方面下过功夫,有的人说做过jvm调优,但是一问细节,又说不上来。
    做为编码的程序员,更重要的是应用程序的设计,如何写出高效的sql,如何占用最小的内存,如何把某些程序在后台异步操作。面试的时候说一说你日常工作的时候这方面的经验,也能很好的回答这个问题。     

    1)性能通用解决方案

    前端:异步请求+资源静态化+cdn
    后端:请求队列(如12306)+轮询分发+F5负载均衡+共享缓存
    数据层:redis缓存+数据分表+写队列+存储过程(减少跟客户端交互的IO)
    存储:raid阵列+热备
    网络:dns轮询+DDOS攻击防护

    2)数据库解决方案

    最基本的:建立索引

    100万数据:主从数据库(读写分离,主从复制同步),slave上可以做集群

    1000万数据:数据库水平拆分,按uid拆分

    注意问题

    id使用通用算法集中分配

    做好数据库性能监控

    不要用长连接,尽量使用连接池。

    3)缓存

    CND

    静态页面缓存

    动静分离,图片,视频,附件等使用专用服务器

    5)前沿解决方案:云平台——可伸缩扩展,快速热部署,内存数据,      

    12306如何解决并发的

    并发性能的问题和原因

    A.带宽问题 1.5G的带宽大约支持1万PV,

    B.服务器集群难以伸缩扩展

    C.事务不一致性,12306十分钟才更新一次余票,期间已经售出很多。2012年处理能力为400-500TPS,有效请求却高于3000QPS

    D.计算量巨大:线路多,车次多,车站多,坐席多,票种多,导致10分钟才能计算完一次余票

    12306云技术升级 

    http://www.csdn.net/article/2015-02-10/2823900

    http://storage.it168.com/a2012/0217/1313/000001313424_all.shtml

    传统的解决方案

    优化架构

    1)利用第三方平台登录来缓解并发压力,例如新浪,腾讯,阿里等

    2)第三方售票平台应该以消息队列方式,异步地与12306进行集成。 对于登录的消息队列,可以在12306批量授权处理(有点类似数据库存储过程,减少与客户端交互的io损耗)

    优化软件

    使用线程池和事件驱动处理尖峰请求,可以通过下游负载指标反馈来决定上游处理,对于太老的请求,直接拒绝。

    使用KV内存数据库来缓存余票,只有当数据库中本车次无票(或者小于n张)才去同步一次缓存

    缓存的更新是基于数据库余票数主动触发,只有当无票(或者低于n张票)才触发,而不是根据用户查询而触发,因此可以大幅减少缓存更新频率

    可以基于查询结果生成静态页面缓存起来,设置失效时间,或者由数据库余票出发页面失效,完全由CDN或者redis来承担查询压力

    增强防作弊机制,在web层对IP做限制,对UID做限制

    数据库层优化

    主从数据库(读写分离)

    数据库水平拆分

    优化队列

    队列不能操作锁

    设置队列等待时间(15分钟后未处理完的事务直接终止)

    设计分布式队列(因为排队的人并不一定买的相同车次,没必要跟着人家一起排队,而是让相同车次的人排同一个队列)

    Pivotal Gemfire的解决方案:云

    2012年,业务复杂:路线多,火车站多,坐席多,票等级多,组合就多。使用很多服务器。

    2013年,使用Gemfire集群进行余票计算,可以2分钟刷新一次余票数据

    2014年,将订单生成和订单查询分库处理,将查询的热点数据放在Gemfire集群,同时提高了订单生成和查询速度

    2015年,单独分出余票查询服务器群(以前是64台,现在是是几台云服务器搭建的上百部虚拟机,节约成本),并与web服务器集群,应用服务器集群一起部署到阿里云

    并发事务

    JVM内存结构,GC算法,性能优化

    类的生命周期

    1)将.class文件加载到内存,生成Class对象——类加载

    2)类连接(验证,准备,解析)

    3)初始化:静态变量赋值

    4)使用

    5)卸载:垃圾回收

    三种类加载器

    启动加载器(jvm),扩展加载器(基础库),应用加载器(程序代码)

    加载机制

    全盘负责,父类委托,缓存机制

    JVM内存结构

    三大块:堆,栈,方法区

    堆又分为:年轻代和老年代

    年轻代又分为:Eden,from,to

    --------

    方法区存储常量,静态变量,类信息

    栈区:存放临时变量,方法参数

    --------

    对象引用判断

    引用技术(新增引用时+1,引用释放时-1,但互相引用的对象则无法计算)

    可达性分析

    GC算法

    标记清除算法

    复制算法

    分代收集算法

    对象分配法则(GC优化法则)

    1)优先分配在Eden区,如果Eden区没有足够的空间时,执行一次Minor GC,Eden采用复制算法收集内存

    2)大对象直接进入老年代,避免在年轻代频繁进行内存拷贝

    3)长期存活的对象进入老年代,因为年轻代的对象随着年龄增加,最终会进入老年代内存区

    4)空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC

    数据库性能

    存储过程

    执行存储过程是为了1)利用服务器往往具有强大的计算能力和速度,2)避免把大量的数据下载到客户端,减少网络上的传输量,3)只需要一次编译,4)方便事务处理

    触发器

    1)概念

    就是一组由特定条件触发执行的操作语句。

    2)分类

    行级:每条记录都触发

    语句级:指定操作之前或之后触发

    3)应用场景

    进行安全检查(例如数据更新前的权限检查)

    数据同步或者备份(主表更新后, 备份表也更新)

    生成自定义ID列:第一步创建一个sequence,用来自定义ID格式,第二步在目标表上面创建触发器,每当插入数据时,就取sequence的next值

    记录用户操作(工作流系统中的追踪,审计)

    项目方面

    IBE流程

    Payment流程

    单点登录

    数字证书

    communicate service

    MPO

    重大故障

    写日志导致的故障

    故障描述:service频繁time out, 无法search flight,无法订票

    问题分析:disk io high utilization, terracotta and JVM reject rejoin,  was server high CPU, MQ and service error log

    分析过程:

    怀疑WAS 上的IBE和 WMB 上的MQ通信出故障

    MQ connection error and time out, 可能有阻塞,重启WMB,无效, 2)重启WAS JVM, 无效,

    root cause: 

    solution

    1.限制层数

    2.限制表查询条件

    3.缓存结果

    
    
  • 相关阅读:
    站立会议报告(7)
    团队博客(13)
    团队博客(12)
    意见评论
    团队博客(11)
    团队博客(10)
    团队博客(9)
    团队博客(8)
    站立会议报告(6)
    Java Callable
  • 原文地址:https://www.cnblogs.com/fysola/p/6557625.html
Copyright © 2011-2022 走看看