Node.js 如何存储websocket连接以进行筛选?

Node.js 如何存储websocket连接以进行筛选?,node.js,websocket,apache-kafka,real-time,publish-subscribe,Node.js,Websocket,Apache Kafka,Real Time,Publish Subscribe,我正试图为一家运输公司建立一个系统。该公司有许多卡车,可将货物运送到不同的国家。 该系统的一个用例是跟踪每辆卡车并实时查看其位置。因此,每辆卡车都使用“卡车id”作为键向卡夫卡主题发送GPS数据。数据每1秒发送一次 假设数据是JSON,如下所示: { "truck_id": "STU_28", "plate": "ZH1234Z" "lat": 47.3688196,

我正试图为一家运输公司建立一个系统。该公司有许多卡车,可将货物运送到不同的国家。 该系统的一个用例是跟踪每辆卡车并实时查看其位置。因此,每辆卡车都使用“卡车id”作为键向卡夫卡主题发送GPS数据。数据每1秒发送一次

假设数据是JSON,如下所示:

{
    "truck_id": "STU_28",
    "plate": "ZH1234Z"
    "lat": 47.3688196,
    "lng": 8.5204119
}
KafkaConsumer consumer = new KafkaConsumer();
        
consumer.subscribe(topicName);
        
while(true) {
    // position is json data like above which contains "truck_id"
    position = consumer.poll();

    // go to websocket connection store and get all users(connections) that had searched(subscribed) to that "truck_id"
    connections = wsConnectionStore.getConnections(position.truck_id);
    
    for(WSConnection connection : connections) {
        connection.sendUTF(position);
    }
}
如何将这些数据发送到客户端应用程序?这是我被卡住的部分。有3个客户端,web客户端、android客户端和ios客户端

这是一个用例:一个用户打开web客户端并从卡车列表中选择3辆卡车。然后单击按钮在地图上显示每个卡车的实时位置(我使用OpenStreetMap和传单显示地图)

我对此进行了搜索,发现可以使用WebSocket将数据从服务器发送到客户端。 我使用websocket模块构建NodeJS服务器,但这些连接存储在内存存储中。我想要的是将这些连接存储在我以后可以获得的其他地方。 我发现了一些使用Redis作为发布/订阅的解决方案,但是那些使用Socket.IO的解决方案,我使用的是websocket模块。 我知道这个用例是一种发布/订阅模型

所以卡车发布数据(它们的位置),用户订阅这些数据(显示在地图上)。 问题在于存在不同的“用户组”,例如:

“用户1”要显示卡车的位置[“斯图_28”、“斯图_818”、“ZFL_00_1”]

“user2”只想显示一辆卡车的位置

“user3”要显示其他5辆卡车的位置等

当用户导航到另一个页面或从web应用注销时,websocket连接需要终止。因此,我必须从存储中删除连接。 此外,该服务(nodejs或其他)充当卡夫卡消费者,从卡夫卡主题获取数据并将其发送给应用程序用户

伪代码可以是这样的:

{
    "truck_id": "STU_28",
    "plate": "ZH1234Z"
    "lat": 47.3688196,
    "lng": 8.5204119
}
KafkaConsumer consumer = new KafkaConsumer();
        
consumer.subscribe(topicName);
        
while(true) {
    // position is json data like above which contains "truck_id"
    position = consumer.poll();

    // go to websocket connection store and get all users(connections) that had searched(subscribed) to that "truck_id"
    connections = wsConnectionStore.getConnections(position.truck_id);
    
    for(WSConnection connection : connections) {
        connection.sendUTF(position);
    }
}
我怎样才能做到这一点?无需使用nodejs,它可以使用java、python


注意:系统需要具有可扩展性和高可用性。

您好,欢迎使用Stackoverflow。对我来说,这个问题太宽泛了,所以在这里无法回答。请看一看,最好将您的问题缩小到一个特定的编程问题,最好是使用@bourne。您找到解决这个问题的方法了吗?@Hmmm不幸的是,还没有。@bourne。。。因此,我设法添加了一些用户信息来过滤我们需要发送给他的数据,对于我需要发送的每一个通知,我都会通过连接进行循环,就像您在上面所做的那样,并在特定的通道上发送过滤后的数据您好,欢迎来到Stackoverflow。对我来说,这个问题太宽泛了,所以在这里无法回答。请看一看,最好将您的问题缩小到一个特定的编程问题,最好是使用@bourne。您找到解决这个问题的方法了吗?@Hmmm不幸的是,还没有。@bourne。。。因此,我设法添加了一些用户信息来过滤我们需要发送给他的数据,对于我需要发送的每个通知,我都会通过连接进行循环,就像您在上面所做的那样,并在特定通道上发送过滤后的数据