开发中的经典问题(AI)

来源:互联网 发布:js获取dom节点的方法 编辑:程序博客网 时间:2024/05/20 04:26
  • 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住不能销毁

0 0
原创粉丝点击