如何存储Websocket连接以进行过滤?

问题描述 投票:0回答:1

我正在尝试为一家运输公司构建一个系统。该公司拥有多辆卡车,将物品运送到不同的国家。 该系统的用例之一是跟踪每辆卡车并实时查看其位置。因此,每辆卡车使用“truck_id”作为键将 GPS 数据发送到 Kafka 主题。每 1 秒发送一次数据。

假设数据是这样的 JSON:

{
    "truck_id": "STU_28",
    "plate": "ZH1234Z"
    "lat": 47.3688196,
    "lng": 8.5204119
}

如何将这些数据发送到客户端应用程序?这是我陷入困境的部分。有3个客户端,Web客户端,Android客户端和ios客户端。

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

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

因此卡车发布数据(它们的位置)并且用户订阅这些数据(以显示在地图上)。 问题在于订阅者有不同的“群体”,例如:

“user1”想要显示卡车的位置 [“STU_28”、“STU_818”、“ZFL_00_1”],

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

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

当用户导航到另一个页面或从 Web 应用程序注销时,Websocket 连接需要终止。所以我必须从商店删除连接。 此外,该服务(nodejs 或其他)充当 Kafka 消费者,从 Kafka 主题获取数据并将其发送到用户应用程序。

伪代码可能是这样的:

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都可以。

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

node.js websocket apache-kafka real-time publish-subscribe
1个回答
0
投票

你的问题看起来不是很简洁,但这是一个很好讨论的问题。因为我也在构建一个具有类似用例的应用程序。

关于存储网络套接字。我的研究引导我找到一种将套接字存储在内存中而不是外部的解决方案。 Websocket 使用相对较少的资源。这在处理缩放时会导致一些额外的工作,但似乎在标头中使用一种服务器 ID 使得它更有可能。

关于多对多(团体对多辆卡车)。 一种解决方案是使用对您的连接的引用。一个例子是指针。每辆卡车都有一个订阅者列表,当卡车有新数据时,它会推送到列表中的所有用户。这些列表仅供参考。

Truck1 => [user1,user2,user3]
truck2 => [user2,user3,user5]

我个人对解决方案的想法(取决于您的要求)。 我不认为有必要每 1 秒更新一次卡车的数据。平均时速为 60 英里/小时的卡车从第二个 1 到第二个第二或第二个 5 的位置差异似乎几乎可以忽略不计。但如果需要这样的话,那么请问是不是也需要客户端每1秒接收一次更新呢?

我可能建议不要使用 websockets。相反,缓存卡车数据服务器端并按要求的时间间隔保持更新。在客户端以合理的刷新率向服务器发出请求,以获得所需的卡车位置。服务器可以快速检索缓存的数据并返回。

© www.soinside.com 2019 - 2024. All rights reserved.