কম্পিউটার টিউটোরিয়াল

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

পোর্টফোলিও মালামাল এবং সম্পদ ব্যবস্থাপনা উদ্যোগের ভিত্তি। হ্যারি মার্কোউইটস আধুনিক পোর্টফোলিও তত্ত্ব أوائل হলে, সম্পদ এবং মালামাল ব্যবস্থাপনা পেশাদাররা তাদের পোর্টফোলিওর রিটার্ন একটি নির্দিষ্ট ঝুঁকির স্তরে সর্বাধিক করার पीछे এবং আক্রান্ত रहे। আজ, উদ্যোগের পেশাদারদের সাথে মিলিয়ন মিলিয়ন রিটেইল বিনিয়োগকারীরা যোগ দিয়েছে, যারা বিনিয়োগের τοπograpহি চিরকালের জন্য পরিবর্তন করেছে। এই নতুন প্রবেশকারীরা রিটেইল ব্রোকারেজ, এক্সচেঞ্জ, এবং ক্লিয়ারিং হাউসের ট্রেডিং ইনফ্রাস্ট্রাকচারের অন্তর্নিহিত প্রযুক্তির জন্য বিশাল প্রতिफলন তৈরি করছে।

উদাহরণস্বরূপ, জানুয়ারি ২০২১-এর গেমস্টপ স্টক উন্মাদন호를 নিন। রিটেইল বিনিয়োগকারীরা রেকর্ড লেভেলে গেমস্টপ স্টক ট্রেড করা শুরু করল। এই বিনিয়োগকারীরা অন্যান্য মিম স্টকের মতো AMC এন্টারটেইনমেন্ট-এও ঢুকতে শুরু করল, যার ফলে সামগ্রিক বাজারের ভোলাটিলিটি কিছু ট্রেডিং দিনের মধ্যে ৭৬% এর চেয়ে বেশি বেড়ে গেল VIX দ্বারা পরিমাপিত। এই ভোলাটিলিটি হাজার হাজার সিকিউরিটিজের ওপর প্রাইস প্রেশার তৈরি করল। মিলিয়ন মিলিয়ন বিনিয়োগকারী একই সময়ে তাদের পোর্টফোলিও অ্যাক্সেস করার চেষ্টা করল, কিন্তু অ্যাপ্লিকেশনগুলো ডিমांडের সাথে তাল মিলাতে পারল না। বিনিয়োগকারীরা তাদের অ্যাপ্লিকেশন তাদের সবচেয়ে বেশি দরকার যখন ভালো পারফর্ম করে না এমন কোম্পানিগুলোর প্রতি দয়ালু নন।

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

এই উত্তেজনাপূর্ণ সময়ে, অধিকাংশ বিনিয়োগকারী তাদের পোর্টফোলিও সম্পর্কে দুটি ডেটা পয়েন্ট খুঁজে পান যা তাদের সর্বদা অ্যাক্সেস করতে হয়:

  1. उस সময় পোর্টফোলিওর মোট মূল্য কত?
  2. তাদের পোর্টফোলিওর নির্দিষ্ট সিকিউরিটিজের লাফ বা ক্ষতি কত?

এই প্রশ্ন들의 উত্তর একটি বিনিয়োগকারীকে নির্দিষ্ট সিকিউরিটিজ কেনা, বेचা, বা ধরে রাখতে পরিচালিত করতে পারে। আজকের দ্রুত গতিবান বাজারে, যেকোনো বিলম্ব হারানো সুযোগ এবং লাভ বোঝাতে পারে। আপনাকে এই প্রশ্নগুলোর উত্তর দিতে রিয়েল-টাইম প্রাইস অ্যাক্সেসের দরকার—যদিও দুটি বড় চ্যালেঞ্জ আছে:

  • হাজার হাজার সিকিউরিটিজের প্রাইস একসাথে আপডেট করা
  • একই সাথে মিলিয়ন মিলিয়ন কাস্টমার রিকোয়েস্টের উত্তর দেওয়া।

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

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

এই নেক্স্ট-জেনারেশন চ্যালেঞ্জগুলো তুচ্ছ নয় এবং ডিস্ক-ভিত্তিক ডাটাবেস দিয়ে সহজে সমাধান করা যায় না, যেগুলো মিলিয়ন মিলিয়ন অপারেশনต่อ সেকেন্ড হ্যান্ডল করার জন্য ডিজাইন করা হয়নি। আর্থিক উদ্যোগের প্রয়োজনীয়তাগুলো একটি ডাটাবেস চাই যা সহজে স্কেল করতে পারে এবং প্রতি সেকেন্ডে শতকোটি অপারেশন হ্যান্ডল করতে পারে। এখানে রেডিস এন্টারপ্রাইজ আসে, একটি ইন-মেমরি ডাটাবেস প্ল্যাটফর্ম, যা এই múltiত চ্যালেঞ্জ মোকাবিলা করার সম্ভাবনা রাখে।

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

এটি আর্থিক জগতে বিভিন্ন রিয়েল-টাইম ইউজ কেস কভার করা ব্লগ সিরিজের প্রথম পোস্ট। আমরা প্রতিটি ইউজ কেসের বিবরণ এবং ব্যবসায়িক চ্যালেঞ্জ এবং সেগুলো সমাধান করার মে রেডিস এন্টারপ্রাইজের ভূমিকা আলোচনা করব। ব্লগের অংশ হিসেবে, আমরা স্যাম্পল ডিজাইন, ডেটা মডেল, এবং কোড স্যাম্পল অফার করব। আমরা প্রতিটি পদ্ধতির পক্ষ ও विपক্ষও আলোচনা করব।

এই ব্লগ পোস্টে আমরা নিচের বিষয়গুলো কভার করব:

  • রেডিস এন্টারপ্রাইজে হাই-পারফরম্যান্স এবং স্কেলেবল সিকিউরিটিজ পোর্টফোলিও ডেটা মডেলের একটি স্যাম্পল ইমপ্লিমেন্টেশন।
  • ব্রোকারেজ এক্সচেঞ্জ থেকে সর্বশেষ দাম পাওয়ার সাথে সাথে পোর্টফোলিওতে সিকিউরিটিজের দাম রিয়েল-টাইমে আপডেট করা।

একবার ক্লায়েন্ট অ্যাপ পোর্টফোলিও রিট্রিভ করে এবং সর্বশেষ দাম পেতে থাকলে, সেটি করতে পারে:

  • পোর্টফোলিওর মোট মূল্য ক্যালকুলেট করা।
  • প্রতিটি পোর্টফোলিও хол্ডিং-এর লাফ বা ক্ষতি ক্যালকুলেট করা।

সিকিউরিটিজ পোর্টফোলিও ডেটা মডেল

চলুন একটি পোর্টফোলিওতে একটি хол্ডিং মডেলিং দিয়ে শুরু করি। নিচের ইলাস্ট্রেশনতে, CVS Health Corp. (NYSE: CVS) আমাদের উদাহরণ хол্ডিংগুলির একটি। CVS-এর দুটি আলাদা লট ছিল—প্রথমটি জানুয়ারি ৪, ২০২১-এ অর্জিত এবং দ্বিতীয়টি মার্চ ১, ২০২১-এ। প্রতিটি লটের জন্য কেনা ট্রেডে একই সংখ্যক শেয়ার কেনা হয়েছিল। দুটি ট্রেডই ১০ শেয়ারের ছিল, তবে ভিন্ন প্রতি শেয়ার দামে—প্রথম লটের জন্য $৬৮.৩৩৭৮ এবং দ্বিতীয় লটের জন্য $৬৮.৮২। পোর্টফোলিওতে CVS хол্ডিং-এর মোট পরিমাণ ২০ যার গড় খরচ নিচের মতো ক্যালকুলেট করা হয়েছে: (($৬৮.৩৩৭৮ * ১০) + ($৬৮.৮২ * ১০))/২০ = $৬৮.৫৭৮৯ প্রতি শেয়ার।

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

প্রয়োজনীয়তাগুলো ইমপ্লিমেন্ট করা

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

রেডিসের ডেটা রিপ্রেজেন্টেশন ফ্ল্যাট—উদাহরণস্বরূপ, সেটের ভিতর সেট এম্বেড করা যায় না। তাই ER ডায়াগ্রাম দ্বারা বর্ণিত ডেটা মডেল সরাসরি ইমপ্লিমেন্ট করা সম্ভব নয়। এন্টিটি মডেল সরাসরি ইমপ্লিমেন্ট করলে望んだ পারফরম্যান্স বৈশিষ্ট্যগুলো নাও আসতে পারে, তাই আপনাকে একটু ভিন্নভাবে চিন্তা করতে হবে যখন আপনি ইমপ্লিমেন্টেশনের পরে যাবেন। এই অনুচ্ছেদে আমরা রেডিস ব্যবহার করে হাই-পারফরম্যান্স এবং স্কেলিং ইমপ্লিমেন্টেশন ডিজাইন করার সময় প্রয়োজনীয় কিছু বেসিক ডিজাইন প্রিন্সিপেল কভার করব।

এই ডেটা মডেলে নিচের এন্টিটিগুলো উল্লেখ করা হয়েছে:

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

ER ডায়াগ্রাম একটি ভিজ্যুয়াল রিপ্রেজেন্টেশন যা কী ঘটছে তা দেখতে সাহায্য করে।

উপরের ডায়াগ্রামে যা অনুপস্থিত সেটি হলো ইনকামিং প্রাইসের সেট যদিও সেগুলো সিকিউরিটির প্রাইস হিস্টরিতে রেকর্ড করা থাকে—এবং क्षणিক মূল্য এবং লাফ এর ক্যালকুলেশন প্রাইস পরিবর্তনশীল হলে। সুতরাং, ER ডায়াগ্রাম তুলনামূলকভাবে স্ট্যাটিক ডেটাকে প্রতিনিধিত্ব করে যা পোর্টফোলিও ভ্যালুয়েশনের প্রেক্ষাপট।

সামগ্রিক আর্কিটেকচার

এই সিস্টেম সম্পর্কে বিবেচনা করতে হবে মূল পয়েন্টগুলো:

  • সময়ানুকূলতা (লেটেন্সি) অত্যন্ত গুরুত্বপূর্ণ। এটি সামগ্রিক চালচলিত বৈশিষ্ট্য।
  • পোর্টফোলিও ভ্যালু ক্যালকুলেশন অ্যাকাউন্ট-স্পেসিফিক ডেটা (যেমন লট ইনফরমেশন) এবং অ্যাকাউন্টগুলোর মধ্যে শেয়ার করা ডেটা (যেমন সিকিউরিটি প্রাইস) কাম্বাইন করে। অ্যাকাউন্ট-স্পেসিফিক ডেটা এই প্রেক্ষাপট যেখানে শেয়ার করা ডেটা ব্যবহৃত হয়।
  • পোর্টফোলিও ভ্যালু শুধু সেই অ্যাকাউন্টগুলোর জন্য ক্যালকুলেট করতে হয় যেখানে বিনিয়োগকারী অনলাইনে আছে (মোট অ্যাকাউন্টের একটি অংশ)।
  • ডেটা সিস্টেমের মাধ্যমে প্রবাহিত হয়, এক্সচেঞ্জ থেকে যেখানে প্রাইস তৈরি হয় ক্লায়েন্ট মেশিনগুলোর (ব্রাউজার, মোবাইল ফোন অ্যাপ্লিকেশন) পর্যন্ত যারা অনলাইন বিনিয়োগকারীদের পোর্টফোলিও ভ্যালু প্রদর্শন করে।
  • উচ্চ ডাইনামিজমের নির্দিষ্ট এলাকাগুলো شامل ইনপুট ডেটা ফ্লোর রেট এবং অনলাইন বিনিয়োগকারীর সংখ্যা।

এই পয়েন্টগুলো দেওয়া থাকলে, কিছু সাধারণ পদ্ধতি:

  • রেডিসের ইন-মেমরি আর্কিটেকচারের উপর নির্ভর করে স্ট্যাটিক এবং ডাইনামিক ডেটা উভয়ের জন্য কম লেটেন্সি অ্যাক্সেস।
  • রেডিসের ডেটা স্ট্রাকচার ব্যবহার করে ডেটা মডেলিং অপ্টিমাইজ করা যাতে ধীরে ধীরে পরিবর্তনশীল প্রেক্ষাপটের ডেটা দ্রুত অ্যাক্সেসযোগ্য হয়।
  • রেডিসের কমিউনিকেশন স্ট্রাকচার (স্ট্রিমস, কনসিউমার গ্রুপস, Pub/Sub) ব্যবহার করে ডাইনামিক ডেটা প্রয়োজনীয়তা হ্যান্ডল করা।
  • সামগ্রিক সিস্টেম পারফরম্যান্স প্রভাবিত না করে শুধু প্রয়োজনীয় ডেটা সংরক্ষণ করা।
  • ক্লায়েন্ট-স্পেসিফিক ক্যালকুলেশন ক্লায়েন্টদের নিজেদের উপর ইমপ্লিমেন্ট করা। এটি অনলাইন বিনিয়োগকারীর সংখ্যার সাথে স্বাভাবিকভাবে এবং স্বয়ংক্রিয়ভাবে স্কেল করে, স্কেলের ভার অনেকটাই কমিয়ে দেয়।

এখানে প্রধান কম্পিউটেশনাল কম্পোনেন্ট এবং ডেটা ফ্লো:

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

দ্রষ্টব্য যে রেডিস এন্টারপ্রাইজ এক বা একাধিক নোড নিয়ে গঠিত অনেক মেশিনের ওপর—অন-প্রেমিসেস, কуберনেটস, হাইব্রিড ক্লাউড ডিপ্লয়মেন্ট, ম্যানেজড সার্ভিস, বা নেটিভ ফার্স্ট পার্টি ক্লাউড সার্ভিস—এবং সেখানে লাখ লাখ বিনিয়োগকারী অনলাইনে থাকবে তাদের পছন্দের ক্লায়েন্টসহ।

রেডিস এন্টারপ্রাইজ কম্পোনেন্টস

সিকিউরিটি প্রাইস আপডেটগুলো রেডিস স্ট্রিমস দ্বারা শোষিত হবে। সিকিউরিটিজের আপডেটগুলো এই স্ট্রিমে মিক্সড থাকবে এবং ডেটা উপযোগী बनाने জন্য ডিসএগ্রিগেট করতে হবে। একটি কনসিউমার গ্রুপ ব্যবহার করা হবে সেই ডিসএগ্রিগেশন এবং ডেটা প্রসেস করার জন্য দুটি স্ট্রাকচারে, প্রতি সিকিউরিটি:

  • রেডিসটাইমসিরিজ ডাটাবেস, প্রাইস পরিবর্তনের ইতিহাস ট্র্যাক রাখতে (সহ——”তত्क্ষণে সংযোগকারী যেকোনো ক্লায়েন্টের জন্য সর্বশেষ প্রাইস রেকর্ড করতে)
  • Pub/Sub ব্রোকার চ্যানেল প্রাইস পরিবর্তন নোটিফিকেশন ক্লায়েন্টদের পুশ করতে যারা সেই চ্যানেল সাবস্ক্রাইব করেছে (যা দি আস্তে পোর্টফোলিওতে সেই সিকিউরিটি থাকে)

নিচের ডায়াগ্রাম এই আর্কিটেকচারের এই অংশের বিস্তারিত দেয়:

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

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

আমরা নিচের তথ্যটি একটি কনক্রিট উদাহরণ হিসেবে ব্যবহার করব:

রেডিস দিয়ে হাই-পারফরম্যান্স রিয়েল-টাইম ট্রেডিং প্ল্যাটফর্ম ডিজাইন করুন

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

ডেটা মডেল A

আমাদের প্রথম ইমপ্লিমেন্টেশন অ্যাকাউন্ট আইডি দ্বারা চিহ্নিত একটি SET ব্যবহার করে অ্যাকাউন্টের সব লটের আইডি রেকর্ড করে, এবং তারপর প্রতিটি LOT ID দ্বারা চিহ্নিত একটি রেডিস HASH ব্যবহার করে, যার ফিল্ডগুলো হলো টিকার, কোয়ান্টিটি, এবং পারচেজ প্রাইস। অন্য কথায়, আমরা HASH ব্যবহার করছি LOT এন্টিটি স্ট্রাকচার মডেল করতে, যেখানে LOT এন্টিটি-এর প্রতিটি অ্যাট্রিবিউট রেডিস HASH-এ একটি ফিল্ড।

এই ডেটা মডেলের সাথে আমাদের প্রতিটি অ্যাকাউন্টের জন্য একটি কী থাকে এবং একটি মান থাকে যাতে সেই অ্যাকাউন্টের সব LOT ID থাকে রেডিস SET হিসেবে সংরক্ষিত:

lotids:<ACCOUNT_ID> SET <LOTID>

অতিরিক্তভাবে, প্রতিটি lotid-এর জন্য, আমাদের একটি HASH থাকবে যার ফিল্ডগুলো হলো টিকার, কোয়ান্টিটি, এবং পারচেজ প্রাইস:

lot:<LOTID> HASH <ticker TICKER> <quantity INTEGER> <price INTEGER>

কনক্রিটভাবে, আমরা কীগুলো এভাবে তৈরি করব:

127.0.0.1:6379> SADD lotids:ACC-1001 LOT-9001 LOT-9002 (integer) 2 127.0.0.1:6379> HMSET lot:LOT-9001 ticker AAPL quantity 200 price 12556 OK 127.0.0.1:6379> HMSET lot:LOT-9002 ticker CAT quantity 1200 price 18063 OK

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

price_history:<TICKER> TIMESERIES <price INTEGER>

127.0.0.1:6379> TS.GET price_history:APPL 1) (integer) 1619456853061 2) 12572 127.0.0.1:6379> TS.GET price_history:CAT 1) (integer) 1619456854120 2) 18021

এবং আপডেটের জন্য প্রাইসিং চ্যানেল সাবস্ক্রাইব করুন:

<TICKER> SUBSCRIPTION_CHANNEL

সকল ডেটা পেতে, ক্লায়েন্ট নিচের অপারেশনগুলো সম্পাদন করবে:

  1. ১ বার lotids কী-এ SMEMBERS—টাইম কমপ্লেক্সিটি O(N) যেখানে N হল লটের সংখ্যা
  2. N বার lot কীগুলোর HGETALL—টাইম কমপ্লেক্সিটি N গুণ O(1)
  3. T বার price_history কীগুলোর TS.GET – টাইম কমপ্লেক্সিটি T গুণ O(1) যেখানে T হল টিকার সংখ্যা
  4. ১ বার <TICKER> চ্যানেলগুলোর SUBSCRIBE – টাইম কমপ্লেক্সিটি O(T) (একটি SUBSCRIBE কলেই সকল চ্যানেল সাবস্ক্রাইব করা যায়)

সামগ্রিক টাইম কমপ্লেক্সিটি O(N +T)।

কনক্রিটভাবে, অপারেশন ১ এবং ২ হবে:

127.0.0.1:6379> SMEMBERS lotids:ACC1001 1) "LOT-9001" 2) "LOT-9002" 127.0.0.1:6379> HGETALL lot:LOT-9001 1) "ticker" 2) "AAPL" 3) "quantity" 4) "200" 5) "price" 6) "12556" 127.0.0.1:6379> HGETALL lot:LOT-9002 1) "ticker" 2) "CAT" 3) "quantity" 4) "1200" 5) "price" 6) "18063" 

পাইপলাইনিং (ক্লায়েন্ট সাইডে ব্যাচিং的一種 রূপ) এবং/অথবা LUA স্ক্রিপ্টের বারবার ব্যবহার (SCRIPT LOAD & EVALSHA ব্যবহার করে) করে নেটওয়ার্ক লেটেন্সি কমিয়ে আনা যায়। সাইড নোট: ট্রানজ্যাকশন পাইপলাইন ব্যবহার করে ইমপ্লিমেন্ট করা যায় এবং কম নেটওয়ার্ক লেটেন্সি প্রদান করতে পারে, কিন্তু এটি ক্লায়েন্ট-স্পেসিফিক এবং তাদের লক্ষ্য সার্ভারে এটোমিসিটি, তাই সেগুলো নেটওয়ার্ক লেটেন্সি সমস্যাটি সত্যিকারের মানে সমাধান করে না। পাইপলাইন उन কমান্ডগুলো নিয়ে গঠিত যাদের ইনপুট এবং আউটপুট একে অপরের থেকে স্বাধীন হতে হবে। LUA স্ক্রিপ্টের জন্য সব কী আগে থেকেই প্রদান করা আবশ্যক এবং সব কী একই স্লটে হ্যাশ হতে হবে (এই টপিকের জন্য রেডিস এন্টারপ্রাইজ ডক্স দেখুন আরও ডিটেইলস জন্য)।

এই বাধ্যবাধকতাগুলো দেওয়া থাকলে, আমরা দেখতে পাচ্ছি অপারেশনগুলোর পাইপলাইনে অ্যাসাইনমেন্ট:

  • পাইপলাইন ১: অপারেশন #১-এর একক কমান্ড
  • পাইপলাইন ২: অপারেশন #২-এর সব N কমান্ড
  • পাইপলাইন ৩: অপারেশন #৩ এবং #৪-এর সব N কমান্ড

এবং LUA স্ক্রিপ্ট ব্যবহার করা সম্ভব নয় কারণ প্রতিটি অপারেশন ভিন্ন কী ব্যবহার করে এবং সেই কীগুলোর কোনো সাধারণ অংশ নেই যা একই স্লটে হ্যাশ করা যায়।

এই মডেল ব্যবহার করে আমাদের টাইম কমপ্লেক্সিটি O(N+T) এবং তিনটি নেটওয়ার্ক হপ।

ডেটা মডেল B

একটি বিকল্প মডেল হলো LOT এন্টিটি স্ট্রাকচার ফ্ল্যাটেন করা এবং প্রতিটি এন্টিটি অ্যাট্রিবিউটকে অ্যাকাউন্ট আইডি দ্বারা চিহ্নিত একটি কী দিয়ে প্রতিনিধিত্ব করা—প্রতি অ্যাট্রিবিউটের জন্য (কোয়ান্টিটি, টিকার, প্রাইস) একটি কী। প্রতিটি HASH-এ ফিল্ডগুলো হবে LOT ID এবং কোয়ান্টিটি, টিকার, বা প্রাইস-এর সাথে মিলে যাওয়া একটি ভ্যালু। সুতরাং আমাদের কীগুলো হবে:

tickers_by_lot: <ACCOUNT_ID> HASH <LOTID TICKER>

quantities_by_lot:<ACCOUNT_ID> HASH <LOTID INTEGER>

prices_by_lot:<ACCOUNT_ID> HASH <LOTID INTEGER>

এই হ্যাশগুলো ডেটা মডেল A-র LOTID এবং LOT কীগুলো রিপ্লেস করবে, যখন price_history এবং <TICKER> কীগুলো একই থাকবে।

কীগুলো তৈরি করা:

HSET tickers_by_lot:ACC-1001 LOT-9001 AAPL LOT-9002 CAT HSET quantities_by_lot:ACC-1001 LOT-9001 200 LOT-9002 1200 HSET prices_by_lot:ACC-1001 LOT-9001 125.56 LOT-9002 180.63 

মানগুলো রিট্রিভ করা:

127.0.0.1:6379> HGETALL tickers_by_lot:ACC-1001 1) "LOT-9001" 2) "AAPL" 3) "LOT-9002" 4) "CAT" 127.0.0.1:6379> HGETALL quantities_by_lot:ACC-1001 1) "LOT-9001" 2) "200" 3) "LOT-9002" 4) "1200" 127.0.0.1:6379> HGETALL prices_by_lot:ACC-1001 1) "LOT-9001" 2) "12556" 3) "LOT-9002" 4) "18063" 

এখন ক্লায়েন্টের জন্য প্রয়োজনীয় অপারেশনগুলো হবে:

  1. ১ বার lot_quantity কীগুলোর HGETALL—টাইম কমপ্লেক্সিটি N x O(1)
  2. ১ বার lot_ticker কীগুলোর HGETALL—টাইম কমপ্লেক্সিটি N x O(1)
  3. ১ বার lot_price কীগুলোর HGETALL—টাইম কমপ্লেক্সিটি N x O(1)
  4. T বার price_history কীগুলোর TS.GET—টাইম কমপ্লেক্সিটি T x O(1) যেখানে T হল টিকার সংখ্যা
  5. ১ বার <TICKER> চ্যানেলগুলোর SUBSCRIBE—টাইম কমপ্লেক্সিটি 1 x O(T)

এটিও সামগ্রিক টাইম কমপ্লেক্সিটি O(N+T)—পূর্বের মতো।

পাইপলাইন পারস্পেক্টিভ থেকে এটি হয়ে যায়:

  • পাইপলাইন वन—অপারেশন #১, #২, এবং #৩-এর সব কমান্ড
  • পাইপলাইন টু—অপারেশন #৪ এবং #৫-এর সব T কমান্ড

সুতরাং আমরা নেটওয়ার্ক হপ এক কমিয়েছি—অবসোলিউট টার্মসে বেশি না, কিন্তু ৩৩% রিলেটিভ টার্মসে।

অতিরিক্তভাবে, আমরা সহজে LUA ব্যবহার করতে পারি যেহেতু আমরা কীগুলো জানি, এবং আমরা যেকোনো নির্দিষ্ট অ্যাকাউন্টের সব কীকে একই স্লটে ম্যাপ করতে পারি। অপারেশনগুলোর সহজতার কারণে আমরা LUA-র গভীরে যাব না, কিন্তু নোট করুন যে এই ডিজাইন এটি অন্তত সম্ভব করে তোলে!

একটি সিম্পল বেঞ্চмар্কে, ডেটা মডেল B ৪.১৩ ms দ্রুত চলে (হাজার হাজার রানের ওপর বেঞ্চмар্ক করা)। যেহেতু এটি শুধু একটিবার চলে প্রতিবার একটি ক্লায়েন্ট একটি অ্যাকাউন্টের জন্য ইনিশিয়ালাইজ হয়, এটি সম্ভবত সামগ্রিক পারফরম্যান্সে কোনো প্রভাব ফেলে না।

সারসংক্ষেপ

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

আমরা সিকিউরিটিজ পোর্টফোলিও বড় স্কেলে ম্যানেজ করার কিছু ব্যবসায়িক চ্যালেঞ্জ পরিচয় করিয়েছি এবং নিচের বিষয়গুলো দেখিয়েছি:

  • একটি রেডিস ডেটা মডেল রিয়েল-টাইম এবং স্কেলেবল সিকিউরিটিজ পোর্টফোলিও ইমপ্লিমেন্ট করার জন্য।
  • একটি হাই-পারফরম্যান্স, রিয়েল-টাইম প্রাইস আপডেট সিস্টেম যা পোর্টফোলিওর মোট মূল্য এবং প্রতিটি хол্ডিং-এর লাফ বা ক্ষতি ক্যালকুলেট করতে ব্যবহার করা যায়।

এই দুটি ক্রিটিক্যাল ফিচার থাকলে, একটি ব্রোকারেজ অ্যাপ ক্লায়েন্ট রিয়েল-টাইম পোর্টফোলিও আপডেট প্রদান করতে পারে যা পারফর্ম করে এবং মিলিয়ন মিলিয়ন অ্যাকাউন্ট হ্যান্ডল করতে স্কেল করে। এই ডিজাইন পোর্টফোলিওর মোট মূল্য এবং প্রতিটি хол্ডিং-এর জুড়ে লাফ বা ক্ষতি রিয়েল-টাইমে প্রেজেন্ট করতে পারে। এই ডেটা মডেল এবং আর্কিটেকচার সিকিউরিটিজ ছাড়া অন্যান্য ইউজ কেসের জন্যও প্রযোজ্য যেমন ক্রিপ্টো, অ্যাড এক্সচেঞ্জ, ইত্যাদি।

  1. Remix এবং সার্ভারলেস রেডিস দিয়ে স্কেলেবল TODO অ্যাপ তৈরি করুন

  2. এজ ক্যাশিংয়ে Redis-র মাধ্যমে ৫ মিলিসেকেন্ড গ্লোবাল লেটেন্সি অর্জন

  3. Cloudflare Workers-এ Redis ব্যবহার করে এজ কম্পিউটিং-এর শক্তি ব্যবহার করুন

  4. রেডিস GEORADIUSBYMEMBER ব্যবহার: উদাহরণসহ ব্যাবহারিক গাইড