Tamam, bu çok eski bir soru, şimdi ilk gördüğüm.
Belirli bir kritere göre (tipik olarak oluşturma zamanı) (isteğe bağlı olarak) gevşek bir şekilde sıralanabilen sıra numaraları ve benzersiz kimlikler arasında ayrım yapmanız gerekir . Gerçek sıra numaraları, diğer tüm çalışanların yaptıklarına dair bilgi anlamına gelir ve bu nedenle ortak durumu gerektirir. Bunu dağıtılmış, yüksek ölçekli bir şekilde yapmanın kolay bir yolu yoktur. Ağ yayınları, her çalışan için pencereli aralıklar ve benzersiz çalışan kimlikleri için dağıtılmış karma tablolar gibi şeylere bakabilirsiniz , ancak bu çok fazla iştir.
Benzersiz kimlikler başka bir konudur, merkezi olmayan bir şekilde benzersiz kimlikler oluşturmanın birkaç iyi yolu vardır:
a) Twitter'ın Kar Tanesi Kimliği ağ hizmetini kullanabilirsiniz . Kar tanesi bir:
- Ağ hizmeti, yani benzersiz bir kimlik almak için bir ağ araması yaparsınız;
- üretim zamanına göre sıralanan 64 bit benzersiz kimlikler üreten;
- ve hizmet son derece ölçeklenebilir ve (potansiyel olarak) yüksek düzeyde kullanılabilir; her bir örnek saniyede binlerce kimlik oluşturabilir ve LAN / WAN'ınızda birden çok örnek çalıştırabilirsiniz;
- Scala'da yazılmıştır, JVM'de çalışır.
b) UUID'lerin ve Snowflake'in kimliklerinin nasıl yapıldığından türetilen bir yaklaşımı kullanarak istemcilerin kendileri üzerinde benzersiz kimlikler üretebilirsiniz . Birden fazla seçenek var, ancak şu satırlarda bir şey var:
En önemli 40 veya daha fazla bit: Bir zaman damgası; kimliğin oluşturulma zamanı. (Kimlikleri oluşturma zamanına göre sıralanabilir hale getirmek için zaman damgası için en önemli bitleri kullanıyoruz.)
Sonraki 14 ya da öylesine bit: Oluşturulan her yeni kimlik için her jeneratörün birer birer arttığı, jeneratör başına bir sayaç . Bu, aynı anda (aynı zaman damgaları) oluşturulan kimliklerin çakışmamasını sağlar.
Son 10 veya daha fazla bit: Her bir oluşturucu için benzersiz bir değer.Bunu kullanarak, jeneratörler arasında herhangi bir senkronizasyon yapmamıza gerek yoktur (ki bu son derece zordur), çünkü tüm jeneratörler bu değer nedeniyle çakışmayan ID'ler üretirler.
c) Yalnızca bir zaman damgası ve rastgele bir değer kullanarak istemcilerde kimlikler oluşturabilirsiniz . Bu, tüm jeneratörleri tanıma ve her jeneratöre benzersiz bir değer atama ihtiyacını ortadan kaldırır. Diğer taraftan, bu tür kimliklerin küresel olarak benzersiz olması garanti edilmez , yalnızca çok büyük olasılıkla benzersizdir. (Çarpışmak için, bir veya daha fazla üreticinin aynı anda aynı rastgele değeri yaratması gerekir.) Şu satırlar boyunca bir şey:
- En önemli 32 bit: Zaman damgası, kimliğin oluşturulma zamanı.
- En az önemli 32 bit: 32 bitlik rastgelelik, her kimlik için yeniden oluşturuldu.
d) Kolay çıkış yolu, UUID'leri / GUID'leri kullanın .