Socket.io 与 Hazelcast
Socket.io with Hazelcast
我有一个带集群的 nodejs 应用程序,我使用 hazelcast 来实现可伸缩性。我需要添加 socket.io 用于实时消息传递,但是当我连接到工作进程上的套接字时,我的客户端的套接字对象丢失了。
我研究了一段时间,但没有找到任何解决方案。 Redis 的例子太多了,但我不会使用 Redis。我必须使用 Hazelcast。
如何使用 Hazelcast 将套接字共享给每个进程以及每个服务器?有办法吗?
节点version:v10.16.3
Socket.io版本:2.3.0
提前致谢。
您不能跨进程共享套接字。您可以做的是使用 redis 或其他一些系统在进程之间分发消息。如果您可能使用 socket.io 的长轮询回退,您将需要确保启用粘性会话,否则您需要确保您只使用 websockets。 Socket.io 提供了一个开箱即用的解决方案,可以将 Redis 集成到您的系统中,以便在您的用例很简单的情况下跨进程分发消息。
Hazelcast 在基于 JVM 的 Hazelcast 集群上为您提供 pub/sub 机制和内存缓存,您可以通过 Hazelcast node.js client. So, It gives an ability to manage and scale Socket.io application via pub/sub topics and storing socket ids in a Hazelcast IMap datastructure.
连接到集群
我可以为您分享一个示例伪代码:
/* Assumed multi-instance socket.io servers are working and
** they are listening to the Hazelcast pub/sub topics. So, every socket.io
** servers can communicate via pub/sub topics and your other applications as well.
*/
const topic = await client.getTopic('one-of-socket-rooms');
const map = await client.getMap('user-socket-ids');
io.on('connection', (socket) => {
console.log('a user connected with socketId: ' + socket.id );
// assumed you have already userId
await map.put(userId, socket.id);
socket.join('one-of-socket-rooms');
topic.publish('User with '+ socket.id + ' joined the room')
});
如果您可以分享具体的代码片段,我可以根据您的确切要求编辑我的答案。
我有一个带集群的 nodejs 应用程序,我使用 hazelcast 来实现可伸缩性。我需要添加 socket.io 用于实时消息传递,但是当我连接到工作进程上的套接字时,我的客户端的套接字对象丢失了。
我研究了一段时间,但没有找到任何解决方案。 Redis 的例子太多了,但我不会使用 Redis。我必须使用 Hazelcast。
如何使用 Hazelcast 将套接字共享给每个进程以及每个服务器?有办法吗?
节点version:v10.16.3
Socket.io版本:2.3.0
提前致谢。
您不能跨进程共享套接字。您可以做的是使用 redis 或其他一些系统在进程之间分发消息。如果您可能使用 socket.io 的长轮询回退,您将需要确保启用粘性会话,否则您需要确保您只使用 websockets。 Socket.io 提供了一个开箱即用的解决方案,可以将 Redis 集成到您的系统中,以便在您的用例很简单的情况下跨进程分发消息。
Hazelcast 在基于 JVM 的 Hazelcast 集群上为您提供 pub/sub 机制和内存缓存,您可以通过 Hazelcast node.js client. So, It gives an ability to manage and scale Socket.io application via pub/sub topics and storing socket ids in a Hazelcast IMap datastructure.
连接到集群我可以为您分享一个示例伪代码:
/* Assumed multi-instance socket.io servers are working and
** they are listening to the Hazelcast pub/sub topics. So, every socket.io
** servers can communicate via pub/sub topics and your other applications as well.
*/
const topic = await client.getTopic('one-of-socket-rooms');
const map = await client.getMap('user-socket-ids');
io.on('connection', (socket) => {
console.log('a user connected with socketId: ' + socket.id );
// assumed you have already userId
await map.put(userId, socket.id);
socket.join('one-of-socket-rooms');
topic.publish('User with '+ socket.id + ' joined the room')
});
如果您可以分享具体的代码片段,我可以根据您的确切要求编辑我的答案。