【发布时间】:2022-01-10 10:25:15
【问题描述】:
我正在尝试将套接字 io 服务从 GCP(App Engine)迁移到 kubernetes 集群。 在 GCP 端一切正常(我们有一个没有副本的服务器实例)。 迁移到k8s的进展很顺利,只是客户端socket连接到服务器时,没有收到一些信息:
-
在传输“轮询”中:当然,由于有两个 pod,这不再正常工作,并且客户端套接字不断断开/重新连接循环。
-
在“websocket”传输中:连接已正确建立,客户端可以在“广播到所有客户端”模式下从服务器接收数据 =>
socket.emit('getDeviceList', os.hostname())但是,一旦服务器尝试仅将数据发送到相关客户io.of(namespace).to(socket.id).emit('getDeviceList', JSON.stringify(obj)),这个没有收到任何东西…… -
此外,我将服务修改为只有一个 pod 用于测试,轮询模式正常工作,但是,我发现自己与 websocket 模式处于相同的情况 => 我无法将信息发送给精确的客户端...
当然,App Engine 端的相同代码可以正常工作,并且客户端可以正确接收所有内容。
我正在合作:
"socket.io": "^3.1.0",
"socket.io-redis": "^5.2.0",
"vue": "^2.5.18",
"vue-socket.io": "3.0.7",
我的服务器端配置:
var io = require('socket.io')(server, {
pingTimeout: 5000,
pingInterval : 2000,
cors: {
origin: true,
methods: ["GET", "POST"],
transports: ['websocket', 'polling'],
credentials: true
},
allowEIO3: true
});
io.adapter(redis({ host: redis_host, port: redis_port }))
我的前端配置:
Vue.use(new VueSocketIO({
debug: true,
connection: 'path_to_the_socket_io/namespace,
options: {
query: `id=..._timestamp`,
transports: ['polling']
}
}));
我的入口侧注释:
kubernetes.io/ingress.class: nginx kubernetes.io/ingress.global-static-ip-name: ip-loadbalancer
meta.helm.sh/release-name: xxx
meta.helm.sh/release-namespace: xxx -release nginx.ingress.kubernetes.io/affinity: cookie nginx.ingress.kubernetes.io/affinity-mode: persistent nginx.ingress.kubernetes.io/force-ssl-redirect: true nginx.ingress.kubernetes.io/proxy-connect-timeout: 10800
nginx.ingress.kubernetes.io/proxy-read-timeout: 10800
nginx.ingress.kubernetes.io/proxy-send-timeout: 10800
nginx.org/websocket-services: app-sockets-cluster-ip-service
我的问题是:为什么我可以向所有用户消息广播而不是向我的套接字发送特定消息?
有人可以帮助我吗? :)
非常感谢!
【问题讨论】:
标签: vue.js google-app-engine kubernetes socket.io kubernetes-ingress