যখন ডেটা মান পরিবর্তন হয় ক্লায়েন্টদের অবহিত করার জন্য নোডেজ সহ redis PUBLISH / SUBSCRIBE কীভাবে করবেন?


99

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

উত্তর:


123

ওল্ড কেবল একটি রেফারেন্স ব্যবহার করে

নির্ভরতা

ব্যবহারসমূহ প্রকাশ , socket.io , node_redis এবং শেষ কিন্তু না অন্তত নমুনা কোড মিডিয়া ফায়ার থেকে।

নোড.জেএস + এনপিএম ইনস্টল করুন (মূল হিসাবে নয়)

প্রথমে আপনার (যদি আপনি এটি এখনও না করেন) 30 সেকেন্ডে নোড.জেএস + এনপিএম ইনস্টল করা উচিত ( সঠিক উপায় কারণ আপনাকে এনটিএম রুট হিসাবে চালানো উচিত নয় ):

echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh

নির্ভরতা ইনস্টল করুন

নোড + এনপিএম ইনস্টল করার পরে আপনার জারি করে নির্ভরতা ইনস্টল করা উচিত:

npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)

নমুনা ডাউনলোড করুন

আপনি মিডিয়াফায়ার থেকে সম্পূর্ণ নমুনা ডাউনলোড করতে পারেন ।

প্যাকেজ আনজিপ করুন

unzip pbsb.zip # can also do via graphical interface if you prefer.

জিপ ভিতরে কি

./app.js

const PORT = 3000;
const HOST = 'localhost';

var express = require('express');

var app = module.exports = express.createServer();

app.use(express.staticProvider(__dirname + '/public'));

const redis = require('redis');
const client = redis.createClient();

const io = require('socket.io');

if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)

    const socket  = io.listen(app);

    socket.on('connection', function(client) {
        const subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); //    listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}

./public/index.html

<html>
<head>
    <title>PubSub</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
    <div id="content"></div>
    <script>    
        $(document).ready(function() {
            var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
            var content = $('#content');

            socket.on('connect', function() {
            });

            socket.on('message', function(message){
                content.prepend(message + '<br />');
            }) ;

            socket.on('disconnect', function() {
                console.log('disconnected');
                content.html("<b>Disconnected!</b>");
            });

            socket.connect();
        });
    </script>
</body>
</html>

সার্ভার শুরু করুন

cd pbsb    
node app.js

ব্রাউজার শুরু করুন

সেরা আপনি যদি গুগল ক্রোম শুরু করেন (ওয়েবসকেট সমর্থনের কারণে, তবে প্রয়োজনীয় নয়)। পরিদর্শন http://localhost:3000নমুনা দেখতে (শুরু আপনি কিছু দেখতে পাচ্ছি না কিন্তুPubSub শিরোনাম হিসাবে )।

তবে publishচ্যানেলে pubsubআপনার একটি বার্তা দেখা উচিত। নীচে আমরা "Hello world!"ব্রাউজারে প্রকাশ করি ।

./Redis-cli থেকে

publish pubsub "Hello world!"

আপনার const client = redis.createClient()app.js এর মূলের দরকার কেন ?
আকাশ

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

4
নমুনাটি খুব পুরানো তাই সর্বশেষ সকেট.আইও / এক্সপ্রেস মডিউলগুলি এবং সম্ভবত এমনকি নোড.জেএস সহও আপ টু ডেট নয় not আমি কোড আপডেট করার চেষ্টা করব এই কোডটির সাথে আরও একটি বিশাল সমস্যা রয়েছে যে এটি প্রতিটি সংযুক্ত ব্যবহারকারীর জন্য আরও একটি রেডিস সংযোগ খোলে। এটি কেবল পরিবর্তে হওয়া উচিত। আমাকে প্রথমে কাজ করতে হবে তবে তার পরে আমি কোডটি আপডেট করার চেষ্টা করব।
আলফ্রেড

4
খুব ভালো. আমি এখনও মনে করি কিছু উন্নতির জন্য জায়গা রয়েছে যা আমার সময় থাকলে আমি অনলাইনে রাখব। তবে এই মুহূর্তে আমি সত্যিই কঠোর পরিশ্রম করছি: $।
আলফ্রেড

4
আমি মনে করি সাবস্ক্রাইব.ন একাধিক সাবস্ক্রাইব এড়ানোর জন্য সকেট.অন ('সংযোগ') ব্লকের বাইরে থাকা উচিত /
জুনিয়মহাতা

26

এখানে অনেকগুলি নির্ভরতা ছাড়াই সরল উদাহরণ রয়েছে। আপনার এখনও প্রয়োজনnpm install hiredis redis

নোড জাভাস্ক্রিপ্ট:

var redis = require("redis"),
    client = redis.createClient();

client.subscribe("pubsub");
client.on("message", function(channel, message){
  console.log(channel + ": " + message);
});

... এটি একটি pubsub.js ফাইলের মধ্যে রাখুন এবং চালান node pubsub.js

রেডিস-ক্লাইমে:

redis> publish pubsub "Hello Wonky!"
(integer) 1

যা প্রদর্শিত হবে: pubsub: Hello Wonky! টার্মিনাল চলমান নোড! অভিনন্দন!

অতিরিক্ত 4/23/2013: আমি এটিও নোট করতে চাই যে যখন কোনও ক্লায়েন্ট কোনও পাব / সাব চ্যানেলে সাবস্ক্রাইব করে তখন এটি গ্রাহক মোডে চলে যায় এবং গ্রাহক আদেশে সীমাবদ্ধ থাকে। আপনার কেবলমাত্র redis ক্লায়েন্টদের অতিরিক্ত দৃষ্টান্ত তৈরি করতে হবে। client1 = redis.createClient(), client2 = redis.createClient()যাতে একজন গ্রাহক মোডে থাকতে পারে এবং অন্যটি নিয়মিত ডিবি কমান্ড জারি করতে পারে।


এখানে যখন আমরা রেডিসে ডেটা যুক্ত করি, সন্নিবেশের বিজ্ঞপ্তি পেতে আমার কি প্রকাশিত পাবসাব চালানো উচিত?
ইশাস

4
হ্যাঁ, আপনার যদি এটি করা দরকার তবে ইশস আপনার যদি একাধিক কমান্ড পরমাণুভাবে
নাক

@ নাক এটি একটি জিও-তে আকর্ষণীয় কাজ করেছে :) কিছু ব্যবহারকারীদের ইতিমধ্যে ইনস্টল না থাকলে 'ডাবল-এন্ড-ক্যু' ইনস্টল করতে হবে।
মনজিৎ

4
এটি উল্লেখ করার মতো বিষয়ও যদি আপনি ওয়াইল্ডকার্ডগুলি ব্যবহার করতে চান তবে উদাহরণ হিসাবে pubsub/*কেবল যুক্ত pকরতে সাবস্ক্রাইব করুন : subscibeসাথে psubscribeএবং messageসাথে প্রতিস্থাপন করুন pmessage
লিওশা বাকুশিন

7

সম্পূর্ণ রেডিস পাব / সাব উদাহরণ ( Hapi.js এবং সকেট.আইও ব্যবহার করে রিয়েল-টাইম চ্যাট )

আমরা রেডিস পাবলিকেশন / সাবস্ক্রাইব (" পাব / সাব ") বোঝার চেষ্টা করছিলাম এবং বিদ্যমান সমস্ত উদাহরণগুলি পুরানো, খুব সাধারণ বা কোনও পরীক্ষা ছিল না। সুতরাং আমরা Hapi.js + Socket.io + Redis পাব / সাব-টু-এন্ড টেস্ট সহ সাব উদাহরণ ব্যবহার করে একটি সম্পূর্ণ রিয়েল-টাইম চ্যাট লিখেছি !

https://github.com/dwyl/hapi-socketio- redis-chat- উদাহরণ

পাব / সাব উপাদানটি নোড.জেএস কোডের কয়েকটি লাইন: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40

এখানে এটি আটকে দেয়ার পরিবর্তে ( কোনও প্রসঙ্গ ছাড়াই ) আমরা আপনাকে চেকআউট / উদাহরণটি দেখতে উত্সাহিত করি ।

আমরা এটি Hapi.js ব্যবহার করে তৈরি করেছি তবে chat.jsফাইলটি হপি থেকে ডি-কাপলড এবং সহজেই একটি বেসিক নোড.জেএসপি HTTP সার্ভার বা এক্সপ্রেস (ইত্যাদি) এর সাথে ব্যবহার করা যেতে পারে


আপনি এক্সপ্রেস সঙ্গে এই উদাহরণ আছে?
জিস্টি

@ গিস্টি আমরা হ্যাপি.জেএস ব্যবহার করে উদাহরণটি লিখেছিলাম কারণ সেখানে উপস্থিত অন্যান্য সমস্ত উদাহরণ এক্সপ্রেস.জেএস ব্যবহার করে ... পোস্টে উল্লিখিত হিসাবে এটি অন্য কোনও নোড.জেএস ফ্রেমওয়ার্কে পোর্ট করার ক্ষেত্রে একেবারে ক্ষুদ্র (এক্সপ্রেস অ্যাপ্লিকেশনটিতে কেবল পাস / চ্যাট.জেএস.আইএস কোডটি শ্রোতা) এবং এটি ঠিক একইরকম কাজ করে। পিএস: আপনি যদি হাপি.জেএসে নতুন হন তবে দেখুন: github.com/nelsonic/learn-hapi
নেলসোনিক

4

নোডেজগুলি প্রস্থান করা থেকে বিরত রাখতে পুনরায় ত্রুটিগুলি পরিচালনা করুন। আপনি লিখে লিখে এটি করতে পারেন;

subcribe.on("error", function(){
  //Deal with error
})

আমি মনে করি আপনি ব্যতিক্রম পেয়েছেন কারণ আপনি একই ক্লায়েন্টটি ব্যবহার করছেন যা বার্তা প্রকাশের জন্য সাবস্ক্রাইব হয়েছে। বার্তা প্রকাশের জন্য একটি পৃথক ক্লায়েন্ট তৈরি করুন এবং এটি আপনার সমস্যার সমাধান করতে পারে।


2

পরীক্ষা করে দেখুন GitHub থেকে acani-নোড , বিশেষ করে ফাইল acani-নোড-server.js । যদি এই লিঙ্কগুলি নষ্ট হয়ে যায়, তবে অ্যাকানির গিটহাব পাবলিক ভান্ডারগুলির মধ্যে আকানী -চ্যাট-সার্ভারটি সন্ধান করুন ।


বাহ, দেখতে খুব সুন্দর লাগছে!
পৌল

2

আপনি যদি এটি সকেট.ইও 0.7 এবং একটি বাহ্যিক ওয়েবসভার দিয়ে কাজ করতে চান তবে আপনাকে পরিবর্তন করতে হবে (স্ট্যাটিকপ্রাইডার -> স্ট্যাটিক সমস্যা ছাড়াও):

ক) সূচক html এ লোকালহোস্টের পরিবর্তে ডোমেন নাম সরবরাহ করুন (যেমন var সকেট = io.connect ('http://my.domain.com:3000');)

খ) অ্যাপ.জেজে HOST পরিবর্তন করুন (যেমন কনস্ট HOST = 'my.domain.com';)

সি) এবং অ্যাপ্লিকেশনসমূহের লাইনে 37 সকেট যুক্ত করুন (যেমন 'সকেট.সকেটস.অন (' সংযোগ ', ফাংশন (ক্লায়েন্ট) {…'))



0

@alex সমাধান অনুযায়ী । আপনার যদি @ টিলার উল্লেখ অনুসারে এর মতো ত্রুটি থাকে :

node.js:134
        throw e; // process.nextTick error, or 'error'

event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.

তারপরে আপনাকে প্রথমে রেডিস ইনস্টল করতে হবে । এটা দেখ:

http://redis.io/download

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.