RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা Observables এবং Operators এর মাধ্যমে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সহজ করে তোলে। অনেক সময় আমরা একাধিক অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করি, যেমন একাধিক HTTP রিকোয়েস্ট বা ইউজার ইভেন্টের স্ট্রিম। এইসব কেসে Concurrency Handling (একাধিক অপারেশন একযোগে পরিচালনা) গুরুত্বপূর্ণ হয়ে ওঠে, এবং Schedulers এর মাধ্যমে এই সমন্বয়টি আরও দক্ষভাবে পরিচালনা করা সম্ভব হয়। এই আর্টিকেলে, আমরা Concurrency Handling এবং Schedulers এর ভূমিকা এবং তাদের ব্যবহারের কৌশল নিয়ে আলোচনা করব।
Concurrency Handling in RxJS
Concurrency বলতে একাধিক কাজ বা অপারেশন একযোগে (parallel) চালানো বোঝায়, যেমন একাধিক HTTP রিকোয়েস্ট বা একাধিক ইভেন্ট হ্যান্ডলিং। RxJS এ, Concurrency Handling একটি গুরুত্বপূর্ণ ধারণা, যেহেতু এটি অনেকগুলো অ্যাসিঙ্ক্রোনাস অপারেশনকে একসাথে পরিচালনা করার ক্ষমতা প্রদান করে। তবে, Concurrency এর মাধ্যমে একাধিক অপারেশন একযোগে চালাতে গেলে সেগুলির মধ্যে Synchronization বা সমন্বয় বজায় রাখাও প্রয়োজনীয়।
RxJS তে Concurrency Handling করার জন্য আমরা কিছু বিশেষ অপারেটর ব্যবহার করতে পারি, যেমন:
mergeMap():
mergeMap()(বাflatMap()) একাধিক অপারেশনকে একযোগে (parallel) চালাতে ব্যবহৃত হয়। এটি বিভিন্ন অপারেশন একযোগে চালায় এবং তাদের ফলাফলগুলো একটি একক Observable এ ম্যানেজ করে।উদাহরণ:
import { of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const observable = of(1, 2, 3, 4).pipe( mergeMap(val => { return of(val * 2); // প্রতিটি মানের জন্য পৃথক Observable প্রক্রিয়া হবে }) ); observable.subscribe(console.log); // আউটপুট: 2, 4, 6, 8concatMap():
concatMap()অপারেটরটি যেহেতু অপারেশনগুলোকে ধাপে ধাপে একে একে সম্পন্ন করার জন্য ব্যবহৃত হয়, এটি সাধারণত কনকারেন্সির জন্য উপযুক্ত নয়, তবে যদি আপনি নিশ্চিত করতে চান যে অপারেশনগুলো নির্দিষ্টভাবে সিরিয়ালভাবে কার্যকর হবে, তখন এটি ব্যবহার করা হয়।উদাহরণ:
import { of } from 'rxjs'; import { concatMap } from 'rxjs/operators'; const observable = of(1, 2, 3).pipe( concatMap(val => { return of(val * 2); // সিরিয়ালভাবে প্রতিটি মান প্রক্রিয়া হবে }) ); observable.subscribe(console.log); // আউটপুট: 2, 4, 6switchMap():
switchMap()যখন একটি নতুন Observable এর জন্য সাবস্ক্রাইব করা হয়, তখন আগের Observable কে ক্যানসেল করে নতুন Observable থেকে ডেটা গ্রহণ করতে শুরু করে। এটি বিশেষভাবে তখন ব্যবহৃত হয় যখন পূর্বের কাজটি আর প্রয়োজন নেই এবং নতুন কাজের উপর মনোযোগ দিতে হবে।উদাহরণ:
import { of } from 'rxjs'; import { switchMap } from 'rxjs/operators'; const observable = of(1, 2, 3).pipe( switchMap(val => { return of(val * 2); // যদি নতুন Observable সাবস্ক্রাইব হয়, আগেরটি ক্যানসেল হবে }) ); observable.subscribe(console.log); // আউটপুট: 2, 4, 6
Schedulers in RxJS
Schedulers হল এমন উপাদান যা RxJS এ Concurrency এবং Timing নিয়ন্ত্রণ করে। সিডিউলিং এর মাধ্যমে আমরা নির্ধারণ করতে পারি, কোন Observable কবে এবং কোথায় কার্যকরী হবে। RxJS এ, Scheduler এমনভাবে কাজ করে যে অ্যাসিঙ্ক্রোনাস অপারেশনগুলো কখন শুরু হবে, কখন সম্পন্ন হবে এবং তাদের মধ্যে সমন্বয় কিভাবে হবে তা নির্ধারণ করা যায়।
RxJS এ বিভিন্ন ধরনের Schedulers রয়েছে, যেমন:
asyncScheduler:
asyncSchedulerএর মাধ্যমে একেবারে পরবর্তী সময় বা মাইক্রোটাস্কে অ্যাসিঙ্ক্রোনাস কাজ নির্ধারণ করা হয়। এটি সাধারণত অ্যাসিঙ্ক্রোনাস অপারেশন যেমনsetTimeout,setIntervalইত্যাদির মতো কাজের জন্য ব্যবহৃত হয়।উদাহরণ:
import { of, asyncScheduler } from 'rxjs'; import { observeOn } from 'rxjs/operators'; of('Hello', 'World').pipe( observeOn(asyncScheduler) // asyncScheduler দিয়ে আসিনক্রোনাস কাজ সিডিউল করা হচ্ছে ).subscribe(console.log);queueScheduler:
queueSchedulerসাধারণত একে অপরের কাজের পরিপ্রেক্ষিতে সিডিউলিং করতে ব্যবহৃত হয়, যেখানে কোনো সিকোয়েন্সে একের পর এক কাজের পরবর্তী কাজটি কার্যকরী হবে। এটি খুবই উপকারী যখন আপনি অ্যাসিঙ্ক্রোনাস কাজের সাথে সিকোয়েন্স প্রক্রিয়া চান।উদাহরণ:
import { of, queueScheduler } from 'rxjs'; import { observeOn } from 'rxjs/operators'; of('First', 'Second').pipe( observeOn(queueScheduler) // queueScheduler দিয়ে সিকোয়েন্সে কাজ সিডিউল করা হচ্ছে ).subscribe(console.log);animationFrameScheduler:
animationFrameSchedulerহল একটি বিশেষ ধরনের Scheduler যা requestAnimationFrame এর মাধ্যমে পরবর্তী রেন্ডারিং ফ্রেমের জন্য কাজ সিডিউল করে। এটি সাধারণত ব্যবহারকারীর ইন্টারফেসের উপাদান বা গ্রাফিক্যাল উপাদানগুলির জন্য ব্যবহৃত হয়।উদাহরণ:
import { of, animationFrameScheduler } from 'rxjs'; import { observeOn } from 'rxjs/operators'; of('Frame1', 'Frame2').pipe( observeOn(animationFrameScheduler) // animationFrameScheduler দিয়ে পরবর্তী ফ্রেমে কাজ সিডিউল করা হচ্ছে ).subscribe(console.log);
Concurrency এবং Schedulers এর ভূমিকা
- Concurrency Handling:
- Concurrency Handling এর মাধ্যমে আপনি একাধিক অ্যাসিঙ্ক্রোনাস কার্যক্রম একযোগে চালাতে পারেন, যেমন একাধিক HTTP রিকোয়েস্ট। RxJS এ
mergeMap(),concatMap(), এবংswitchMap()অপারেটরগুলির মাধ্যমে একাধিক স্ট্রিমকে সমন্বিতভাবে পরিচালনা করা যায়। - এটি প্রয়োজনীয় সময়ে অ্যাসিঙ্ক্রোনাস কার্যক্রমকে parallel বা serially পরিচালনা করতে সহায়তা করে, যা কোডের কর্মক্ষমতা উন্নত করে এবং সময় বাঁচায়।
- Concurrency Handling এর মাধ্যমে আপনি একাধিক অ্যাসিঙ্ক্রোনাস কার্যক্রম একযোগে চালাতে পারেন, যেমন একাধিক HTTP রিকোয়েস্ট। RxJS এ
- Schedulers:
- Schedulers এ সময় নির্ধারণ ও সমন্বয় করার কাজটি করে। RxJS এর asyncScheduler, queueScheduler, এবং animationFrameScheduler ইত্যাদি সিডিউলার ব্যবহার করে আপনি নির্ধারণ করতে পারেন, কোন Observable কখন এবং কোথায় কার্যকরী হবে।
- Schedulers অ্যাসিঙ্ক্রোনাস কাজের নিয়ন্ত্রণে সাহায্য করে, যেমন অ্যাসিঙ্ক্রোনাস অপারেশনগুলোকে পেরিফেরাল থ্রেডে বা নতুন রেন্ডার ফ্রেমে সিডিউল করা।
সারাংশ
RxJS এ Concurrency Handling এবং Schedulers এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কার্যক্রম সমন্বিতভাবে পরিচালনা এবং সময় নিয়ন্ত্রণ করা হয়। Concurrency অপারেটরগুলির মাধ্যমে একাধিক কার্যক্রম একযোগে (parallel) চালানো যায় এবং Schedulers এর মাধ্যমে আমরা সময় এবং স্থান নির্ধারণ করতে পারি। এই দুটি ধারণার মাধ্যমে অ্যাসিঙ্ক্রোনাস ডেটা পরিচালনা আরও সহজ, কার্যকরী, এবং কন্ট্রোলেবল হয়ে ওঠে।
Read more