第一部分 Java基础
第二部分 Java进阶

Java高并发面试题

1、如何测试并发量?

可以使用apache提供的ab工具测试。

2、Nginx反向代理为什么能够提升服务器性能?

对于后端是动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。

3、Nginx和Apache各有什么优缺点?

● nginx相对apache的优点:

轻量级,同样起web服务,比apache占用更少的内存及资源

抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx能保持

低资源低消耗高性能

高度模块化的设计,编写模块相对简单

社区活跃,各种高性能模块出品迅速

● Apache相对nginx的优点:

Apache的rewrite比nginx的rewrite强大

Apache模块超多,基本想到的都可以找到

Apache的bug少,nginx的bug相对较多

Apache超稳定,一般来说,需要性能的web服务用nginx。如果不需要性能只求稳定,那就用apache

4、Nginx多进程模型是如何实现高并发的?

进程数与并发数不存在很直接的关系。这取决取server采用的工作方式。如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。

Nginx的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。apache是如何利用的呢,简单来说:同样的4个进程,如果采用一个进程负责一个request的方式,那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。webserver刚好属于网络io密集型应用,不算是计算密集型。异步,非阻塞,使用epoll,和大量细节处的优化。也正是nginx之所以然的技术基石。

5、简单介绍一下zookeeper以及zookeeper的原理?

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

● 原理:

ZooKeeper是以Fast Paxos算法为基础的,Paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader(领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。

● ZooKeeper的基本运转流程:

选举Leader。

同步数据。

选举Leader过程中算法有很多,但要达到的选举标准是一致的。

Leader要具有最高的执行ID,类似root权限。5、集群中大多数的机器得到响应并follow选出的Leader。

6、简单介绍一下solr?

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

● 特点:

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

● 工作方式:

文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

7、solr怎么设置搜索结果排名靠前?

可以设置文档中域的boost值,boost值越高,计算出来的相关度得分就越高,排名也就越靠前。此方法可以把热点商品或者推广商品的排名提高。

8、solr中IK分词器原理是什么?

Ik分词器的分词原理本质上是词典分词。先在内存中初始化一个词典,然后在分词过程中挨个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

9、什么是webService?

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写.跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上。

10、常见的远程调用技术?

RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础。但它只能用于JAVA程序之间的通讯。Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。跨平台有点小问题。

Httpinvoker是SpringFramework提供的远程通讯协议,只能用于JAVA程序间的通讯,且服务端和客户端必须使用SpringFramework。Web service是连接异构系统或异构语言的首选协议,它使用SOAP形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。

效率相比:RMI > Httpinvoker >= Hessian > Burlap > web service。

11、谈谈你对restful的理解以及在项目中的使用?

 

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。