HTTP实例如何知道要调用的WebSocket实例?

时间:2018-10-27 21:19:47

标签: websocket architecture cloudfoundry

在这种情况下,Cloud Foundry面临一个问题:

  • 设备连接到Cloud Foundry中的WebSocket实例
  • 然后,CF中只有一个实例保持套接字连接
  • Angular UI将请求发送到REST实例
  • REST实例必须在设备上执行操作

问题:

如何调用正确的WebSocket实例来访问设备?

Cloud Foundry with Web Sockets

谢谢!

同步。

3 个答案:

答案 0 :(得分:1)

有点涉及,但是有可能。首先看一下获取 stats for a process。您可以将其与X-CF-APP-INSTANCE标头一起使用,以访问每个实例,并查看哪个实例具有您要查找的websocket连接。

答案 1 :(得分:0)

  

HTTP实例如何知道要调用的WebSocket实例?

我的回答是:他们不应该。

管理实例信息和用户连接数据的内部池可能会增加复杂性,并导致可伸缩性(和可维护性)受挫。

  

如何调用正确的WebSocket实例来访问设备?

恕我直言,最好的方法是使用发布/订阅数据库,例如Redis(或发布/订阅服务,这是更昂贵的解决方案)。

WebSocket连接实例“订阅”(侦听)唯一的私有“通道”(发布/订阅消息流)。

REST连接“发布”(发送数据)到通道。

如果用户在线,他们将在监听(订阅)并且将使用“推送”方法(不需要轮询)接收数据。如果没有人在听,则消息将完全消失在空白处。

WebSocket连接还可以订阅公共/全局频道以获取全局通知。

这种方法在发送者/发布者(REST调用)和接收者(订阅的WebSocket)之间建立了分隔。

这使得扩展非常容易,因为pub / sub数据库(在此示例中为Redis)将处理所需的任何消息转发。

这还将允许单个用户从不同的计算机(例如,笔记本电脑和电话)进行连接,并在两台计算机上接收通知,而无需处理IP地址,也无需将用户路由到特定的服务器计算机。 / p>

答案 2 :(得分:0)

如我所写,我不想设置像RabbitMQ这样的消息传递系统只是为了通过Web套接字向设备发送简单命令。滥杀滥杀!

搜索之后,我终于找到了针对正确实例的解决方案。

1 \当设备向WebSocket服务器打开Web套接字时,我将CF App ID + CF实例索引以“ APP_ID:INSTANCE_INDEX”的形式保存在数据库中。

您可以在CF env中的nodejs下通过此代码检索此信息。 vars:

const cfenv = require('cfenv');

let appID = cfenv.getAppEnv().app.application_id;
let instanceIndex = cfenv.getAppEnv().app.instance_index;

2 \当用户在Angular UI中触发了将调用REST服务器的操作时,该用户接收到该命令并从给定设备的DB中检索“ APP_ID:INSTANCE_INDEX”。

3 \接下来,我通过添加以下HTTP标头“ X-CF-APP-INSTANCE”,从REST服务器向WebSocket服务器打开一个WebSocket,该WebSocket精确地定位了包含该目标设备所连接的套接字的实例。 “ APP_ID:INSTANCE_INDEX”。

  // Create WS
  this._wsConnection = new WebSocket(this._serverURL, {
    protocol: 'rest',
    headers: { 'X-CF-APP-INSTANCE': 'APP_ID:INSTANCE_INDEX' }
  });

4 \ WebSocket服务器从REST服务器接收请求,并使用正确的设备对其进行处理,然后将结果返回到REST服务器,然后将其返回到Angular UI。

瞧! Problèmerésolu!