0

我有一个关于在 Heroku 上扩展 SailJS 应用程序的问题。

设置:

  • 帆JS
  • Kue(Redis 排队系统)
  • 通过套接字 io (sailsjs) 连接客户端
  • 2 个测功机(每个运行一个 SailsJS 实例)
  • CronJob 类进程

我想自主运行一个连续的“cron”进程,该进程触发一个推送消息,该消息必须发送到连接的 socketio 客户端。当正确配置时,我知道套接字连接驻留在 Redis 中。

我将kue用于 nodejs,并触发一个工作人员来处理任务。worker 位于 SailsJS 实例中,能够向连接的套接字客户端发送推送消息。

但我想知道,不是每个 SailsJS 实例(dyno)都有相同的连接套接字,对吧?换句话说,每个 SailsJS 实例是否都有相同的连接套接字客户端可用,或者 dyno1 是否有一组连接的客户端,而另一个 dyno 有另一组客户端?

例如:

Heroku Cloud => Cron                      => Kue (Redis)
             => Dyno 1 (SailsJS instance) => client 1
                                          => client 2
             => Dyno 2 (SailsJS instance) => client 3
                                          => client 4

如何解决这个问题... :-D?

4

2 回答 2

0

引导一个潜在的答案:

似乎sails.js 的人现在正在研究这个!见:https ://github.com/balderdashy/sails/issues/2593

我希望这些人将启用 'subscribers()' 方法,其行为方式与例如 'message()' 的行为方式相同。

在我看来,当方法:'message()'使您能够向连接到另一个sails实例的客户端发送消息时,方法'subscribers()'应该返回连接到两个sails实例的订阅者(套接字ID)或者它应该是真的很高兴知道实例是否能够知道特定客户端是否已连接。

谢谢!

于 2015-02-16T22:25:23.213 回答
0

我所做的是将一个套接字订阅到它自己的房间(通常房间是用户 ID)。这样,您就不需要跟踪套接字 ID(每个浏览器连接都会更改)。当我的应用程序的任何部分需要与连接“对话”时,它会向房间发出一条消息。这很好,因为它允许拥有多个设备的用户接收相同的消息(就像您在桌面和手机上拥有 Skype 时一样,并且您可以交替使用它们中的任何一个聊天)。

因此,用户 A 连接到桌面,我将他/她的套接字 1235 订阅到他/她的房间用户 A。如果用户 A 与电话同时连接,我将套接字 4567 订阅到房间用户 A。如果任何工作人员需要发送消息,它会发送到房间 UserA。您可以使用 socket.io-emitter:https ://github.com/socketio/socket.io-emitter

var io = require('socket.io-emitter')({ "host" : REDIS_WEBSOCKET_HOST, "port" : REDIS_WEBSOCKET_PORT });

io.in("userA").emit("message", "Some message");

编辑

另外,请记住 Sails 有一个broadcast功能:

http://sailsjs.org/documentation/reference/web-sockets/sails-sockets/sails-sockets-broadcast

您可以向房间发送消息。如果你的消息是全局的,你可以让你的所有套接字订阅一个全局房间,并且任何 Sails 实例都可以与每个人通信。如果您仍然想跟踪单个套接字,您仍然可以使用我上面的技术并使用帆broadcast到那个房间而不是socket.io-emitter.

于 2015-12-14T16:47:45.803 回答