Distributed unique ID generator ডিজাইন (Snowflake)
একটি database counter অনেক server জুড়ে scale করে না। UUID, Snowflake-ধাঁচের ৬৪-bit ID ও ঘড়ির ফাঁদ জানুন।

লক্ষ্য: এমন ID তৈরি যা অনেক server জুড়ে অনন্য, সমন্বয় ছাড়াই দ্রুত তৈরি হয়, এবং আদর্শভাবে সময় অনুযায়ী সাজানো যায়।
Database auto-increment নয় কেন
- একক counter bottleneck ও single point of failure।
- Sharded database-এ প্রতিটি shard পরস্পর-ঢাকা সংখ্যা বানাবে।
- ক্রমিক ID জানিয়ে দেয় আপনার কতগুলো record আছে এবং অনুমান করা সহজ।
বিকল্প ১: UUID
১২৮-bit random পরিচয় (UUIDv4)। যেকোনো server এটি বানাতে পারে, collision-এর সম্ভাবনা নগণ্য।
- সুবিধা: কোনো সমন্বয় লাগে না।
- অসুবিধা: ১৬ byte, সময় অনুযায়ী সাজানো নয়। Random key database index-এর locality নষ্ট করে, তাই B-tree-তে insert ধীর ও index বড় হয়।
বিকল্প ২: সময়-ক্রমিক ID (UUIDv7, ULID)
এতে শুরুতে timestamp আর পরে random bit থাকে। ID মোটামুটি তৈরির সময় অনুযায়ী সাজানো হয়, যা index-কে সহায়ক রাখে, আর তবুও সমন্বয় লাগে না।
বিকল্প ৩: Snowflake-ধাঁচের ৬৪-bit ID
Twitter জনপ্রিয় করেছে। কয়েকটি অংশ দিয়ে গড়া ৬৪-bit পূর্ণসংখ্যা:
| অংশ | Bit | অর্থ |
|---|---|---|
| Sign | 1 | সবসময় 0 |
| Timestamp | 41 | নিজস্ব শুরুর তারিখ থেকে মিলিসেকেন্ড (প্রায় ৬৯ বছর) |
| Machine ID | 10 | কোন worker বানিয়েছে (১,০২৪ পর্যন্ত) |
| Sequence | 12 | একই মিলিসেকেন্ডের ভেতরে counter (প্রতি মেশিনে প্রতি ms-এ ৪,০৯৬) |
প্রতিটি মেশিন সেকেন্ডে প্রায় ৪০ লাখ ID বানাতে পারে। ID অনন্য (আলাদা machine bit), সময় অনুযায়ী সাজানো, এবং সাধারণ ৬৪-bit পূর্ণসংখ্যা column-এ ধরে।
যা সামলাতে হবে
- Machine ID বণ্টন: প্রতিটি worker-কে অনন্য ID দিন, coordination service (ZooKeeper/etcd) বা configuration থেকে।
- ঘড়ি পিছিয়ে যাওয়া: NTP সংশোধন সময় পিছিয়ে ডুপ্লিকেট বানাতে পারে। শনাক্ত করে অপেক্ষা করুন, বা ঘড়ি ধরা পর্যন্ত বানাতে অস্বীকার করুন।
- Sequence ছাপিয়ে যাওয়া: এক মিলিসেকেন্ডে ৪,০৯৬-এর বেশি ID লাগলে পরের মিলিসেকেন্ড পর্যন্ত অপেক্ষা করুন।
- মেশিন জুড়ে clock skew শুধু সঠিক ক্রমে প্রভাব ফেলে, অনন্যতায় নয়।
অন্য উপায়: ticket server
একটি নির্দিষ্ট সেবা app server-দের সংখ্যার block দেয়, তারা সেগুলো স্থানীয়ভাবে বণ্টন করে। সহজ, কিন্তু সেবাটিকে highly available হতে হবে।
কোনটি বাছবেন
| প্রয়োজন | পছন্দ |
|---|---|
| সবচেয়ে সহজ, সমন্বয়হীন | UUIDv4 (ভালো index-এর জন্য UUIDv7) |
| ছোট ৬৪-bit, সাজানো | Snowflake-ধাঁচ |
| কঠোর ক্রম, এক database | Sequence |
মূল কথা: সময়-ক্রমিক ID নিন। সহজতার জন্য UUIDv7, ছোট ৬৪-bit ID লাগলে Snowflake, এবং পিছিয়ে যাওয়া ঘড়ি থেকে সাবধান থাকুন।
System Design সিরিজ, পর্ব ৪ (infrastructure ডিজাইন): 1 নম্বর (মোট 4)।


