2011-10-01 28 views
23

Tất cả chúng ta đều thấy các tên miền phụ thú vị mà bạn nhận được tự động gán khi bạn triển khai một ứng dụng cho Heroku với một "heroku tạo" trần.Làm cách nào để tạo các tên miền phụ giống như Heroku theo chương trình?

Một số ví dụ: blazing-mist-4652, electric-night-4641, morning-frost-5543, radiant-river-7322, v.v.

Dường như tất cả đều theo mẫu tính từ-noun-4digitnumber (phần lớn). Họ có đơn giản chỉ cần gõ một từ điển của một số tính từ và danh từ, sau đó chọn kết hợp từ chúng một cách ngẫu nhiên khi bạn đẩy một ứng dụng? Có một viên ngọc Ruby hoàn thành điều này, có lẽ cung cấp một từ điển mà người ta có thể tìm kiếm bằng các phần của lời nói, hoặc là cái gì đó phải được thực hiện thủ công?

+0

Tính từ và danh từ cũng có thể là "chữ số", trong cơ sở- [chiều dài của danh sách từ] – millimoose

Trả lời

67

Kỹ sư tại nhóm API Heroku ở đây: chúng tôi đã đi với cách tiếp cận đơn giản nhất để tạo tên ứng dụng, đó là những gì bạn đề xuất: giữ mảng các tính từ và danh từ trong bộ nhớ, chọn một phần tử từ mỗi ngẫu nhiên và kết hợp nó với một số ngẫu nhiên từ 1000 đến 9999.

Không mã ly kỳ nhất mà tôi đã viết, nhưng thật thú vị để xem những gì chúng tôi phải làm để mở rộng quy mô này:

  • Lúc đầu chúng tôi đã chọn một tên, cố gắng INSERT và sau đó giải cứu lỗi ràng buộc duy nhất để chọn một tên khác. Điều này làm việc tốt trong khi chúng tôi có một nhóm lớn các tên (và một tập hợp các ứng dụng không quá lớn), nhưng ở một quy mô nhất định, chúng tôi bắt đầu nhận thấy rất nhiều xung đột trong quá trình tạo tên.

    Để làm cho nó linh hoạt hơn, chúng tôi quyết định chọn một vài tên và kiểm tra tên nào vẫn có sẵn với một truy vấn. Chúng tôi rõ ràng vẫn cần phải kiểm tra lỗi và thử lại vì điều kiện chủng tộc, nhưng với rất nhiều ứng dụng trong bảng này rõ ràng là hiệu quả hơn.

    Nó cũng có lợi ích bổ sung là cung cấp một móc dễ dàng để chúng tôi nhận được cảnh báo nếu tên nhóm của chúng tôi thấp (ví dụ: nếu 1/3 tên ngẫu nhiên được chụp, gửi cảnh báo). Lần đầu tiên chúng tôi gặp vấn đề với va chạm, chúng tôi chỉ tăng kích thước của tên nhóm bằng cách tăng từ 2 chữ số lên 4. Với 61 tính từ và 74 danh từ chúng tôi lấy từ ~ 400k đến ~ 40mi tên (61 * 74 * 8999) .

  • Nhưng vào thời điểm chúng tôi chạy 2 triệu ứng dụng, chúng tôi bắt đầu nhận cảnh báo va chạm một lần nữa và với tốc độ cao hơn nhiều so với dự kiến: Khoảng một nửa số tên bị va chạm, điều không có ý nghĩa khi xem xét kích thước và số lượng hồ bơi của chúng tôi ứng dụng đang chạy.

    Thủ phạm như bạn có thể đã đoán là rand là khá xấu pseudorandom number generator. Chọn các phần tử và số ngẫu nhiên với SecureRandom thay vì giảm triệt để lượng va chạm, làm cho nó phù hợp với những gì chúng tôi mong đợi ở vị trí đầu tiên.

Với rất nhiều công việc sẽ mở rộng phương pháp này, chúng tôi phải hỏi liệu có cách nào tốt hơn để tạo tên ở vị trí đầu tiên không. Một số ý tưởng được thảo luận là:

  • Làm cho tên tạo ra một chức năng của id ứng dụng. Điều này sẽ nhanh hơn nhiều và tránh vấn đề với va chạm hoàn toàn, nhưng ngược lại nó sẽ lãng phí rất nhiều tên với các ứng dụng đã xóa (và chết tiệt, chúng ta có rất nhiều ứng dụng được tạo và xóa ngay sau khi thử nghiệm tích hợp khác nhau) .

  • Một tùy chọn khác để xác định tạo tên là có nhóm tên có sẵn trong cơ sở dữ liệu. Điều này sẽ giúp bạn dễ dàng thực hiện những việc như chỉ sử dụng lại tên 2 tuần sau khi ứng dụng bị xóa.

Vui mừng khi xem những gì chúng tôi sẽ làm vào lần tới khi cảnh báo va chạm kích hoạt!

Hy vọng điều này sẽ giúp mọi người làm việc trên thế hệ tên thân thiện trên mạng.

+1

Điều đó thật tuyệt ... cái gì cần được xem xét, để duy trì số lượng tên phân phối 'bình đẳng', là ngẫu nhiên với giá trị suy nghĩ về tỷ lệ tên, để các tên được sử dụng nhiều hơn, ít có cơ hội hơn đến lần sau ... (Được sử dụng trong bộ lọc hạt cho ví dụ.) =) –

+0

@ IvanSeidel Tôi thích ý tưởng của bạn! – Benoit

10

Có một số khả năng.

Bạn có thể generate a random string.

Nếu bạn muốn sử dụng các từ thực, bạn cần một từ điển. Sau đó, bạn có thể tạo ra một kết quả tạo ra một hoán vị của các từ và chữ số.

Một lựa chọn tốt khác là phương án được chấp nhận bởi Ruote. Ruote dựa trên rufus-mnemo để tạo một tên duy nhất cho mỗi quá trình. rufus-mnemo cung cấp các phương pháp để biến số nguyên thành dễ nhớ hơn ‘từ’ và ngược lại.

Bạn có thể tạo id duy nhất cho bản ghi, sau đó chuyển đổi nó thành một từ.

+0

rufus-mnemo trông rất tuyệt, cảm ơn liên kết! – dkulchenko

Các vấn đề liên quan