Websocket + Redis:多通道,特定订阅/发布



我是websockets的新手,我想知道如何最好地做到这一点。

我的场景:我有一个处理不同类别用户的服务器。在本例中,假设类别为"mice","cats""dogs"

每个类都应该有自己的通道来侦听变化,例如"mice-feed","cat-feed""dog-feed"

我的问题是:在服务器验证并确定当前用户的类之后,让他们订阅特定的通道或通道的最佳方法是什么,以便当我向所说的通道广播消息时,我可以确保只有特定类的成员才能获得它们(而不是当前连接到该服务器的每个人)?

我当前的代码设置是这样的:

var ws                  =       require('ws');
var redis               =       require('redis');
/* LOCATION 1 */
// prep redis, for websocket channels
var pub = redis.createClient();
var sub = redis.createClient();
// subscribe to our channels
sub.subscribe('mice-feed');
sub.subscribe('cat-feed');
sub.subscribe('dog-feed');
// declare the server
const wsServer = new ws.Server({
noServer: true,
path: "/",
});
/* ... removing some code for brevity... */
wsServer.on("connection", function connection(websocketConnection, connectionRequest) {
/* LOCATION 2 */
});

我把redis声明在LOCATION 1(它目前在哪里),还是在LOCATION 2(当一个成功的连接建立)?或者两者都不是?

(也:我知道可以直接在websocket端做到这一点,即迭代每个clientws.send,如果某些标准是匹配的,但迭代可能会变得昂贵,我想知道我是否可以在redis-channel宽操作上做到这一点)

如果我要构建这个,我的第一个方法是:

// connect to Redis
const client = createClient();
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();
// declare the server
const wsServer = new ws.Server(...elided...);
// handle connection
wsServer.on('connection', async (websocketConnection, connectionRequest) => {
const sub = client.duplicate()
// figure out the feed
const feed = 'animal-feed';
await sub.subscribe(feed, message => {
...do stuff...
});
});

这很简单,但会导致每个用户都有一个专用的连接到Redis。这可能重要,也可能不重要,这取决于你预计有多少用户。

最新更新