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

Redis Streams ব্যবহার করে টাইম সিরিজ ডেটা মডেলিং: একটি ব্যাখ্যা

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

Streams: Redis-এর নতুন ডেটা স্ট্রাকচার

Redis Streams একটি অ্যাপেন্ড-অনলি টাইমসিরিজ অফ কি-ভ্যালু পেয়ার।

যেকোনো সংখ্যক ক্লায়েন্ট একটি Stream-এ লিখতে পারে এবং প্রতিবার লিখলে সেগুলো টাইমসিরিজে ইনসার্ট করা আইটেমের একটি ইউনিক এসেন্ডিং ID পায়।

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

Streams একটি বিশাল টপিক, তাই এই পোস্টে শুধু সংক্ষেপে দেখব কিভাবে Redis-এ টাইমসিরিজ ডেটা মডেল করতে হয়। এই নতুন ডেটা স্ট্রাকচার এটা আগের পদ্ধতিগুলোর চেয়ে (যেমন List বা Sorted Set ব্যবহার করে টাইমসিরিজ মডেল করা) অনেক সহজ করে দিয়েছে।

এখানকার কোড উদাহরণগুলোর জন্য আমরা Node.js-এর ioredis ক্লায়েন্ট ব্যবহার করব:

var Redis = require('ioredis'); var redis = new Redis();

Stream-এ ডেটা পাঠানো

Streams অ্যাপেন্ড-অনলি, তাই সাধারণত আপনার দরকার শুধু Redis কীটির নাম (যে কীতে লিখবেন) এবং আপনার কি-ভ্যালু পেয়ার সেট।

আমি আমার বায়ু গুণগত সেন্সরের মেজারমেন্ট রেকর্ড করছি, site:pdx কীতে কি-ভ্যালু পেয়ার স্ট্রিম পাঠাচ্ছি - ספেসিফিক্যালি বর্তমান Air Quality Index এবং সেলসিয়াসে তাপমাত্রা:

redis.xadd('site:pdx', '*', 'aqi', 37, 'tempc', 5.1).then(function(id) { console.log("id:", id); });
> 1527974818120-0

যখন নতুন মেজারমেন্ট রেকর্ড করতে হয়, আমি XADD কমান্ড পাঠাই। রেসপন্স হলো একটি ইউনিক, সবসময় এসেন্ডিং ID যা কোয়েরিতে ব্যবহার করা যায়। ID-এর প্রথম অংশ, 1527974818120 হলো Redis সার্ভার দ্বারা অ্যাসাইন করা টাইমস্ট্যাম্প। ID-এর দ্বিতীয় অংশ হলো একটি ইনক্রিমেন্টিং নম্বর যাতে একই সময়ে একাধিক ক্লায়েন্ট লিখলে কলিশন না হয়।

রাইট কমান্ডে দ্বিতীয় আর্গুমেন্ট হিসেবে * দিলে Redis নিজের টাইমস্ট্যাম্প দিয়ে ডেটা স্টোর করে।

লিখার সময় টাইমস্ট্যাম্প সরাসরি দেয়াও সম্ভব, তবে সেটা সাধারণত প্রেফার করা হয় না: Redis-কে টাইমস্ট্যাম্প বেছে দিতে দিলে অনেক ক্লায়েন্ট একসাথে একটি Stream-এ ডেটা লিখতে পারে যেকোনো কোঅর্ডিনেশন ছাড়াই - ID সিলেকশন এবং অর্ডারিং Redis সার্ভার নিজেই হ্যান্ডেল করে।

সিম্পল রিডিং

কয়েকটি ভ্যালু Stream-এ আসার পর আপনি ID বা টাইমস্ট্যাম্প রেঞ্জ দিয়ে ভ্যালু রেঞ্জ রিট্রিভ করতে পারেন। এটি ব্যবহার করা যেতে পারে একটি অ্যাপে যা আমার বায়ু গুণগত মেট্রিক্সের সবচেয়ে রিসেন্ট রিডিং গ্রাফে দেখাবে:

redis.xrange('site:pdx', '1527974818120-0', '+', 'COUNT', 5).then(function(resp) {
  // resp এখন ৫টি রিডিং ধারণ করে, সেগুলো গ্রাফে পাস করুন:
  // console.log(resp);
});
> [ [ '1543947167906-0', [ 'aqi', '31', 'tempc', '5.1' ] ],
> [ '1543947168312-0', [ 'aqi', '31', 'tempc', '5.3' ] ],
> [ '1543947168901-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947170033-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947171460-0', [ 'aqi', '31', 'tempc', '5.6' ] ] ]

Stream-এর যেকোনো জায়গা থেকে নাম্বার রেঞ্জ স্যাম্পল করা যায়, যাতে গ্রাফিং সিস্টেম পারফরম্যান্স পেনাল্টি ছাড়াই ঐতিহাসিক ডেটা কোয়েরি করতে পারে।

ব্লকিং এবং পোলিং

ডেটা রেঞ্জ কোয়েরি করা গ্রাফ এবং ঐতিহাসিক মনিটরিং-এর জন্য উপযোগী, কিন্তু কখনো আপনি এমন সিস্টেম বানাতে চান যা ডেটা আসার সাথে সাথে রিয়াক্ট করতে পারে - Redis streams এখানেও খুব ফিট করে, XREAD ব্যবহার করে:

redis.xread('BLOCK', 10000, 'STREAMS', 'site:pdx', '$').then(function(resp) {
  // যদি aqi > 50 হয় তো উইন্ডো বন্ধ করুন
  console.log(resp);
});

একটি ব্লকিং অপারেশন ডেটা আসার না পাওয়া পর্যন্ত অথবা টাইমআউট হওয়া পর্যন্ত (এখানে ১০০০০ মিলিসেকেন্ড) অপেক্ষা করে, তাই একটি συνεχি পোল মেইনটেইন করতে হলে ডেটা পাওয়ার পর বা কমান্ড টাইমআউট হওয়ার পর সেম XREAD কমান্ড বারবার কল করতে হবে।

আপনার Stream-এ কানেকশনের মাঝপথে কোনো ডেটা মিস না হয় সেটা নিশ্চিত করতে আপনি আপনার Stream-এ পড়া লাস্ট ID দিয়ে রিড করতে পারেন, যাতে আপনি সঠিক সেখানে থেকে শুরু করতে পারেন যেখানে ছেড়ে দিয়েছিলেন।

উপরের কেসে আমি শুধু Stream-এ যেকোনো ডেটা আসাকাঙ্খা করছিলাম তাই স্পেশাল টোকেন '$' ব্যবহার করলাম যেটা মানে "নতুন ডেটা মাত্র"; কমান্ডটি সাপ্লাইড ID দিয়ে কিছুটা আলাদা লুক করে:

redis.xread('BLOCK', 10000, 'STREAMS', 'site:pdx', '1543947171460-0');

আপনি একসাথে অনেক Stream-এও পড়তে পারেন, যেটা সবচেয়ে আগে ডেটা এক্সেপ্ট করার Stream থেকে ভ্যালু রিটার্ন করবে:

redis.xread('BLOCK', 10000, 'STREAMS', 'site:pdx', 'site:global', '1543947171460-0', '$');

এই উদাহরণে কমান্ডটি রিটার্ন করবে যখন ID 1543947171460-0 এর চেয়ে রিসেন্ট ডেটা site:pdx-এ লেখা হবে, অথবা যেকোনো নতুন ডেটা site:global-এ লেখা হবে।

কনসিউমার কোঅর্ডিনেশন

যখন একটি Stream-এ অনেক ডেটা ফ্লো করবে, তখন আপনি একাধিক কপি কনসিউমার চাইতে পারেন ইনবাউন্ড মেসেজ প্রসেস করার জন্য। এই কনসিউমাররা একটি মেসেজ পিক করবে, সেটার ওপর একশন নেবে এবং তারপর "একনলেজ" করবে যে কাজটি হয়ে গেছে। Redis streams এই অপারেশনগুলোর প্রিমিটিভও প্রদান করে - বিস্তারিত ডকুমেন্টেশন দেখুন।

Stream কমান্ডের কুইক রেফারেন্স

Streams-এর জন্য অনেক নতুন Redis কমান্ড উপলব্ধ! এখানে একটি কুইক রেফারেন্স, বিস্তারিত অফিসিয়াল ডকুমেন্টেশনে পাবেন।

সিম্পল কমান্ডসমূহ:

  • XADD: একটি আইটেম (কি-ভ্যালু পেয়ার বান্ডেল) Stream-এ যোগ করুন
  • XRANGE এবং XREVRANGE: Stream আইটেমের রেঞ্জ সিলেক্ট করুন বা ইটারেট করুন
  • XREAD: কিছু ID-এর চেয়ে রিসেন্ট আইটেম ফেচ করুন (অপশনালি ব্লকিং)
  • XTRIM: পুরনো আইটেম ডিসকার্ড করে Stream ট্রিম করুন
  • XDEL: Stream থেকে একটি নির্দিষ্ট আইটেম রিমুভ করুন
  • XLEN: Stream-এ আইটেম কাউন্ট করুন
  • XINFO: Stream মেটাডেটা ইনস্পেক্ট করুন

কনসিউমার গ্রুপ কমান্ডসমূহ:

  • XGROUP: কনসিউমার গ্রুপ তৈরি, ডিলিট, বা রিসেট করুন, এবং তাদের মেম্বার রিমুভ করুন
  • XREADGROUP: XREAD-এর মতো, কিন্তু কনসিউমার গ্রুপ ব্যবহার করে মেসেজ রিসিভ করুন
  • XPENDING: কনসিউমার গ্রুপে ডেলিভার হয়েছে কিন্তু একনলেজ হয়নি এমন মেসেজ ইনস্পেক্ট করুন
  • XACK: কনসিউমার গ্রুপের জন্য একটি মেসেজ একনলেজ করুন, পেন্ডিং লিস্ট থেকে রিমুভ করুন
  • XCLAIM: একটি ডেড কনসিউমার থেকে মেসেজ টেক ওভার করুন

ব্যবহারের ক্ষেত্রসমূহ

Streams-এর সবচেয়ে সাধারণ ইউজ কেস হলো IoT ওয়ার্কলোড যেখানে সেন্সররা ডেটা Stream-এ রাখে এবং কনসিউমাররা সেটা ব্যবহার করে (অ্যানালিসিস, কোল্ড স্টোরেজে আর্কাইভ, গ্রাফে ডিসপ্লে)। ক্যাপড সাইজের Streams এখানে খুব ভালো কাজ করে, যাতে আপনি একটি ফিক্সড সাইজ Stream এলোকেট করতে পারেন প্রেডিক্টেবল মেমরি ফুটপ্রিন্টের সাথে।

Streams সেই অ্যাপ্লিকেশনগুলোর জন্যও উপযোগী যেগুলো আগে অন্য Redis ডেটা স্ট্রাকচার ব্যবহার করত। Sidekiq এবং Celery-এর মতো কিউইং অ্যাপ্লিকেশনগুলো Streams-এর কনসিউমার গ্রুপের সুবিধা নিতে পারে Redis-নেটিভ ভাবে রিড রিসিপ্ট ইনস্পেকশন প্রদান করতে। Redis pubsub ব্যবহার করে সিম্পল চ্যাট অ্যাপ ডেমো করার ব্লগ পোস্ট অনেক আছে, যা Redis Streams দিয়ে আরও রোবাস্ট করা যায়, কারণ pubsub পাবলিশ করার পর মেসেজ রিটেইন করে না।

চেষ্টা করতে প্রস্তুত?

আপনি কয়েক ক্লিকেই নতুন RedisGreen সার্ভারে Redis streams ট্রাই করতে পারেন।

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

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

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

  4. রেডিস ব্যাখ্যা: ইন-মেমরি নোএসকিউএল ডেটাবেসের পূর্ণাঙ্গ গাইড