Node.js 如何存储websocket连接以进行筛选?
我正试图为一家运输公司建立一个系统。该公司有许多卡车,可将货物运送到不同的国家。 该系统的一个用例是跟踪每辆卡车并实时查看其位置。因此,每辆卡车都使用“卡车id”作为键向卡夫卡主题发送GPS数据。数据每1秒发送一次 假设数据是JSON,如下所示: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,
{
"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。。。因此,我设法添加了一些用户信息来过滤我们需要发送给他的数据,对于我需要发送的每个通知,我都会通过连接进行循环,就像您在上面所做的那样,并在特定通道上发送过滤后的数据