node.js - Socketio 动态命名空间连接事件有时不会触发命名空间范围
问题描述
我遇到了 Socket io 动态命名空间 Kubernetes 的一个奇怪问题。客户端连接到 socketio 服务器,但有时连接事件永远不会触发命名空间实例。
将正则表达式用于动态命名空间时,我遇到了间歇性问题。
但是,如果:
- 运行单个 socket.io 节点。
- 或者只有一个命名空间
- 或者没有命名空间
=> 正常工作!!!
代码大部分时间都运行良好。仅当 socket.io 客户端未能触发命名空间连接事件时才失败。
注意:
- 我的应用程序中只有一个命名空间实例的代码片段。
- 当在 Kubernetes 中部署的具有许多 pod 的多个节点上运行时,会出现此问题。
包裹
"socket.io": "^4.1.1",
"socket.io-client": "^4.1.1",
服务器代码:
const tenantWorkspaces: socketio.Namespace = chatServer.io.of(/^\/\w+$/);
tenantWorkspaces.on('connection', async (socket: socketio.Socket) => {
const tenantWorkspace = socket.nsp;
console.log('========children namespace======');
socket.on('clientEmit', (data) => {
console.log('clientEmit', data);
});
tenantWorkspace.to(socket.id).emit('serverEmit', {data: 'server emitted !!!'});
workspaceId = isString(socket.handshake.query.workspace_id) ? socket.handshake.query.workspace_id : null;
console.log(`workspace: ${workspaceId}, contact: ${contactId} connected!`); // debug
};
客户端代码
const options = {
query: {
'workspace_id': window.LINEBASE_WORKSPACE_ID || '',
},
resource: "socket.io",
transports: ['websocket'],
upgrade: false,
};
socket = io(`${socketUrl}/${namespace}`, options);
socket.on("connect", () => {
console.log('socket connected: ' + socket.connected); // true
console.log('socketID:', socket.id);
});
socket.on('serverEmit', (data) => {
console.log(`================ Connect namespace ${namespace} successfully ==============`, data);
})
我花了将近两周的时间找到解决方案,但仍然没有结果。这个问题有什么解决方案吗?我的应用程序有很多命名空间,所以我需要使用动态命名空间而不是硬代码。
解决方案
推荐阅读
- excel - Excel VBA 按钮和控件在不同计算机上更改大小
- react-native - 如何在 React Native 中下载资产图像?
- jasper-reports - 如何更改 adobe reader 的缩放级别?
- django - 如何从 django 查询中获取 sql 等效查询?
- java - 对如何将 txt 文件写入字符串然后将其转换为二维数组感到困惑
- qr-code - 用于识别分隔页的条形码
- html - 如何使用 col-sm 内联?
- azure - Databricks 文件存储 = 0
- android - Android应用程序忽略用户应用程序权限
- c++ - 我需要帮助修复 C++ 空白检测器