当前位置: 首页 > 科技观察

JAVA架构师面试分享—链家网

时间:2023-03-13 14:59:03 科技观察

本月7号去链家网面试。虽然没有面试,但收获还是很多的。在这里分享一下,主要是为了我自己,让大家开怀大笑。因为是第一次面试JAVA网站架构师相关的职位,所以还是有点愧疚的。毕竟我大部分时间都在做.NET相关的技术工作,负责的项目规模也比较小。而且差别也很大。我对高并发高扩展性互联网站点的架构经验不多,但是闲暇之余读了李芝芝老师的《大型网站技术架构》这本书给了我很大的启发。面试过程比较简单。首先是笔试。架构师这个岗位主要是了解一些知识,还有一些数据库查询的基础问题。知识点比较集中在NoSQL、缓存服务器集群、Session服务器等方面,我总体做的还不错,所以面试官比较客气,和我聊了比较深入的相关知识,包括公司的主要组织结构和利润来源。由于链家网至今还不是特别出名,因此在各大网站上经常可以看到该公司基于房地产行业的研究报告。一开始我最大的疑问是这家公司和搜房网、安居客等有什么区别?这些网站已经存在了很多年,那么这两年生存和发展如此迅速的公司有什么特别之处呢?在回答这些问题之前,我再进一步介绍一下采访者老宋。这是我给他起的外号。那次见面应该是我第一次也是最后一次见到他,但他却给我留下了深刻的印象。技术水平高,注重外在气质,沟通时非常亲切。影响最大的是他在采访中用笔记录了相关信息。他非常专业并且尊重面试官。之所以提到这个,是因为我个人认为,程序员找工作,除了收入和公司未来的发展,最重要的还是直属领导的性格契合度,以及合适的才是最好的。只有这样,无论遇到多大的困难,都能坚信团队和项目能够顺利发展,付出更多是值得的。当然,最终你会受益。接下来回答上一个问题,链家网是一家非常大的房地产经纪相关的公司。它的组织结构比较复杂和特殊,因为它不是一家慢慢发展起来的公司,而是由链家网牵头的,这与异地的其他公司不同。共同组建的房地产经纪公司。由于房地产政策的区域差异和不同地区客户群体的不同需求,很难有一个非常统一的运营模式进行管理。各地公司独立运作,总部主要是互联网用户门户。数据信息服务系统也是独立的,感觉更像是原来的特许经营形式,也算是一种互联网+的实践。该公司与搜房网、安居客不同的是,它的数据来自我们公司,基本真实有效,而搜房网等公司的数据来自各个房地产经纪公司或经纪人,信息非常不可靠。举个简单的例子,比如一个房子的房东报价是500万元,但是一般来说都有一定的还价空间,所以房产中介在网上挂牌的时候会降价,比如495万。同时,房东通常会联系多家经纪公司。然后其他经纪人会看到这个报价。为了成交,他们自然会报低价。最后连400万都会被揭穿。不可能的价格,只是为了接到潜在买家的电话。这样就形成了“劣币驱逐良币”的局面,使网站上的信息不再可信。同时,由于一套房子可以被多家经纪公司挂牌出售,网站上的房子数量往往远远超过实际数量,给潜在买家造成极大的困惑。此外,由于链家公司下辖的上海德友公司等房地产经纪公司具有一定规模,为进一步确保房产的真实性,房管局对房产进行了全面检查。待售房屋。借用老宋的话,“搜房就是淘宝,链家就是京东”。以上是对公司业务模式的介绍,对房地产经纪公司深入互联网有很大的借鉴意义。然后我开始介绍技术部分。一开始,我也很迷茫。为什么这家公司需要OA架构师?经过沟通,了解到公司目前有3万左右的房产中介,所以公司的业务信息系统每天PV接近1000万,相当于一个中型网站。每天早上签到(使用在线签到)、抢客资源等活动会产生大量的并发量,类似于电商网站的秒杀,所以需要有高并发相关经验的工程师。最后是权限系统的设计、缓存服务器集群的搭建、消息队列系统的搭建等几个主要的技术点。这里主要介绍前两个,其他的以后再补充。权限系统基本参考了资深博主田星马的方案,如下图。主体结构相对简单,职位和项目组的设置可以同时满足职能型和项目型的企业组织结构,而角色对前两者提供有限的补充,如系统管理员等无法用职位描述的和项目团队。一般来说,系统中有两种权限:模块权限和行为权限。权限组通常用来表示模块中所有行为权限的集合。这个思路简单明了,便于日后实施和扩展。在实施中,权限信息可以通过相关的权限代码组合规则存储在数据库中,例如,表示权限的数字或字母的组合。分布式缓存集群的可扩展性不同于Web服务器集群的可扩展性。对于后者,每个Web服务器上的内容都是一样的,只需要简单的负载均衡算法就可以实现可扩展性。但是,每台分布式缓存服务器上的数据是不同的,缓存访问请求不可能在集群中的任何一台服务器上完成。在访问数据之前,您需要找到存储数据的服务器。同时,新上线的服务器上没有缓存数据,离线缓存服务器上有热点数据,这会给分布式缓存集群的可扩展性设计带来很大的困难。为了更好的解释相关概念,下面将以最常见的Memcached为例介绍相关设计与实现,如图。这个过程非常简单。MemcachedAPI对应用传入的key进行哈希处理,然后使用简单余数Hash算法(例如11/3=2)得到指定的节点Node2,然后存储到指定的服务器中。需要注意的是,一旦涉及到服务器的扩容,上面提到的余数Hash算法就会遇到很大的问题。例如,当将3台缓存服务器增加到4台(11/4=3)时,那么在Node3上如果找不到缓存,则缓存未命中的概率达到75%,扩容后,出现缓存失败的概率hit会继续增加(N/N+1)。这时候就会用到流行的一致性哈希算法。该算法通过一致性Hash环的数据结构实现了KEY到缓存服务器的Hash映射。过程如下图所示。该算法的具体过程是:首先构造一个232整数环,根据节点名的Hash值(很可能是hash)阻止缓存服务器节点进入这个Hash环,然后计算出数据KEY的Hash值需要缓存的,顺时针方向找最近的节点作为目标节点。如上图所示,集群扩容时,在原有Node0-2的基础上增加了Node3。可以看出,受影响的数据只有Key3,所以缓存的命中率变为N/N+1,可以满足实际需要。在实际代码中,一般是通过二叉搜索树来实现的,它通过连接最外层的叶子节点形成一个环。但是,上面的设计还有一个问题,就是进一步扩展后,Node0和Node1的负载是Node2和Node3的两倍。解决这个痛点的方法是将物理缓存服务器节点虚拟成N个虚拟节点,均匀分布在环中,使负载尽可能均衡。这样,新的物理服务器对原物理服务器的影响是一样的,这就是算法名称的由来。注:本文主要供大家自己学习使用,如有不当还请见谅。参考文献:[1]天行马。OA系统权限管理设计方案[EB/OL]。http://www.cnblogs.com/kivenhou/archive/2009/10/19/1586106.html。[2]李芝芝.大型网站架构技术[M].上海:电子工业出版社,2012.123-182