需要了解有关 socket.io 和 redis 和 nginx 的一些信息

Posted

技术标签:

【中文标题】需要了解有关 socket.io 和 redis 和 nginx 的一些信息【英文标题】:Need to know something regarding socket.io and redis and nginx 【发布时间】:2015-11-30 11:39:24 【问题描述】:

我的目标是构建一个聊天应用程序 - 类似于 whatsapp

据我了解,socket.io 是一个用 javascript 编写的实时通信库,使用起来非常简单

例如

 // Serverside
    io.on('connection', function(socket) 
        socket.on('chat', function(msg) 
            io.emit('chat', msg);
      );
    );

 // ClientSide (Using jquery)

   var socket = io();
  $('form').submit(function()
    socket.emit('chat', $('#m').val());
    $('#m').val('');
    return false;
  );

  socket.on('chat', function(msg)
    $('#messages').append($('<li>').text(msg));
  );

1) 我是否总是需要启动 io.on('connection') 来使用实时功能,或者我可以开始使用 socket.on 对象来代替?例如我有一条路线

app.post('/postSomething', function(req, res) 
    // Do i need to start an io.on or socket.on here?

);

因为我希望实时功能仅在特定路线上收听。

2) Redis 是一个处理 pub/sub 的数据结构库,为什么我们需要使用 pub/sub 机制? 我读了很多文章,但无法理解这个概念。文章示例http://ejosh.co/de/2015/01/node-js-socket-io-and-redis-intermediate-tutorial-server-side/

例如下面的代码

// Do i need redis for this, if so why? is it for caching purposes?
// Where does redis fit in this code?


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


 io.on('connection', function(socket) 
     socket.on('chat', function(msg) 
          io.emit('chat', msg);
      ); 
  );

3) 只是想知道为什么我需要 nginx 来扩展 node.js 应用程序?我找到了这个***答案: Strategy to implement a scalable chat server

上面说了一些关于负载平衡的内容,在网上阅读,也无法理解这个概念。

到目前为止,我只处理 node.js ,猫鼬简单的 CRUD 应用程序,但如果你们能分享一些知识并分享一些有用的资源,我愿意努力工作,这样我就可以加深我的知识所有这些技术。

干杯!

【问题讨论】:

您有 3 个问题;将它们作为堆栈溢出的三个单独问题发布,这将帮助您获得答案 @BasitAnwer 为什么我在一个问题中提出所有问题,因为我必须为每个问题等待 90 分钟 @BasitAnwer 如果你能帮助我并回答这个问题,那真的很有帮助 已回答;但请不要这样做。如果有人知道 3 个问题中 2 个的答案,他/她可能会犹豫回答您的完整问题以及它是否违反 SO 规则。 【参考方案1】:

问。没有 IO.on 的 Socket.on

io.on("connection" ... )

在收到新连接时调用。 Socket.on 监听客户端的所有发射。如果您出于某种原因希望您的客户端充当服务器,那么(简而言之)yes io.on 是必需的

问。 Redis 发布/订阅与 Socket.IO

看看这个SO question/anwer,引用;

Redis 发布/订阅非常适合所有客户端都可以直接访问 Redis。如果您有多个节点服务器,一个可以向其他节点推送消息。

但是如果您在浏览器中也有客户端,则需要其他东西将数据从服务器推送到客户端,在这种情况下,socket.io 很棒。

现在,如果您将 socket.io 与 Redis 存储一起使用,socket.io 将在后台使用 Redis pub/sub 在服务器之间传播消息,而服务器将向客户端传播消息。

因此,使用带有 Redis 存储的 socket.io 配置的 socket.io 房间对您来说可能是最简单的。

如果需要,Redis 可以充当消息队列。 Redis 是一个支持多种数据类型的数据存储。

问。为什么选择 Nginx 和 Node.js

Node.js 可以独立工作,但 nginx 更快地服务器静态内容。

由于 nginx 是一个反向代理,因此服务器配置了 nginx 来处理所有静态数据(提供静态文件、进行重定向、处理 SSL 证书和提供错误页面。 ) 并且所有其他请求都发送到 node.js

也请查看此 Quora 帖子:Should I host a node.js project without nginx? 引用:

Nginx 可用于从 Node.js 进程中移除一些负载,例如,提供静态文件、执行重定向、处理 SSL 证书和提供错误页面。

你可以在没有 Nginx 的情况下做任何事情,但这意味着你必须自己编写代码,所以为什么不为此使用快速且经过验证的解决方案。

【讨论】:

以上是关于需要了解有关 socket.io 和 redis 和 nginx 的一些信息的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 和 reactjs 实现即时通讯

使用 Redis 扩展 Socket.IO,然后扩展 Redis 本身

Node.js、多线程和 Socket.io

使用 Socket.io 和 Redis 的节点集群问题

在 PHP 中使用 Node.js、Socket.io、Redis 的私人聊天消息

Socket.io 多连接