Oke, ini pertanyaan yang sangat lama, yang pertama kali saya lihat sekarang.
Anda harus membedakan antara nomor urut dan ID unik yang (opsional) dapat diurutkan secara longgar berdasarkan kriteria tertentu (biasanya waktu pembuatan). Nomor urut yang benar menyiratkan pengetahuan tentang apa yang telah dilakukan semua pekerja lain, dan karena itu memerlukan status bersama. Tidak ada cara mudah untuk melakukan ini dengan cara yang terdistribusi dan berskala tinggi. Anda dapat melihat hal-hal seperti siaran jaringan, rentang berjendela untuk setiap pekerja, dan tabel hash terdistribusi untuk ID pekerja unik , tetapi ini membutuhkan banyak pekerjaan.
ID unik adalah masalah lain, ada beberapa cara bagus untuk menghasilkan ID unik dengan cara yang terdesentralisasi:
a) Anda dapat menggunakan layanan jaringan ID Snowflake Twitter . Kepingan salju adalah:
- Layanan jaringan, yaitu Anda membuat panggilan jaringan untuk mendapatkan ID unik;
- yang menghasilkan 64 bit ID unik yang diurutkan berdasarkan waktu pembuatan;
- dan layanan sangat skalabel dan (berpotensi) sangat tersedia; setiap instans dapat menghasilkan ribuan ID per detik, dan Anda dapat menjalankan beberapa instans di LAN / WAN;
- ditulis dalam Scala, berjalan di JVM.
b) Anda bisa membuat ID unik pada klien itu sendiri, menggunakan pendekatan yang diturunkan dari bagaimana UUID dan ID Snowflake dibuat. Ada beberapa opsi, tetapi sesuatu di sepanjang baris:
40 bit paling signifikan atau lebih: Stempel waktu; waktu pembuatan ID. (Kami menggunakan bit paling signifikan untuk stempel waktu agar ID dapat diurutkan berdasarkan waktu pembuatan.)
14 bit berikutnya atau lebih: Penghitung per generator, yang setiap generator bertambah satu untuk setiap ID baru yang dihasilkan. Ini memastikan bahwa ID yang dibuat pada saat yang sama (stempel waktu yang sama) tidak tumpang tindih.
10 atau lebih bit terakhir: Nilai unik untuk setiap generator. Dengan menggunakan ini, kita tidak perlu melakukan sinkronisasi apa pun antar generator (yang sangat sulit), karena semua generator menghasilkan ID yang tidak tumpang tindih karena nilai ini.
c) Anda dapat membuat ID pada klien, hanya menggunakan stempel waktu dan nilai acak. Hal ini menghindari kebutuhan untuk mengetahui semua generator, dan memberikan nilai unik pada setiap generator. Di sisi lain, ID semacam itu tidak dijamin unik secara global, mereka sangat mungkin unik. (Untuk bertabrakan, satu atau lebih generator harus membuat nilai acak yang sama pada saat yang sama.) Sesuatu di sepanjang baris:
- 32 bit paling signifikan: Stempel waktu, waktu pembuatan ID.
- 32 bit paling tidak signifikan: 32 bit keacakan, dihasilkan lagi untuk setiap ID.
d) Jalan keluar yang mudah, gunakan UUIDs / GUIDs .