Je crée une application de discussion qui permet aux utilisateurs de discuter en privé ou en groupe. Vous envisagez d'utiliser les technologies suivantes pour cette application: -
NodeJs + Socket.io + Redis + CouchDB (Pour stocker l'historique des messages) + AngularJS
Selon mes recherches initiales, en utilisant Redis en tant que service PubSub, il vaut mieux utiliser Socket.io en tant que pub-sub. La raison en est que si différents utilisateurs sont connectés à différentes instances de serveur, l’utilisation de socket dans ce scénario créera un problème car le message envoyé par l'utilisateur 1 ne passera pas à l'utilisateur 2 (l'utilisateur 1 connecté au serveur 1 et l'utilisateur 2 connecté au serveur 2).
Mais si nous utilisons Redis, il me semble que nous devons créer de nouveaux canaux pour permettre les discussions privées. Et leur limite est de 10 000 canaux à Redis.
Mes doutes sont
Cordialement, Vikram
Après avoir lu les articles/articles de blog ci-dessous, utiliser Redis pour pub/sous via socket.io pub/sub contribuera à l’évolutivité et à de meilleures performances.
https://github.com/sayar/RedisMVA/blob/master/module6_redis_pubsub/README.md
https://github.com/rajaraodv/redispubsub
De plus, je suis capable de créer un POC rapide sur un chat privé en utilisant redis. Voici le code: -
var app = require('http').createServer(handler);
app.listen(8088);
var io = require('socket.io').listen(app);
var redis = require('redis');
var redis2 = require('socket.io-redis');
io.adapter(redis2({ Host: 'localhost', port: 6379 }));
var fs = require('fs');
function handler(req,res){
fs.readFile(__dirname + '/index.html', function(err,data){
if(err){
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
console.log("Listening on port 8088");
res.end(data);
});
}
var store = redis.createClient();
var pub = redis.createClient();
var sub = redis.createClient();
sub.on("message", function (channel, data) {
data = JSON.parse(data);
console.log("Inside Redis_Sub: data from channel " + channel + ": " + (data.sendType));
if (parseInt("sendToSelf".localeCompare(data.sendType)) === 0) {
io.emit(data.method, data.data);
}else if (parseInt("sendToAllConnectedClients".localeCompare(data.sendType)) === 0) {
io.sockets.emit(data.method, data.data);
}else if (parseInt("sendToAllClientsInRoom".localeCompare(data.sendType)) === 0) {
io.sockets.in(channel).emit(data.method, data.data);
}
});
io.sockets.on('connection', function (socket) {
sub.on("subscribe", function(channel, count) {
console.log("Subscribed to " + channel + ". Now subscribed to " + count + " channel(s).");
});
socket.on("setUsername", function (data) {
console.log("Got 'setUsername' from client, " + JSON.stringify(data));
var reply = JSON.stringify({
method: 'message',
sendType: 'sendToSelf',
data: "You are now online"
});
});
socket.on("createRoom", function (data) {
console.log("Got 'createRoom' from client , " + JSON.stringify(data));
sub.subscribe(data.room);
socket.join(data.room);
var reply = JSON.stringify({
method: 'message',
sendType: 'sendToSelf',
data: "Share this room name with others to Join:" + data.room
});
pub.publish(data.room,reply);
});
socket.on("joinRooom", function (data) {
console.log("Got 'joinRooom' from client , " + JSON.stringify(data));
sub.subscribe(data.room);
socket.join(data.room);
});
socket.on("sendMessage", function (data) {
console.log("Got 'sendMessage' from client , " + JSON.stringify(data));
var reply = JSON.stringify({
method: 'message',
sendType: 'sendToAllClientsInRoom',
data: data.user + ":" + data.msg
});
pub.publish(data.room,reply);
});
socket.on('disconnect', function () {
sub.quit();
pub.publish("chatting","User is disconnected :" + socket.id);
});
});
Code HTML
<html>
<head>
<title>Socket and Redis in Node.js</title>
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
</head>
<body>
<div id="username">
<input type="text" name="usernameTxt" />
<input type="button" name="setUsername" value="Set Username" />
</div>
<div id="createroom" style="display:none;">>
<input type="text" name="roomNameTxt" />
<input type="button" name="setRooomName" value="Set Room Name" />
<input type="button" name="joinRooomName" value="Join" />
</div>
<div id="sendChat" style="display:none;">
<input type="text" name="chatTxt" />
<input type="button" name="sendBtn" value="Send" />
</div>
<br />
<div id="content"></div>
<script>
$(document).ready(function() {
var username = "anonymous";
var roomname = "anonymous";
$('input[name=setUsername]').click(function(){
if($('input[name=usernameTxt]').val() != ""){
username = $('input[name=usernameTxt]').val();
//var msg = {type:'setUsername',user:username};
socket.emit('setUsername',{user:username});
}
$('#username').slideUp("slow",function(){
$('#createroom').slideDown("slow");
});
});
$('input[name=setRooomName]').click(function(){
if($('input[name=roomNameTxt]').val() != ""){
roomname = $('input[name=roomNameTxt]').val();
socket.emit('createRoom',{user:username,room:roomname});
}
$('#createroom').slideUp("slow",function(){
$('#sendChat').slideDown("slow");
});
});
$('input[name=joinRooomName]').click(function(){
if($('input[name=roomNameTxt]').val() != ""){
roomname = $('input[name=roomNameTxt]').val();
socket.emit('joinRooom',{room:roomname});
}
$('#createroom').slideUp("slow",function(){
$('#sendChat').slideDown("slow");
});
});
var socket = new io.connect('http://localhost:8088');
var content = $('#content');
socket.on('connect', function() {
console.log("Connected");
});
socket.on('message', function(message){
//alert('received msg=' + message);
content.append(message + '<br />');
}) ;
socket.on('disconnect', function() {
console.log('disconnected');
content.html("<b>Disconnected!</b>");
});
$("input[name=sendBtn]").click(function(){
var msg = {user:username,room:roomname,msg:$("input[name=chatTxt]").val()}
socket.emit('sendMessage',msg);
$("input[name=chatTxt]").val("");
});
});
</script>
</body>
</html>
C'est tout le code de base redis pub/sub.
var redis = require("redis");
var pub = redis.createClient();
var sub = redis.createClient();
sub.on("subscribe", function(channel, count) {
console.log("Subscribed to " + channel + ". Now subscribed to " + count + " channel(s).");
});
sub.on("message", function(channel, message) {
console.log("Message from channel " + channel + ": " + message);
});
sub.subscribe("tungns");
setInterval(function() {
var no = Math.floor(Math.random() * 100);
pub.publish('tungns', 'Generated Chat random no ' + no);
}, 5000);
Si vous devez vous familiariser avec l'environnement de travail et créer une application de discussion simple, la pile de développement suivante fonctionne très bien ensemble:
L'application consiste en une salle de discussion à laquelle les utilisateurs peuvent se joindre et démarrer une conversation. Socket.IO est responsable de l'émission d'événements lorsque le nombre de discussions/messages est mis à jour et que ceux-ci sont actualisés dans l'interface utilisateur à l'aide de jQuery.
Pour l'article complet et le code source, consultez le lien suivant: https://scalegrid.io/blog/using-redis-with-node-js-and-socket-io/