34

我们都看到了当您通过简单的“heroku create”将应用程序部署到 Heroku 时自动分配的有趣子域。

一些例子:blazing-mist-4652、electric-night-4641、morning-frost-5543、radiant-river-7322,等等。

似乎它们都遵循形容词-名词-4digitnumber 模式(大部分)。他们是否只是简单地打出一些形容词和名词的字典,然后在你推送应用时随机选择组合?是否有一个 Ruby gem 可以做到这一点,也许提供一个可以通过词性搜索的字典,或者这是手动完成的事情?

4

4 回答 4

92

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

这不是我写过的最激动人心的代码,但有趣的是看看我们必须做什么才能扩展它:

  • 起初我们选择一个名称,尝试INSERT然后挽救唯一性约束错误以选择一个不同的名称。当我们有大量名称(以及使用它们的应用程序不是那么大)时,这工作得很好,但是在一定规模上,我们开始注意到名称生成过程中出现了很多冲突。

    为了使其更具弹性,我们决定选择几个名称并检查哪些名称仍可用于单个查询。由于竞争条件,我们显然仍然需要检查错误并重试,但是表中有这么多应用程序,这显然更有效。

    它还有一个额外的好处,就是为我们提供了一个简单的钩子,以便在我们的名称池低时获得警报(例如:如果随机名称的 1/3 被采用,则发送警报)。

  • 我们第一次遇到冲突问题时,我们只是通过从 2 位数字增加到 4 位数字从根本上增加了名称池的大小。有了 61 个形容词和 74 个名词,这使我们的名称从 ~400k 增加到 ~40mi ( 61 * 74 * 8999)。

  • 但是当我们运行 200 万个应用程序时,我们再次开始收到碰撞警报,而且速度比预期的要高得多:大约一半的名称发生了碰撞,考虑到我们的池大小和正在运行的应用程序数量,这毫无意义。

    您可能已经猜到的罪魁祸首是这rand是一个非常糟糕的伪随机数生成器。相反,选择随机元素和数字SecureRandom从根本上降低了碰撞的数量,使其符合我们最初的预期。

由于要扩展这种方法的工作量如此之大,我们不得不首先询问是否有更好的方法来生成名称。讨论的一些想法是:

  • 使名称生成成为应用程序 ID 的函数。这会更快并完全避免冲突问题,但不利的一面是,它会浪费大量名称与已删除的应用程序(该死,作为不同集成测试的一部分,我们很快就会创建和删除很多应用程序) .

  • 使名称生成具有确定性的另一个选择是在数据库中拥有可用名称池。这样可以很容易地做一些事情,比如只在应用程序被删除 2 周后重用名称。

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

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

于 2013-11-18T22:56:34.823 回答
10

有几种可能性。

您可以生成一个随机字符串

如果你想使用真实的单词,你需要一本字典。然后,您可以创建一个生成单词和数字排列的结果。

另一个不错的替代方案是Ruote采用的替代方案。Ruote依赖rufus-mnemo为每个进程生成一个唯一的名称。rufus-mnemo提供了将整数转换为更容易记住的“单词”的方法,反之亦然。

您可以为记录生成唯一的 id,然后将其转换为单词。

于 2011-10-02T12:19:17.527 回答
10

我创建了一个 gem 来做到这一点:RandomUsername

类似的宝石是BazaarFaker

于 2014-09-08T06:00:54.953 回答
0

感谢@m1foley

我正在使用你的 gem https://github.com/polleverywhere/random_username


生成随机名称:

num_size = 2 # you can change this value to change number size
temp_num = (Array.new(num_size) { rand(10).to_s }).join
app_url = RandomUsername.adjective + '-' + RandomUsername.noun + '-' + temp_num

解释:

  1. 首先生成两位数
  2. 然后生成一个形容词
  3. 然后生成一个名词
  4. 最后与破折号(-)连接:形容词+名词+ temp_num

一些生成的名称:

# caring-plateau-07
# teal-summer-32
# vivid-snowflake-25
# outrageous-summer-95
于 2021-05-10T19:15:47.123 回答