websocket Azure功能和webPubSub:获取客户端的数量

kadbb459  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(71)

我正在尝试设置一个以无服务器方式使用WebSockets的简单聊天应用。我正在使用Azure的WebPubSub服务,代码托管在Azure Function应用中。
我正在使用javascript,并在这个示例应用程序的基础上我的代码:https://github.com/Azure/azure-webpubsub/tree/main/samples/functions/js/simplechat那个链接有所有的后端代码,所有的触发器和绑定都和我的一样。
我可以在以下事件上运行代码:

  • 连接
  • 连通的
  • 讯息
  • 断开

对于connect事件,我有以下代码:(连接/索引. js)

context.bindings.actions.push({
    "actionName": "addUserToGroup",
    "userId": `${context.bindingData.connectionContext.userId}`,
    "group": "group1"
  });

它基本上告诉webPubSub将用户添加到一个组,在本例中称为“group 1”。
对于我的应用程序来说,当我从客户端向套接字发送消息时,我需要知道我是否是唯一连接到那个组的人。到目前为止,我在文档中没有找到任何关于这个问题的信息。
在示例应用中,每当出现消息时,就会运行以下代码(message/index.js)

var response = { 
....
    "states": {
      "counterState": {
        counter: msgCounter, 
      }
    }
  };
  return response;

每当有消息时,它们都会递增msgCounter变量,并将其保存到连接状态。当connected事件触发时,我尝试递增变量,但似乎无法在该特定函数中设置状态。然后,我尝试在message事件上执行该操作,但似乎该状态不是所有连接的全局状态(即,它特定于唯一连接)
在这方面的任何帮助都将非常感激。谢谢

j8ag8udp

j8ag8udp1#

没有办法检查 * 我是否是唯一连接到该组的人 *。有一个API可以使用groupExists检查 * 该组中是否有任何连接 *。
但是,即使有了这个API,检查和后续操作也不是原子的,因此即使groupExists返回no也不能保证您是第一个连接的对等体。(例如由于网络问题),因此即使连接A是第一个连接的对等体,也有可能当连接B连接时,连接A断开,从而导致连接B相信它是此时第一个连接的对等体。
对于您的场景“第一个连接的对等体必须等待offers连接到。其他对等体发送offers”,这个对等逻辑听起来更好地由应用程序端使用一些全局存储来维护,例如,在Azure表存储中,存在一个方法createEntity,其仅在实体不存在时成功。以下代码getOrAddFirstPeer显示了如何仅在第一个对等点不存在时设置它,以及如何使用TableClient在第一个对等点存在时获取它:

const { AzureNamedKeyCredential, TableClient } = require("@azure/data-tables")
const sharedKeyCredential = new AzureNamedKeyCredential("xxx", "xxx");
const table = new TableClient("https://xxx.table.core.windows.net", "xxx", sharedKeyCredential);

async function getOrAddFirstPeer(group, firstPeer) {
  var current = await getFirstPeerIfExists(group);

  if (current) return current;

  try {
    await table.createEntity({ partitionKey: "p1", rowKey: group, firstPeer: firstPeer });
    return firstPeer;
  } catch (error) {
    // first peer for the group already exists
    if (error.statusCode === 409) {
      return getFirstPeerIfExists(group);
    }
    throw error;
  }
}

async function getFirstPeerIfExists(group) {
  try {
    // store the first peer value in the firstPeer column
    const result = await table.getEntity("p1", group, { select: ["firstPeer"] });
    if (result) return result["firstPeer"];
    return null;
  } catch (error) {
    // first peer for the group does not exist
    if (error.statusCode === 404) {
      return null;
    }
    throw error;
  }
}

相关问题