- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下情况:
我有几个微服务,现在只有两个是相关的。
- Web 套接字服务 API
- 调度服务
我们有 3 个用户,我们将分别称为 1、2 和 3。这些用户将自己连接到我们后端的 Web 套接字端点。我们的微服务在 Kubernetes 上运行,每个服务都可以在 Pod 内多次复制。对于这种情况,我们有 1 个用于调度程序的运行容器,以及 3 个用于 Web 套接字 api 的运行容器。每个 pod 都有其负载均衡器,这将是每次的入口点。
在我们的情况下,我们将有以下“模式”:
现在我们有了系统的表示(和图例),我们的 3 个用户将想要使用该应用程序并进行连接。
正如我们所看到的,我们的 pod 的负载均衡器在不同的容器之间转发了我们用户的 Web 套接字连接。每个容器一旦获得新连接,就会通知 Dispatcher Service,这个容器会将其保存在自己的数据库中。
现在,3 个用户连接到 2 个不同的容器,并且 Dispatcher 服务知道这一点。
用户 1 想向用户 2 发送消息。容器 A 将收到一条消息并告诉 Dispatcher Service:Please, send this to the user 2
.
由于调度程序知道用户 2 连接到哪个容器,因此我想直接向我的容器发送请求,而不是向 Pod 发送请求。将其发送到 Pod 会导致向负载均衡器发送请求,负载均衡器实际上将请求分派(dispatch)到最可用的容器实例......
我怎么能设法获得容器 IP?它可以被另一个 Pod 中的另一个容器访问吗?
对我来说,最好的方法是,一旦应用程序启动,它会获取当前容器的 IP,然后在注册请求中将其发送给调度程序,这样调度程序就会知道 ContainerID=IP
谢谢!
编辑 1
有我的web-socket-service-api.yaml
apiVersion: v1
kind: Service
metadata:
name: web-socket-service-api
spec:
ports:
# Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
- port: 8080
targetPort: 8080
protocol: TCP
name: grpc
# Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
- port: 8081
targetPort: 8081
protocol: TCP
name: rest
# Port that accepts WebSockets.
- port: 8082
targetPort: 8082
protocol: TCP
name: websocket
selector:
app: web-socket-service-api
type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-socket-service-api
spec:
replicas: 3
template:
metadata:
labels:
app: web-socket-service-api
spec:
containers:
- name: web-socket-service-api
image: gcr.io/[PROJECT]/web-socket-service-api:latest
ports:
- containerPort: 8080
- containerPort: 8081
- containerPort: 8082
最佳答案
Dispatcher ≈ 消息代理
正如我对您的设计的理解,您的 Dispatcher 本质上是您的 Websocket 服务的 pod 的消息代理。让所有 Websocket pod 连接到代理并让代理路由消息。这是一个有状态的服务,你应该使用 StatefulSet为此在 Kubernetes 中。根据您的要求,可能的解决方案是为此使用 MQTT 代理,例如mosquitto .大多数 MQTT 代理都支持 websocket。
横向扩展:Pod 的多个副本
each services can be replicated multiple times inside Pods. For this situation, we have 1 running container for the dispatcher, and 3 running containers for the web socket api.
Each pod has its Load Balancer and this will be each time the entry point.
To me, the best approach would be that, once the app start, it gets the current container's IP and then send it within the register request to the dispatcher, so the dispatcher would know that ContainerID=IP
关于docker - GKE - 在运行时绕过 Pod LoadBalancer(Pod 的外部 IP)到 Pod 的容器 IP 以用于 WebSocket 目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59095095/
我想知道是否有任何方法可以逃避 __metatable 元方法。我知道没有,但我正在尝试做这样的事情,但显然 __metatable 阻止了这种情况的发生: -- pretend that t
我想知道如果满足某些条件,是否可以跳过 do while 循环,甚至中途退出方法?这是我的意思的一个例子(一切正常) public void loanBook() { Sc
曾几何时,一位前端开发人员有一些菜单,当有人在页面上的任何位置单击菜单之外时,他想要关闭一些菜单,因此他使用了一些 if 和提到的方法来处理他的工作。当然,后来这又让他痛不欲生,因为在上述菜单中进行的
我开发了一个内核模块,它完成了繁重的工作,当然需要时间。问题是模块使用 CPU 超过 20 秒,并且结果引发了softlockup_threshold的BUG。 我的问题是,有什么办法可以绕过这个吗?
我相信我对避免代码重复这个长期存在的问题提出了一个略有不同的看法。设置相当标准——一堆 if 语句执行类似的操作。下面是一个简短示例。 我正在尝试从代码效率、紧凑性和程序员易用性方面找出解决此类情况的
我的服务器上有 10 秒,这对我想要做的事情来说还不够。它也被网络托管商禁用了。 如果在执行了一定时间后,我执行了一个单独的 PHP 页面,这算在同一时间还是在该页面上重新开始? 还有别的办法吗? 最
我已经下载并编译了 Microsoft 迂回库。在我的项目中,我包含了头文件并添加了 .lib 文件作为依赖项。一切都编译无误。现在我一直在尝试绕过 DrawText,但由于某种原因根本没有调用绕过的
我正在使用 Mockito 编写一个 JUnit 测试用例,我试图绕过我的测试方法中的静态方法调用。运行测试用例时出现 NullPointerException。 是否有任何方法可以在不使用 Powe
我不知道为什么,这很奇怪,但是我的代码在循环。实际上,在第一张表 (ws1) 中,我正在 Worksheet_Change 上执行此操作事件 : Application.EnableEvents =
我正在尝试在 Ubuntu Docker 容器上安装 icinga2-ido-pgsql。 我的数据库在一个单独的容器中。 要安装它,我运行 RUN apt-get install -q -y ici
我在 Dynamics AX 2012 中有一个 AOT 查询,它由 HcmWorker 和 HcmEmployment 表(等等)组成。我的问题是,当我创建报告(不是 SSRS)或以其他方式使用此查
我需要通过cdn将SDK集成到我的next.js项目中所以我需要把 ' />进入我的代码。然后运行 window.sdk = new PrivateSDK()和 window.sdk.someFu
有没有办法可以绕过 Java 中的错误消息? 如果我得到一个错误,但没有可行的方法来改变我的程序怎么办?如果我怀疑我可能会从代码块中得到错误,但我不知道它何时或是否会发生,该怎么办?有很多次我不得不让
我有以下 HTML Facebook 我有一个 onclick 事件处理程序,当单击上面的链接时,会调用 window.open。这在 Chrome 中有效,但在 Safari 中无效。如何让它在 S
我们正在编写一个 ASP.NET MVC 应用程序。默认情况下,如果客户端浏览器具有 Javascript,页面上每个表单的处理程序都会由 Javascript 设置为将提交内容发送到 Ajax“管道
我正在使用 Cloudflare 来加速我的网站,它非常适合。不幸的是,我的一些用户需要将大于 Cloudflare 允许的最大值(即 300MB 大小)的视频上传到我的网站。有什么方法可以告诉 Cl
我正在尝试编写一个自定义中间件,通过检查请求中是否存在 :user key 来检查用户是否经过身份验证。 (defn wrap-authenticated [handler] (fn [{user
你好,祝你有美好的一天。 这里需要一些帮助: 情况: 我有一个不起眼的 DirectX 9 应用程序(名称和应用程序详细信息与问题无关),自某些驱动程序版本以来,它会导致所有 nvidia 卡(GeF
我喜欢制作高效的应用程序,并且经常寻求并发和多线程来提高应用程序响应能力等,但最近我的尝试似乎总是被 WPF 的单线程性所阻碍。无论我的代码多么高效和并行,WPF 似乎都会不断地拖延我的 UI,并使我
我正在使用 Cloudflare 来加速我的网站,它非常适合。不幸的是,我的一些用户需要将大于 Cloudflare 允许的最大值(即 300MB 大小)的视频上传到我的网站。有什么方法可以告诉 Cl
我是一名优秀的程序员,十分优秀!