【问题标题】:What is the best way to run multiple services that use Socket.io运行使用 Socket.io 的多个服务的最佳方式是什么
【发布时间】:2017-11-21 00:35:41
【问题描述】:

我正在开发一个网站,我将在其中使用微服务。

我将有几个或多个使用 Socket.io 的 Node.js 应用程序。

我试图弄清楚我将如何构建它。

我可以使用多个 Node.js 和 Socket.io 连接到一个用户,否则我会遇到冲突吗?我可以使用 NGiNX 作为代理和 UUID 来识别将请求发送到哪个微服务。这有意义吗?有没有更好的办法?

或者我也在考虑使用 Node.js 有一个代理来接收所有 Socket.io 连接,然后它会创建与用户的连接。但这似乎增加了网络负载,因为我正在添加另一个微服务。

无论如何,我很想听听你对此的看法。

【问题讨论】:

  • 如果不了解您要解决的实际问题,很难知道如何发表评论。架构决策是根据实际问题做出的。 “使用带有 socket.io 的微服务”并没有描述问题,这只是一种架构策略。

标签: node.js sockets websocket socket.io microservices


【解决方案1】:

您可以设置多个 nodejs 服务,所有这些服务都使用 socket.io-redis lib 连接到 Redis 服务器以共享所有 nodejs 的 socketID强>服务。这意味着您将所有 socket 信息 存储在 Redis 服务器上。当您发出事件时,它们会自动向所有 nodejs 服务发出。

const server = require('http').createServer();
const io = require('socket.io')(server);
const redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

io.on('connection', socket =>{
  // put socket of user to a room name by user_id
  socket.join(user_id);
});

// emit an event to a specify user, all nodejs keep that user connection will be emit
io.to(user_id).emit('hello', {key: 'ok'})

【讨论】:

    【解决方案2】:

    根据您的项目进展情况,通过 Socket.io 构建微服务通信可能是一个好主意,也可能不是一个好主意

    首先想到的是 socket.io 消息系统的不良保证,尤其是您的消息没有存储在磁盘上这一事实。虽然这可能很方便,但在构建审计跟踪、调试或可重放性时,这也是一个真正的问题。

    我看到的另一个问题是可扩展性/集群能力:是的,您可以让多个服务通过一个 nodeJS 代理进行通信,但是当您必须添加更多服务时会发生什么?您将如何将消息从一个代理传递到另一个代理?这将引导您构建一个完整的消息系统,并且您会发现使用现有的解决方案(RabbitMQ、Kafka ......)更安全

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-06
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2013-04-27
      • 2011-12-11
      相关资源
      最近更新 更多