URL缩短器如何大规模工作(例如,在twitter的情况下为t.co)

时间:2014-07-30 15:57:38

标签: ruby-on-rails mongodb twitter scale url-shortener

标准方法涉及生成唯一的id(较小的整数,通常是自动增量id),然后在双射函数中使用该id生成较小的字符串,如下所述: https://stackoverflow.com/a/742047/762747

但是这种方法不适用于大规模的分布式系统。 NoSQL数据库的id通常要大得多,以确保唯一性。人们可以尝试生成自动增量ID,但肯定会效率低下。

是否有其他方法可以生成短网址。具体做法是:

1)twitter如何生成t.co URL,因为这是我在谈论规模时能想到的最好的例子。推文ID要大得多(它们使用雪花),所以我们可以说twitter不会(也可能不会)使用自动增量ID。

2)如果他们使用相同的方法,那么URL缩短是否异步,以确保他们在生成自动增量ID和短网址时不会影响性能?

至于我的具体情况,我试图从mongo BSON id生成一个唯一的缩短字符串。当我尝试缩短BSON id时,上面的方法产生一个16个字符的基本62字符串。我可以采用独特的自动增量id路由,但由于显而易见的原因,这听起来效率低下。思考?如果twitter可以做到,我们也可以。好伙计@twitter,你介意分享你的方法吗?

1 个答案:

答案 0 :(得分:1)

自动增量不是必需的,要求是ID唯一性。您只需将每个发出新ID的服务器使用的连续ID块分配出去。然后,这些服务器从块的开始到块的结束自动递增。跨服务器锁定在ID块级别完成,而不是单个ID。

您可以通过对数据库进行低优先级后台扫描来处理因服务器不断出现的不可避免的ID差距,从而收集ID中的空白并将其添加到"已知的"在发布新ID范围之前要进行养殖的范围列表。

全局自动增量和局部自动增量方法在理论上都是ID数量的O(N)。这仅表明,有时,算法复杂度是预期性能的不良指标。