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)।

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া