分布式集群环境下Phoenix channel的socket老是关闭
Phoenix channel's socket keeps getting closed in distributed cluster environment
我按照 this 系列文章在 Google 云中创建部署。一切都按预期工作,除了凤凰频道。
后端没有错误。在 Javascript 前端,我得到第一个通道错误,然后在使用通道时套接字在前端关闭。并且这在 10-20 秒的间隔内不断重复。
CHANNEL ERROR!
SOCKET CLOSE!
CHANNEL ERROR!
SOCKET CLOSE!
来自这段代码:
socket.connect()
socket.onError( e => console.log("SOCKET ERROR", e) )
socket.onClose( e => console.log("SOCKET CLOSE", e))
channel = socket.channel("note:" + noteId, {})
channel.onError( e => console.log("CHANNEL ERROR!", e) )
channel.onClose( e => console.log("CHANNEL CLOSED!", e) )
我需要帮助来调试它并找出问题的根源。如果需要任何代码,请告诉我,我将用该代码更新问题。现在已经一周了。 :(
非常感谢!
(本地运行没问题)
更新: 我看到的唯一区别是在本地服务器上,phoenix.js 不断发送心跳,但这在服务器上没有发生。
更新:
---- my-ingress.yaml ----
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
# ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "gce"
kubernetes.io/ingress.global-static-ip-name: my-ingress-ip
kubernetes.io/tls-acme: "true"
spec:
rules:
- host: apiv2.example.com
http:
paths:
- path: /*
backend:
serviceName: my-service-nodeport
servicePort: 80
- path: /.well-known/acme-challenge
backend:
serviceName: kube-lego-gce
servicePort: 8080
tls:
- secretName: my-secret-tls-7
hosts:
- apiv2.example.com
这是ingress file I am using and also using kube-lego用的
更新: 我实现了这段代码(我在开发工具中检查了帧,它们正在发送)。但是仍然......它给出了SOCKER ERROR。发送心跳可能不是问题。
const HEARTBEAT_INTERVAL_MS = 5000
socket.onOpen(() => {
clearInterval(this.heartbeatTimer);
this.heartbeatTimer = setInterval(() => {
return socket.push({
topic: "phoenix",
event: "heartbeat",
payload: {},
ref: socket.makeRef(),
});
},
HEARTBEAT_INTERVAL_MS
);
})
您可能需要增加 GCP 上 backend service 的响应超时。
默认情况下,超时设置为 30 秒,这对我造成了同样的问题。
我按照 this 系列文章在 Google 云中创建部署。一切都按预期工作,除了凤凰频道。
后端没有错误。在 Javascript 前端,我得到第一个通道错误,然后在使用通道时套接字在前端关闭。并且这在 10-20 秒的间隔内不断重复。
CHANNEL ERROR!
SOCKET CLOSE!
CHANNEL ERROR!
SOCKET CLOSE!
来自这段代码:
socket.connect()
socket.onError( e => console.log("SOCKET ERROR", e) )
socket.onClose( e => console.log("SOCKET CLOSE", e))
channel = socket.channel("note:" + noteId, {})
channel.onError( e => console.log("CHANNEL ERROR!", e) )
channel.onClose( e => console.log("CHANNEL CLOSED!", e) )
我需要帮助来调试它并找出问题的根源。如果需要任何代码,请告诉我,我将用该代码更新问题。现在已经一周了。 :(
非常感谢!
(本地运行没问题)
更新: 我看到的唯一区别是在本地服务器上,phoenix.js 不断发送心跳,但这在服务器上没有发生。
更新:
---- my-ingress.yaml ----
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
# ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "gce"
kubernetes.io/ingress.global-static-ip-name: my-ingress-ip
kubernetes.io/tls-acme: "true"
spec:
rules:
- host: apiv2.example.com
http:
paths:
- path: /*
backend:
serviceName: my-service-nodeport
servicePort: 80
- path: /.well-known/acme-challenge
backend:
serviceName: kube-lego-gce
servicePort: 8080
tls:
- secretName: my-secret-tls-7
hosts:
- apiv2.example.com
这是ingress file I am using and also using kube-lego用的
更新: 我实现了这段代码(我在开发工具中检查了帧,它们正在发送)。但是仍然......它给出了SOCKER ERROR。发送心跳可能不是问题。
const HEARTBEAT_INTERVAL_MS = 5000
socket.onOpen(() => {
clearInterval(this.heartbeatTimer);
this.heartbeatTimer = setInterval(() => {
return socket.push({
topic: "phoenix",
event: "heartbeat",
payload: {},
ref: socket.makeRef(),
});
},
HEARTBEAT_INTERVAL_MS
);
})
您可能需要增加 GCP 上 backend service 的响应超时。
默认情况下,超时设置为 30 秒,这对我造成了同样的问题。