ল্যাম্পোর্ট ক্লকস এবং বিতরণ করা ডেটাবেসগুলি ভিজ্যুয়ালাইজ করা

বিতরণ সিস্টেম এবং প্রতিক্রিয়া / টাইপস্ক্রিপ্ট মধ্যে একটি ডুব

পেক্সেলস থেকে অ্যান্টন মাকারেঙ্কো ছবি

বিকল্প টাইমলাইন

এক সকালে ঘুম থেকে উঠে ভাবুন, "আরে, আমি একটি বিতরণ করা ডাটাবেস তৈরি করব!"

কি, সবাই তা করে না? যাইহোক, আমি যখন এই প্রকল্পটি শুরু করি তখন আমার সেই লক্ষ্যটি মনে ছিল না। পরিবর্তে, আমি ঘড়ি সম্পর্কে আমার বিভ্রান্তি দূর করতে চেয়েছিলাম।

যৌক্তিক সময়

সফটওয়্যার ইঞ্জিনিয়ারিং ডেইলি এর এই পর্বে আমি প্রথম ল্যাম্পোর্টের ঘড়িগুলি সম্পর্কে শুনেছিলাম। ইন্টারভিউগুলিতে প্রচুর নিবন্ধগুলি সেগুলি ব্যাখ্যা করে।

একটি বার্তা পাবেন? এক যোগ কর. একটি বার্তা পাঠান? এক যোগ কর.

যাইহোক, প্রবন্ধগুলির কোনওটিই ব্যাখ্যা করল না কেন সিস্টেমগুলিকে এই অদ্ভুত ঘড়ি দরকার। তাই আমি বলেছিলাম, "এটি স্ক্রু করুন, আমি একটি ডেটাবেস তৈরি করব এবং নিজের জন্য সন্ধান করব।" অনেক আগেই আমি একাধিক লেখার অনুরোধগুলি প্রেরণ শুরু করি এবং মডেলটি কখনও কখনও ভুলভাবে ডেটা রেকর্ড করে। এখানে একটি উদাহরণ:

একের পর এক ডাটাবেসে দুটি অপারেশন প্রেরণ করা যাক।

  • প্রথমে আমরা আইটেম 1 = আপেল প্রেরণ করি।
  • এর ঠিক পরে আমরা আইটেম 1 = কলা প্রেরণ করি।
  • এই ক্রিয়াকলাপগুলি সমাপ্ত হওয়ার পরে, আমরা ডাটাবেসটি আইটেম 1 = কলা ফেরত প্রত্যাশা করি।

যদি আমাদের অনুরোধগুলি এলোমেলো নেটওয়ার্কের বিলম্বের কারণে রুটে পাল্টে যায় তবে কী হবে?

  • আইটেম 1 = কলা প্রথমে আসে এবং এটি ডাটাবেসে লেখা হয়।
  • আইটেম 1 = আপেল দ্বিতীয় আসে এবং এটি ডাটাবেসে লেখা হয়।
  • ডাটাবেসটি আইটেম 1 = আপেল দেয় কারণ সেই অনুরোধটি শেষ হয়েছিল arrived
  • এটি ভুল - ডাটাবেসটি আইটেম 1 = কলা ফিরিয়ে আনতে হবে।
পিক্সেল থেকে আলেকজান্ডার পাসারিকের ছবি

ল্যাম্পোর্ট ক্লকগুলি প্রতিটি বার্তার সাথে টাইমস্ট্যাম্পগুলি অন্তর্ভুক্ত করে কলা অদৃশ্য হওয়া প্রতিরোধ করে। আপেল টাইমস্ট্যাম্প 1 এর সাথে প্রেরণ করা হয়, এবং কলা 2 টি টাইমস্ট্যাম্প সহ প্রেরণ করা হয় 2 এখন, ডাটাবেসটি জানে যে কলা দ্বিতীয় পাঠানো হয়েছিল কারণ এর টাইমস্ট্যাম্প অ্যাপলের টাইমস্ট্যাম্পের চেয়ে বেশি। আমরা আমাদের পটাসিয়াম রাখি, এবং ডাটাবেসটি সঠিক।

যৌক্তিক ঘড়িগুলি কার্যক্ষম দেখতে, আমার বিতরণকৃত ডাটাবেস সিমুলেশনটি https://hatisdist.com এ দেখুন। এখন, আমরা কীভাবে প্রতিক্রিয়া এবং টাইপস্ক্রিপ্ট সহ একটি বাস্তব-সময় বিতরণ ডাটাবেস সিমুলেশন তৈরি করব?

অ্যাপ্লিকেশন আর্কিটেকচার

এই প্রকল্পের 3 টি প্রধান উপাদান রয়েছে এবং আপনি আমার গিথুব রেপোতে উত্স কোডটি দেখতে পারেন।

  1. মূল তথ্য মডেল
  2. সামনের প্রান্ত
  3. "এপিআই" উপাদান
পেক্সেল থেকে পোক রি দ্বারা ছবি

মূল তথ্য মডেল

টাইপস্ক্রিপ্ট দিয়ে নির্মিত: নোড.টিস, নেটওয়ার্ক.টেস

আমি কিছু সহজ সূচনা অনুমান সহ এই প্রকল্পটি তৈরি করেছি: প্রতিটি নোডের একটি এলোমেলো সংযোগ থাকবে এবং অন্যান্য নোডে বার্তা প্রেরণে এলোমেলো নেটওয়ার্কের বিলম্ব হবে। ফলাফল ফলাফলের মডেলগুলি এখানে:

নেটওয়ার্ক অবজেক্ট এলোমেলো তথ্য এবং সংযোগ সহ নোড জেনারেট করে। এটি সমস্ত নোডকে নোডম্যাপে রাখে, তারপরে প্রতিটি নোডকে নেটওয়ার্কের অন্যান্য সমস্ত নোড সন্ধানের নির্দেশ দেয়।

নোড অবজেক্টটি অ্যাপ্লিকেশনের মূল। এটি নেটওয়ার্কের সমস্ত নোডে একক বাইনারি বিতরণ করার জন্য ককরোচডিবি'র পদ্ধতি দ্বারা অনুপ্রাণিত হয়েছিল। নোডগুলি অনলাইনে আসার পরে, তারা একে অপরের সন্ধান করবে, নেটওয়ার্ক সম্পর্কে মেটাডেটা ক্যাপচার করবে এবং একটি কার্যকরী বিতরিত ডাটাবেস তৈরি করবে। এই আচরণটি অনুকরণ করে এমন কোডটি বিশেষ আকর্ষণীয়:

FindAllNodes () সমস্ত নোড সম্পর্কে মেটাডেটা সংগ্রহ করতে পুনরাবৃত্তি ব্যবহার করে। প্রতিটি নোড নেটওয়ার্ক সম্পর্কে মেটাডেটা সংগ্রহ করার জন্য এই ফাংশনটি একবার কল করে। একটি বাস্তব সিস্টেমে, 5 এবং 10 টি লাইনগুলি অন্য নোডগুলিতে API কল হবে।

এখানে একটি সমস্যা আছে। প্রতিটি পুনরাবৃত্তির ফাংশনটি মূল নোডে নয়, নতুন নোডে কল করা হবে, সুতরাং প্রতিটি নতুন নোড অবশ্যই মূল নোডে তথ্য প্রেরণ করতে সক্ষম হবে।

আমরা আসল নোডে একটি রেফারেন্স প্রেরণ করে এবং পুনরাবৃত্ত চেইন জুড়ে সেই রেফারেন্সটিকে অবিচ্ছিন্ন রেখে এই সমস্যার সমাধান করি। এটি এমন একটি পরিস্থিতি যেখানে পয়েন্টার, রেফারেন্স, বা সি / সি ++ এর মতো ভাষাগুলি বোঝার জন্য সঠিক জাভাস্ক্রিপ্ট লিখতে হবে। আমি জেএস এর আগে সি শিখেছি তাই আমি এটিকে "সি-তে চিন্তা করা" বলি এবং সামনের প্রান্তে সি-তে ভাবতে খুব আনন্দ হয়।

পিক্সেল থেকে পিক্সা স্কয়ার দ্বারা ছবি

সামনের প্রান্ত

প্রতিক্রিয়া / টাইপস্ক্রিপ্ট দিয়ে নির্মিত

সম্মুখ-প্রান্তটি ডাটাবেস কমান্ডগুলি ক্যাপচার করে এবং এপিআইতে প্রেরণ করে। এপিআই ডাটাবেসে ঘটে যাওয়া ইভেন্টগুলির একটি তালিকা এবং কখন কী ঘটেছিল তা ফিরিয়ে দেয়।

সম্মুখ-প্রান্তটি নির্দেশাবলী সম্পন্ন হওয়ার জন্য এপিআই প্রতিক্রিয়া ব্যবহার করে এবং ব্যবহারকারী কোনও প্রতিক্রিয়া ফেরানোর আগে অভ্যন্তরীণভাবে ডাটাবেস কীভাবে কাজ করে তা বোঝার জন্য যে কোনও সময় নির্দেশনা কার্যকর করতে বিরতি দিতে পারে।

আকর্ষণীয় অংশটি এখানে: এপিআই আসলে কেবলমাত্র একটি ফ্রন্ট-এন্ড উপাদান যা সিমুলেশনটি সম্পাদন করে এবং ইভেন্টের তালিকাকে অ্যাপ্লিকেশনটির বাকি অংশে ফিরিয়ে দেয়।

আমি এটিকে এটি এমনভাবে তৈরি করেছি যাতে ভবিষ্যতে যদি আসল সিমুলেশনটি ব্যাক-এন্ডে চলে যায় তবে ফ্রন্ট-এন্ডটি ইতিমধ্যে এপিআই থেকে ইভেন্টগুলির তালিকাটি তৈরি করার জন্য নির্মিত। এটি মডুলার এখন কীভাবে এপিআই সিমুলেশন করে এবং ইভেন্টের তালিকা সংগ্রহ করে?

পিক্সেল থেকে পিক্সবে দ্বারা ছবি

"এপিআই" উপাদান

Async এবং প্রতিক্রিয়াশীল প্রোগ্রামিং মার্জ করা

এখানেই জিনিসগুলি মজা পায়। নীচের কোডটিতে একটি গ্যান্ডার নিন:

সুতরাং অ্যাপ্লিকেশনটি লোড হওয়ার পরে API একটি নতুন নেটওয়ার্ক তৈরি করে এবং এতে একটি ইভেন্ট স্ট্রিম অন্তর্ভুক্ত থাকে যা RxJS থেকে সাবজেক্ট টাইপ করে। মূলত, সাবজেক্টটি ইভেন্ট ইমিটার।

ইভেন্ট স্ট্রিম.নেক্সট () কল করা হলে ইভেন্ট স্ট্রিমটি পরের () এর সাথে ডাকা বস্তুটি নির্গত করে। এটি রিয়েল-টাইমে ঘটে যাওয়া ইভেন্টগুলি নির্গত করার জন্য উপযুক্ত।

যতবারই একটি ডাটাবেস নোড বার্তা গ্রহণ বা প্রেরণ করে, এটি ইভেন্ট স্ট্রিমটি এটি প্রাপ্ত বা প্রেরিত বার্তা এবং এলোমেলো নেটওয়ার্কের বিলম্বের জন্য ব্যবহার করবে। প্রতিটি ইভেন্টের ক্রম নির্গত ইভেন্ট এবং নেটওয়ার্কের বিলম্বের সাথে আমি ইভেন্টগুলির একটি টাইমলাইন পুনরায় তৈরি করতে এবং সামনের দিকে এনিমেট করতে পারি।

তবে আমি কীভাবে এই নির্গত ঘটনাগুলি সংগ্রহ করব? সাবস্ক্রিপশন বলে এই জিনিস আছে।

সাবজেক্ট.সউসক্রাইব () কল করা হলে সাবস্ক্রিপশন অবজেক্টটি ফিরে আসে। সাবজেক্টটি ইভেন্টের উত্তোলক হলে সাবস্ক্রিপশনটি ইভেন্ট গ্রাহক। যতবারই কোনও ইভেন্ট নির্গত হয়, সাবস্ক্রাইবের মধ্যে ফাংশনটি ডাকা হয়। এই উদাহরণে, লাইন 13 বলেছে যে ইভেন্ট স্ট্রিম যখন কোনও ইভেন্ট নির্গত করে, কেবল তখনই ইভেন্টটিকে প্রসারিত ইভেন্টস অ্যারেতে চাপিয়ে দেয় (হ্যাঁ, এটি কনক্যাট হওয়া উচিত)।

সিমুলেশন শেষ হয়েছে তা নিশ্চিত না হওয়া পর্যন্ত আমি API প্রতিক্রিয়া পাঠাতে পারি না। আমি কেমন করে ঐটি করি? যাদুটির চূড়ান্ত টুকরো প্রবেশ করান, সাবস্ক্রাইব করুন () এবং প্রতিক্রিয়া প্রতিক্রিয়া:

প্রথমে 34 লাইনটি পরীক্ষা করে দেখুন the সাবস্ক্রিপশন বন্ধ হয়ে যায় এবং সাবস্ক্রাইব () কলটিতে প্রদত্ত ফাংশনটি কার্যকর করে না। ইভেন্ট স্ট্রিম এখনও যে কোনও সংখ্যক গ্রাহককে গ্রহণ করতে পারে।

এর পরে, প্রতিক্রিয়া স্থিতির পরিবর্তন apiFinishedExecutes ট্রিগার করা হয় এবং লাইন 20-এ UseEffect () অ্যানিমেশনের জন্য পুরো ইভেন্টের তালিকাটি সম্মুখের প্রান্তে সরবরাহ করে। সাব্বাস!

আপনি হয়ত ভাবছেন যে এক্সিকিউটিভস সমস্ত কম্যান্ডস () কল কীভাবে জানে যে এটি কোনও নির্দেশনা কার্যকর করে চলেছে। উত্তরটি হ'ল নোড ডেটা মডেল একটি বাস্তব API এর মতো একটি প্রতিশ্রুতি দেয়। যখন কোনও প্রতিশ্রুতি সংশোধন করা হয়, তখন প্রতিশ্রুতি.পটি () ফাংশনটি কার্যকর করে অলকমান্ডস () এ একটি কাউন্টার বাড়ায়। যখন কাউন্টারটি নির্দেশের তালিকার দৈর্ঘ্যের সমান হয়, তখন পরবর্তী পুনরাবৃত্ত কলটি একটি আপডেট সূচক যুক্তি দিয়ে তৈরি করা হয়। শেষ অবধি, চূড়ান্ত পুনরাবৃত্তির কল চলাকালীন সূচকটি সমস্ত তালিকার দৈর্ঘ্যের সমান এবং আমরা জানি যে ডাটাবেস সম্পাদন শেষ হয়েছে।

আপনি যদি সাইটটি পরীক্ষা করে দেখে থাকেন তবে আপনি সম্ভবত অনুমান করতে পারেন যে আমি একজন ভিজ্যুয়াল শিখার। আমি বিশ্বাস করি যে বেশিরভাগ ইঞ্জিনিয়ারিং ধারণাগুলি বাস্তবে তার চেয়ে অনেক বেশি কঠিন এবং ভীতিজনক বলে মনে হয় এবং সুচিন্তিত চিন্তা-ভাবনা মানুষকে অন্তর্নিহিত সরলতা দেখতে সহায়তা করে।

পড়ার জন্য ধন্যবাদ!