Redis pub/sub पर हमारे अवलोकन लेख में pub/sub के उद्देश्य पर चर्चा की गई है और विशेष रूप से Redis pub/sub के डिज़ाइन विकल्पों का वर्णन किया गया है। अब हम noderedis Node.js क्लाइंट का उपयोग करके Redis pub/sub के प्रत्येक मुख्य अवधारणा: चैनल्स, पब्लिशिंग, सब्सक्राइबिंग, और पैटर्न-मैचिंग के माध्यम से कदम दर कदम देखेंगे कि Redis pub/sub का उपयोग कैसे करें।
चैनल्स को समझना
एक चैनल pub/sub सिस्टम पर पब्लिश किए गए मैसेजेस को वर्गीकृत करने के लिए उपयोग किया जाने वाला एक नाम है। चैनल्स के सिस्टम-निर्भर नाम हो सकते हैं, जैसे system-health:i-36a44b83, trade-prices:RAX, temp-reading:living-room, या कुछ बहुत सामान्य, जैसे events। कोई भी सब्सक्राइबर जो किसी चैनल पर दिखाई देने वाले डेटा में रुचि रखता है, उसे सुन सकता है, और नए पब्लिशर्स और सब्सक्राइबर्स को सिस्टम के बढ़ने पर आसानी से जोड़ा जा सकता है।
Redis सर्वर पर कौन से चैनल्स सक्रिय हैं, यह जानने के लिए आप PUBSUB CHANNELS कमांड का उपयोग कर सकते हैं, जो तब कुछ नहीं लौटाता जब सिस्टम अभी तक pub/sub के लिए उपयोग नहीं किया जा रहा हो:
$ 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();
यह pub/sub सिस्टम के लिए पहले के उदाहरण के समान ऑपरेशन है, लेकिन उसी MULTI/EXEC ट्रांजैक्शन में तापमान को एक लिस्ट पर भी पुश किया जाता है जो 100 सबसे हालिया तापमानों को रखता है।
यह छोटा उदाहरण Redis pub/sub को एक बड़े सिस्टम डिज़ाइन में एकीकृत करने का एक तरीका दिखाता है जिसमें मैसेज हिस्ट्री शामिल है। ऊपर जैसे ऑपरेशन अन्य क्लाइंट्स को हालिया वैल्यूज़ क्वेरी करने के साथ-साथ नए लोगों को सब्सक्राइब करने की अनुमति देते हैं।
मैसेजेस सब्सक्राइब करना
कमांड सिंटैक्स
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:*
A/B टेस्ट से इवेंट्स मिलान करें जैसे site-link:logo:a:clickrate और site-link:logo:b:clickrate:
PSUBSCRIBE site-link:logo:?:clickrate
AWS इंस्टेंस की एक श्रृंखला में इवेंट्स मिलान करें, जैसे system-health:us-east-1a:i-36a44b83 और 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 की प्रदर्शन विशेषताएं
Redis में हर कमांड की एक डॉक्यूमेंटेड टाइम कॉम्प्लेक्सिटी होती है, और ज्यादातर समय ये कॉम्प्लेक्सिटीज़ सहज होती हैं। चूंकि PUBLISH ऑपरेशन बहुत सरल लगता है (लगभग SET की तरह) तो कोई मान सकता है कि इसकी कॉम्प्लेक्सिटी O(1) है। वास्तव में PUBLISH की टाइम कॉम्प्लेक्सिटी सब्सक्राइबर्स के व्यवहार के अनुसार रैखिक रूप से बढ़ती है।
जब PUBLISH कमांड चलती है तो उसे उन सभी पैटर्न्स के माध्यम से स्टेप करना होगा जो उस चैनल से मेल खा सकते हैं और उन सभी सब्सक्राइबर्स के माध्यम से जिन्हें मैसेज प्राप्त करना चाहिए, जिसके परिणामस्वरूप O(N+M) की टाइम कॉम्प्लेक्सिटी होती है।
अधिकांश डिप्लॉयमेंट्स कभी भी PUBLISH की कॉम्प्लेक्सिटी के साथ किसी प्रदर्शन समस्या का अनुभव नहीं करेंगे, लेकिन समय के साथ उस कमांड के प्रदर्शन को ट्रैक करना अभी भी बुद्धिमानी है - सावधान रहें यदि आपका कोड सुनने के लिए चैनल्स के पैटर्न को स्वचालित रूप से उत्पन्न करता है।
आपका कोड यहाँ?
हम Redis pub/sub का उपयोग करके बने कुछ बेहतरीन ऐप्स के वॉक-थ्रू को फीचर करना पसंद करेंगे। यदि आप कुछ अच्छे उदाहरण जानते हैं, तो हमें support@redisgreen.net पर एक नोट भेजें - हम देखे गए कुछ कोड को फीचर करने की पूरी कोशिश करेंगे।