您的位置:首页 > 大数据 > 人工智能

开发中的经典问题(AI)

2016-08-18 10:46 141 查看
1.关于淘点点面试中碰到的架构设计问题?

http://ifeve.com/question/%E5%85%B3%E4%BA%8E%E6%B7%98%E7%82%B9%E7%82%B9%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%A2%B0%E5%88%B0%E7%9A%84%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98%EF%BC%9F/

2.threadlocal原理和应用场景

http://blog.csdn.net/imzoer/article/details/8262101

3.有3个线程ABC。按照ABC来运行(A线程输出A,B线程输出B,C线程输出C,以此类推,循环输出)?

用 Reentrantlock,用它的newCondition() 方法创建3个condition,按顺序调用 condition 的await和signal 方法就可以了,就不贴代码了,具体看Reentrantlock 和Condition 讲解。

4.附近的人的实现方式?

mongodb存在用户的LBS,创建地理位置索引,2d和2dsphere,对应平面和球面,搜寻附近一公里内的点,由近到远排序。

5.有一个生成唯一串的需求,并发请求量非常大,该如何实现?

唯一串的格式:集群编号+机器ip+jvm进程号+线程编号+时间+计数器。

UUID由以下几部分的组合:

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

(2)时钟序列

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

6.高并发的解决方案

浏览器到前台页面,负载均衡,HTML静态化,缓存,图片服务器分离。数据库,读写分离,垂直拆分数据库,水平拆分数据库。

7.高并发,执行耗时短的任务,还有低并发,执行耗时长的任务,各自选取什么样的线程池会比较合理?为什么?如果业务场景是高并发,且任务耗时长时,有什么解决思路?

线程池的关键点是:1、尽量减少线程切换和管理的开支; 2、最大化利用cpu。

对于1,要求线程数尽量少,这样可以减少线程切换和管理的开支;

对于2,要求尽量多的线程,以保证CPU资源最大化的利用。

所以对于任务耗时短的情况,要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间,那效率就低了;

对于耗时长的任务,要分是cpu任务,还是io等类型的任务。如果是cpu类型的任务,线程数不宜太多;但是如果是io类型的任务,线程多一些更好,可以更充分利用cpu。

所以:

高并发,低耗时的情况:建议少线程,只要满足并发即可;例如并发100,线程池可能设置为10就可以

低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务;例如并发10,线程池可能就要设置为20;

高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数

8.数据库中内连接与外连接的区别?

内连接: inner join

外连接: left [outer] join, right [outer] join , full join

inner join:A与B的交集

left join:A的全集

right join:B的全集

full join:A与B的并集

cross join:A与B的笛卡尔积

9.如何减少上下文切换?

上下文切换又分为2种:让步式上下文切换和抢占式上下文切换。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免。

10.Spring的优点

Spring的核心思想是低内聚松耦合

1.基于POJO的轻量级和最小侵入编程

2.通过依赖注入和接口实现松耦合

3.基于切面和惯例进行声明式编程

4.通过切面和模板减少样板式代码

11.mysql,zk这些强一致性的软件为什么要先写日志?

题主写的不准确,数据库并不是先写日志再进行数据修改,而是要先确保数据能够修改后(比如要保证账户有余额),再把该修改的都在内存中改好了,再去写日志,等日志写成功后,再通过一个“不会失败(比如一次指针或整数赋值,或一系列解锁)”的操作将刚才修改的数据“发布(即对其他人可见)”,如果不等写日志成功就“发布”的话,万一在日志落盘之前宕机,重启后不能恢复这条日志,就会出现宕机前明明成功的操作,比如银行转账操作,在宕机恢复后丢失了。

至于性能问题,可以通过group commit机制来提高整体吞吐(当然,延迟是优化不了的),互联网业界一般通过使用带电池(或电容)的raid卡(比如lsi卡,比较便宜,1-2千块),pcie的flash卡(比如fusionio卡),或ssd,来降低写入的延迟(一般可以控制在几百微秒)。

12.RabbitMQ注意点

RabbitMQ中,采用spring的AMQPTemplate,如果用多线程进行消息推送,那么发现推送后每个线程产生的channel都未关闭。直接导致线程被hang住不能销毁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试