在这种情况下,Cloud Foundry面临一个问题:
问题:
如何调用正确的WebSocket实例来访问设备?
谢谢!
同步。
答案 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!