我是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端做到这一点,即迭代每个client
和ws.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。这可能重要,也可能不重要,这取决于你预计有多少用户。