我们都已经看到了当您使用裸露的“heroku create”将应用程序部署到Heroku时会自动分配的有趣子域。

例如:炽热薄雾4652,电夜4641,晨霜5543,辐射河7322等。

似乎它们都遵循形容词-名词4位数字的模式(大部分情况下)。他们是否只是简单地输入了一些形容词和名词的字典,然后在按下应用程序时从中随机选择组合?是否有一个完成此任务的Ruby gem ,或者提供了一本可以按词性搜索的字典,还是需要手动完成?

最佳答案

这里的Heroku API团队的工程师:我们采用了最简单的方法来生成应用名称,这基本上就是您的建议:将形容词和名词的数组保留在内存中,从每个元素中随机选择一个元素,并将其与一个随机数组合1000至9999。

这不是我编写的最激动人心的代码,但是很有趣的是,我们看到了要进行扩展才能做到的事情:

  • 首先,我们选择一个名称,尝试使用INSERT,然后挽救唯一性约束错误以选择另一个名称。在我们拥有大量名称(以及使用它们的应用程序不太多的情况)的情况下,此方法可以很好地工作,但是在某种程度上,我们开始注意到在名称生成过程中发生了很多冲突。

    为了使其更具 flex ,我们决定选择多个名称,并通过单个查询检查哪些名称仍然可用。显然,由于存在竞争条件,我们仍然需要检查错误并重试,但是表中有如此多的应用程序,显然更有效。

    如果我们的名字池很低,它还具有一个方便的钩子(Hook)让我们获得警报的好处(例如:如果抽取了1/3的随机名称,则发送警报)。
  • 第一次遇到冲突时,我们只是从2位到4位从根本上增加了名称池的大小。有了61个形容词和74个名词,这使我们的名称从〜400k增至〜40mi(61 * 74 * 8999)。
  • 但是,到我们运行200万个应用程序时,我们又开始接收碰撞警报,并且接收速度比预期的要高得多:大约一半的名称正在冲突,考虑到池的大小和正在运行的应用程序的数量,这毫无意义。

    您可能已经猜到的罪魁祸首是rand是一个非常糟糕的pseudorandom number generator。相反,使用SecureRandom选择随机元素和数字可以从根本上降低冲突的数量,使其与我们最初期望的相匹配。

  • 由于要进行大量工作来扩展此方法,因此我们不得不问是否有更好的方法来首先生成名称。讨论的一些想法是:
  • 使名称生成成为应用程序ID的功能。这样会更快,并且完全避免了冲突的问题,但是缺点是删除的应用程序浪费了很多名称(该死,作为不同集成测试的一部分,我们很快创建并删除了很多应用程序) 。
  • 使名称生成具有确定性的另一种方法是在数据库中具有可用名称池。这样可以轻松地执行操作,例如仅在删除应用程序2周后重新使用名称。

  • 很高兴看到下次碰撞警报触发时我们将要做什么!

    希望这可以帮助任何从事友好名称生成工作的人。

    关于ruby - 如何以编程方式生成类似于Heroku的子域名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7621341/

    10-12 01:33
    查看更多