Redis pub/sub-এ আমাদের ওভারভিউ নিবন্ধটি পাব/সাব-এর উদ্দেশ্য নিয়ে আলোচনা করে এবং বিশেষ করে Redis পাব/সাবের ডিজাইন পছন্দগুলি বর্ণনা করে। আমরা এখন Redis পাব/সাব-এর প্রতিটি মূল ধারণার মধ্য দিয়ে ধাপে ধাপে কীভাবে Redis পাব/সাব ব্যবহার করতে হয় তার দিকে ফিরে যাব। /sub:noderedis node.js ক্লায়েন্ট ব্যবহার করে চ্যানেল, প্রকাশনা, সদস্যতা, এবং প্যাটার্ন-ম্যাচিং।
চ্যানেল বোঝা
একটি চ্যানেল পাব/সাবসিস্টেমে প্রকাশিত বার্তা শ্রেণীবদ্ধ করতে ব্যবহৃত একটি নাম। চ্যানেলগুলির সিস্টেম-নির্ভর নাম থাকতে পারে, যেমন system-health:i-36a44b83
,trade-prices:RAX
, temp-reading:living-room
, বা খুব সাধারণ কিছু, যেমন events
. চ্যানেলে উপস্থিত ডেটাতে আগ্রহী যেকোন গ্রাহক এটি শুনতে পারেন এবং সিস্টেম বৃদ্ধির সাথে সাথে নতুন প্রকাশক এবং গ্রাহকরা সহজেই যুক্ত হয়।
Redis সার্ভারে কোন চ্যানেল সক্রিয় আছে তা খুঁজে বের করতে, আপনি PUBSUB
CHANNELS
ব্যবহার করতে পারেন কমান্ড, যা কিছু ফেরত দেয় না যখন একটি সিস্টেম এখনও পাব/সাব:
$ redis-cli pubsub channels
(empty list or set)
চ্যানেলগুলি কেবল তখনই সিস্টেমে বিদ্যমান থাকে যখন একজন গ্রাহক বার্তাগুলি শুনছেন, তাই চ্যানেলগুলিকে "তৈরি" বা "সরানোর" প্রয়োজন নেই - যখন একজন গ্রাহক শুনছেন তখনই সেগুলি উপস্থিত থাকে। এটি দেখতে, আমরা redis-cli
ব্যবহার করতে পারি একটি কনসোল উইন্ডোতে গ্রাহক হিসাবে কাজ করতে এবং PUBSUB CHANNELS
চালান আবার অন্য উইন্ডোতে:
কনসোল 1:
$ redis-cli subscribe events
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "events"
3) (integer) 1
কনসোল 2:
$ redis-cli pubsub channels
1) "events"
কনসোল 1 সংযোগ বিচ্ছিন্ন করার সাথে সাথে সিস্টেমে আবার কোন চ্যানেল থাকবে না।
বার্তা প্রকাশ করা
কমান্ড সিনট্যাক্স
PUBLISH
কমান্ড বার্তা প্রকাশ করতে ব্যবহৃত হয়।
PUBLISH channel message
চ্যানেলে শুনছেন এমন সব গ্রাহকদের মেসেজ পাঠানো হবে। যদি গ্রাহকরা বার্তাটি পাওয়ার জন্য কাছাকাছি থাকে তবে বার্তাটি বাদ দেওয়া হয়।
Node.js উদাহরণ
Redis-এর সাথে একটি নিয়মিত সংযোগ তৈরি করার পরে, প্রকাশকে অন্য যেকোনো কমান্ডের মতো ব্যবহার করা যেতে পারে:
var client = require("redis").createClient();
client.publish("temp-reading:living-room", "37.0");
অন্যান্য Redis কমান্ডের সাথে ব্যবহার করা
একটি চ্যানেলে ডেটা প্রকাশ করা একটি দ্রুত ক্রিয়াকলাপ, তাই এটি সাধারণত অন্যান্য ক্রিয়াকলাপের সাথে একসাথে ব্যবহৃত হয়। এই ধরনের ক্রিয়াকলাপগুলিকে একত্রিত করা Redis-এর শক্তিকে আনলক করে:
var client = require("redis").createClient();
client.multi()
.publish("temp-reading:living-room", "37.0")
.lpush("recent-temperatures", "37.0")
.ltrim("recent-temperatures", 0, 99)
.exec();
এটি পাব/সাব সিস্টেমের আগের উদাহরণের মতো একই অপারেশন, কিন্তু একই MULTI/EXEC
-এ লেনদেন তাপমাত্রাকেও একটি তালিকায় পুশ করা হয় যা 100টি সাম্প্রতিক তাপমাত্রা রাখে।
এই সংক্ষিপ্ত উদাহরণটি রেডিস পাব/সাবকে একটি বৃহত্তর সিস্টেম ডিজাইনে সংহত করার একটি উপায় দেখায় যা বার্তা ইতিহাস অন্তর্ভুক্ত করে। উপরের একটির মত একটি অপারেশন অন্যান্য ক্লায়েন্টদের সাম্প্রতিক মানগুলি জিজ্ঞাসা করার পাশাপাশি নতুনগুলির সদস্যতা নিতে দেয়৷
বার্তাগুলিতে সদস্যতা নেওয়া
কমান্ড সিনট্যাক্স
SUBSCRIBE
কমান্ড চ্যানেল সাবস্ক্রাইব করতে ব্যবহৃত হয়. এই কমান্ডটি ক্লায়েন্টকে একটি বিশেষ "সাবস্ক্রাইবড" অবস্থায় রাখে যেখানে এটি অতিরিক্ত SUBSCRIBE
ছাড়া অন্য কোন কমান্ড পাঠায় না অথবা UNSUBSCRIBE
কমান্ড।
SUBSCRIBE channel [channel ...]
Node.js উদাহরণ
এই গ্রাহক পূর্ববর্তী প্রকাশকের উদাহরণের সাথে ব্যবহার করা যেতে পারে:
var subscriber = require("redis").createClient();
subscriber.on("message", function(channel, message) {
console.log("A temperature of " + message + " was read.");
});
subscriber.subscribe("temp-reading:living-room");
এটি একটি সাধারণ ইভেন্ট ইমিটার ব্যবহার করে যা প্রতিবার একটি বার্তা আসার সময় একটি ফাংশনকে কল করে। হ্যান্ডলিং ফাংশনটি এখনই কনসোলে তাপমাত্রা লগ করে – এটি কিছু করতে পারে৷
সাবস্ক্রাইবারদের সাথে অন্যান্য কমান্ড ব্যবহার করা
পূর্বে উল্লিখিত হিসাবে, সাবস্ক্রাইব করা ক্লায়েন্ট একটি বিশেষ মোডে থাকে এবং অন্যান্য কমান্ডের জন্য ব্যবহার করা যায় না। অন্যান্য কমান্ড ব্যবহার করতে, আপনি Redis-এ একটি পৃথক ক্লায়েন্ট সংযোগ তৈরি করবেন:
var redis = require("redis")
, subscriber = redis.createClient()
, client = redis.createClient();
subscriber.on("message", function(channel, message) {
console.log("A temperature of " + message + " was read.");
client.incr("temp-count");
});
subscriber.subscribe("temp-reading:living-room");
এই হ্যান্ডলার কনসোলে বার্তাটি লগ করে এবং একটি Redis কাউন্টার বৃদ্ধি করে। কিছু ক্ষেত্রে আপনি একটি ফলাফল গণনা করতে পারেন এবং তারপরে অন্য গ্রাহকদের পড়ার জন্য সেই ফলাফলটি আলাদা চ্যানেলে প্রকাশ করতে পারেন – আপনি যে চ্যানেলে শুনছেন সেটিকে আবার প্রকাশ করবেন না, কারণ আপনি একটি অসীম লুপ সৃষ্টি করবেন :)
প্যাটার্ন ম্যাচিং
কমান্ড সিনট্যাক্স
PSUBSCRIBE
কমান্ড চ্যানেল নিদর্শন মেলানোর জন্য ব্যবহৃত হয়।
PSUBSCRIBE pattern [pattern ...]
এটি একটি সাধারণ SUBSCRIBE
এর মতোই কাজ করে৷ কমান্ড কিন্তু আপনাকে একটি প্যাটার্নের সাথে মেলে এমন নামগুলির সাথে চ্যানেলগুলিকে মেলাতে অনুমতি দেয়। এটি প্রকাশকদের তাদের প্রকাশ করা তথ্য সম্পর্কে খুব সুনির্দিষ্ট হতে দেয় এবং গ্রাহকদের তাদের সুনির্দিষ্ট নাম না জেনেই অনেক চ্যানেল শোনার অনুমতি দেয়।
সমর্থিত নিদর্শনগুলি সহজ:*
কোনো অক্ষর মেলে, ?
ম্যাচসা একক অক্ষর, এবং বন্ধনী ব্যবহার করা যেতে পারে গ্রহণযোগ্য অক্ষরগুলির একটি সেট মেলানোর জন্য, যেমন [acd]
.
বিভিন্ন কক্ষ থেকে তাপমাত্রার রিডিং মেলে:
PSUBSCRIBE temp-reading:*
site-link:logo:a:clickrate
এর মত A/B পরীক্ষা থেকে ইভেন্টগুলি মেলে এবংsite-link:logo:b:clickrate
:
PSUBSCRIBE site-link:logo:?:clickrate
system-health:us-east-1a:i-36a44b83
-এর মতো প্রকাশিত ইভেন্টের জন্য AWS দৃষ্টান্তের একটি সিরিজ জুড়ে ইভেন্টের সাথে মিল করুন এবং system-health:us-east-1c:i-73657420636f636f6
:
PSUBSCRIBE system-health:us-east-1[acd]:i-*
Node.js উদাহরণ
এই উদাহরণে, যা পূর্ববর্তী প্রকাশনার উদাহরণের সাথেও ব্যবহার করা যেতে পারে, তাপমাত্রা যে ঘরে তাপমাত্রা পড়া হয়েছিল তার সাথে লগ করা হয়৷
var subscriber = require("redis").createClient();
subscriber.on("pmessage", function(pattern, channel, message) {
var room = channel.split(":")[1];
console.log("A temperature of " + message + " was read in " + room);
});
subscriber.psubscribe("temp-reading:*");
প্যাটার্ন-ভিত্তিক সাবস্ক্রাইবার তার কলব্যাকে আরও কিছু বিশদ বিবরণ পায়:শুধুমাত্র চ্যানেল এবং বার্তাই নয়, কিন্তু নির্দিষ্ট প্যাটার্ন যা মেলে - যেহেতু গ্রাহকরা একাধিক চ্যানেল বা প্যাটার্ন শুনতে পারেন।
পার্শ্ব নোট:PUBLISH
-এর কর্মক্ষমতা বৈশিষ্ট্য
রেডিসের প্রতিটি কমান্ডের একটি নথিভুক্ত সময়ের জটিলতা রয়েছে এবং বেশিরভাগ সময়ই এই জটিলতাগুলি স্বজ্ঞাত। যেহেতু PUBLISH
অপারেশন খুব সহজ মনে হয় (প্রায় SET
এর মত ) কেউ ধরে নিতে পারে যে এর জটিলতা হল O(1)। আসলে PUBLISH
এর সময় জটিলতা সাবস্ক্রাইবারদের আচরণ অনুযায়ী রৈখিকভাবে বৃদ্ধি পায়।
যখন PUBLISH
কমান্ড চালালে এটি চ্যানেলের সাথে মেলে যা এবং এর সাবস্ক্রাইব করা সমস্ত প্যাটার্নের মধ্য দিয়ে যেতে হবে সমস্ত গ্রাহক যাদের বার্তাটি গ্রহণ করা উচিত, ফলে O(N+M) এর সময় জটিলতা দেখা দেয়।
PUBLISH
এর জটিলতার সাথে বেশিরভাগ স্থাপনা কখনই কোনো পারফরম্যান্স সমস্যা অনুভব করবে না , কিন্তু সময়ের সাথে সাথে সেই কমান্ডের কার্যকারিতা ট্র্যাক করা এখনও বুদ্ধিমানের কাজ – যদি আপনার কোড স্বয়ংক্রিয়ভাবে শোনার জন্য চ্যানেলগুলির প্যাটার্ন তৈরি করে তবে সতর্ক থাকুন৷
আপনার কোড এখানে?
আমরা রেডিস পাব/সাব ব্যবহার করে নির্মিত অ্যাপের কিছু দুর্দান্ত উদাহরণের ওয়াক-থ্রু ফিচার করতে চাই। আপনি যদি কিছু ভাল উদাহরণের কথা জানেন, তাহলে [email protected]এ আমাদের একটি নোট পাঠান – আমরা যে কোডগুলি দেখি তার কিছু বৈশিষ্ট্য দেখানোর জন্য আমরা যথাসাধ্য চেষ্টা করব।