对于搜索引擎来说,索引存放在成千上万台机器上,如何进行分布式搜索呢?
假设搜索结果是以分页的方式显示,以 PageNumber 代表 当前页 ,从1开始,以 PageSize 代表 页面大小 ,默认为10,以 N 代表 搜索服务器数量 。最简单的 分布式搜索算法 为:有一台 合并服务器 负责接受用户的搜索请求,然后分别向 N 台机器获取前 PageNumber*PageSize 条结果,得到的结果数为 N*PageNumber*PageSize ,然后把这些数据重新进行排序,根据所要显示的页面 PageNumber ,获取从 (PageNumber - 1) * PageSize + 1 开始的 PageSize 条结果返回给用户。
这个算法很简单,但有一些问题:
问题一:每次翻页都要向每台搜索服务器搜索一遍
通常情况下,用户在搜索内容时都是顺序翻页的,即从第一页往下顺序翻,这个算法没有设计缓存来减轻搜索服务器的压力。
问题二:越往后翻页,搜索服务器的压力越大
如果我们是查第100页,即第991-1000 条记录,那么这个算法需要从 N 台搜索服务器分别获取1000条记录才能完成,对于每台搜索服务器的压力很大。
问题三:越往后翻页,合并服务器的排序压力越大
大型搜索引擎往往是由成千上万台机器组成的分布式搜索集群,如果按这个算法来进行翻页,假设 N 为1000,查询第100页时, 合并服务器 得到的结果数为 N*PageNumber*PageSize = 1000 * 100 * 10 = 1000000,要对这100万条结果进行排序,对 合并服务器 来说压力过大。对系统的 可伸缩性 是一种极大的破坏。
问面试官的问题: 那么如何来解决这些问题呢?
Read full article from 反面试:分布式搜索算法 - 推酷
No comments:
Post a Comment