java - Spring Boot - 每个 pod 运行一个特定的后台作业
问题描述
我来自 PHP/Python/JS 环境,其中将 Web 应用程序的多个实例作为单独的进程和异步任务(如队列处理)作为单独的脚本运行是一种标准。
例如。在k8s环境下,会有
- 仅N 个Web 服务器实例,每个实例都在单独的 pod 中运行
- 对于每个队列,消费者的动态数量,每个在单独的 pod 中
- 使用 k8s crontab功能进行 cron 调度,将调度过程留给 k8s
这种方法很好地匹配云性质,其中工作负载可以在较少数量的强大机器和许多功能较弱的机器上调度,并允许非常精细地控制自动缩放(例如,基于特定队列中的消息数量)。
此外,开发人员和 DevOps 责任之间也有明确的分离。
最近,我尝试使用Java Spring Boot应用程序复制相同的设置,但失败了。
尽管 Java 框架说它们是“云原生”,但似乎所有文档仍然围绕单体应用程序构建,它在单独的线程中处理所有消费者和 cron 调度。
这个问题的明确答案是微服务,但这超出了范围。
我需要的是在云中为每个 pod 部署应用程序的单独部分(如仅 1 个队列侦听器),同时保持整体代码架构。
所以,问题是:
如何设计我的 Spring Boot 应用程序,以便:
- 我可以在没有队列侦听器和预定作业的情况下单独运行网络服务器
- 我可以在 k8s 中为每个 pod 运行一个队列侦听器
- 我可以使用 k8s cron 调度而不是 App 级别的 Spring 调度程序吗?
我找到了几种方法来实现这样的目标,但我希望必须有一些“或多或少的标准方式”。
我想到的替代解决方案:
- 具有单独的模块和单独的应用程序定义,以便单独构建每个“命令”
- 使用 Spring Profiles 仅根据一些环境变量来实例化特定的服务
- 实现自定义命令行运行程序,它将解析命令名称/队列名称并动态创建适当的服务(这似乎是与“脚本语言”中的完成方式最相似的方法)
我主要想通过这种设置实现的是:
- 为了能够在大量弱硬件上运行应用程序,而不是拥有 1 台具有 32 个 cpu 内核的机器
- 更轻松地扩展每个工作负载
- 从已经很复杂的监控基础设施中移除一层(k8s 已经允许非常精细的资源监控、应用程序级任务调度和并行性使这种方式更加困难)
我是否遗漏了什么,或者只是以这种方式编写 Java 服务器应用程序不是标准的?谢谢!
解决方案
我不明白你的帖子的本质。您想要一个具有“单体代码架构”的应用程序。然后将其部署到几个 pod,但实际上只有部分应用程序在运行。你为什么不把你想要特别的部分分开来成为他们自己的应用程序呢?
这可能是因为我来自 Java 背景,还没有部署过单体脚本应用程序。
推荐阅读
- codeigniter - 图像水印在 Codeigniter 中不起作用
- rabbitmq - 最佳可用工人而不是循环
- perl - 发送消息时出现 0x0A 和 0x0D 的 RS232 问题
- docker - ActionController::InvalidAuthenticityToken 与 devise、rails 和 docker
- html - TUMBLR:如何修改 html 代码以将链接 url 放在这些元素上?
- excel - 以当前文件名保存并附上日期
- angular - Kendo Angular Tabstrip 包装器
- laravel - 查询两个不相关的表的结果
- ssl - 证书错误 DLG_FLAGS_SEC_CERT_CN_INVALID
- java - 为什么 lockCanvas 会抛出非法参数异常?