如何以编程方式生成类似Heroku的子域名?

37
我们都见过在Heroku上使用“heroku create”命令部署应用程序时自动分配的有趣子域名。
一些例子包括:blazing-mist-4652,electric-night-4641,morning-frost-5543,radiant-river-7322等。
似乎它们都遵循形容词-名词-4位数字的模式(大部分情况下)。他们是否只是输入了一本形容词和名词组成的字典,并在您推送应用程序时从中随机选择组合?是否有一个Ruby gem可以做到这一点,并提供一个按语法类别搜索的字典,或者这是需要手动完成的事情?

形容词和名词也可以是“数字”,基于[单词列表的长度]。 - millimoose
4个回答

99

我是 Heroku API 团队的工程师:我们采用了最简单的方法生成应用程序名称,即在内存中保留形容词和名词的数组,随机选择每个元素并与 1000 到 9999 的随机数字结合。

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

  • 起初,我们选择一个名称,尝试插入并通过救援唯一性约束错误选择不同的名称。当我们拥有大量名称池(和使用它们的应用程序集不太大)时,这很好运行,但在某种规模上,我们开始注意到在名称生成期间出现许多冲突。

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

    它还具有提供简单钩子的额外好处,因此我们可以获取警报,如果名称池较低(例如:如果取走 1/3 的随机名称,则发送警报)。

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

  • 但是当我们运行了 200 万个应用程序时,我们开始再次收到冲突警报,并且高于预期的频率:约一半的名称会发生冲突,这在考虑到我们的池大小和运行的应用程序数量后没有任何意义。

    罪魁祸首正如您可能已经猜到的那样是,rand 是一个相当糟糕的伪随机数生成器。改为使用 SecureRandom 来选择随机元素和数字根据我们的预期显著降低了冲突的数量。

在大量工作投入到扩展这个方法中之后,我们不得不思考是否有更好的方法来首先生成名称。一些讨论的想法包括:

  • 将名称生成作为应用程序ID的函数。这样做会更快,完全避免了冲突问题,但缺点是会浪费很多被删除应用的名称(我们创建和删除很多应用程序,作为不同集成测试的一部分)。

  • 另一个确定性生成名称的选项是在数据库中使用可用名称池。这将使诸如仅在应用程序删除后2周内重新使用名称等操作变得容易。

很期待下一次冲突警报触发时我们将做些什么!

希望这对任何正在开发友好名称生成的人有所帮助。


2
很好...需要考虑的一点是,为了保持“平均”分布的名称数量,应该使用名称出现频率的加权值进行随机化,这样更常用的名称下次出现的机会就会减少...(例如在粒子滤波器中使用) =) - Ivan Seidel
@IvanSeidel 我喜欢你的想法! - Benny

11

10

有几种可能性。

你可以生成随机字符串

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

另一个不错的选择是Ruote所采用的方法。Ruote依赖于rufus-mnemo为每个进程生成唯一的名称。rufus-mnemo提供了将整数转换成更易记住的“单词”以及反之的方法。

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


1

感谢 @m1foley

我正在使用你的宝石 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. 最后拼接在一起,并用短横线(-)隔开:形容词 + 名词 + 临时数字

一些生成的名称:

# caring-plateau-07
# teal-summer-32
# vivid-snowflake-25
# outrageous-summer-95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接