node.js - 使用 Kubernetes 和自动缩放创建 NodeJS 数据处理应用程序
问题描述
我有一个数据处理应用程序,我通过手动创建服务器然后在它们上运行 docker 来通过 docker 进行扩展。
这是架构的样子
1 塔斯克 (tasker.example.com)
tasker 应用程序找到需要处理的数据,然后使用上下文访问 api。tasker 还遍历 5-10 个正在运行的现有 WORKER 服务器,并检查它们是否有任何任务正在运行。tasker 确保限制不会达到每台服务器 100 个任务,以保持及时处理。
2 Worker(数据处理应用程序)
每个工作人员使用此库 https://github.com/samrith-s/concurrent-tasks记录正在处理的当前任务
在worker中定义了许多数据类型及其各自的功能。
问题
该策略不可扩展。它稍后会造成巨大的混乱,这就是为什么我正在寻找使用 kubernetes 的解决方案。
我想要达到的目标
Kubernetes 集群可以:
- 公开一个 API,我可以在其中发送我的 TASKER 应用程序中的所有任务 - 所有任务都涌入的单个端点
- 根据限制及其当前队列在 WORKER 容器之间分配任务
- 如果作业无法排队,则启动新的 pod (WORKERS)
- 记录哪个作业被发送到哪个工人以及它是成功还是失败。
我一直在阅读 RabbitMQ 和 Celery,所以我熟悉这些概念。
我应该采用这种 kubernetes 策略还是像 Bull 这样的更好的队列系统?
解决方案
Kubernetes 应该可以很好地解决这个问题。
让 Tasker 应用程序找到要完成的工作并在 RabbitMQ 中生成任务消息。
设置工作应用程序以使用消息并完成工作。使用 Kubernetes Horizontal Pod Autoscaler根据在 RabbitMQ 中排队的作业数量来扩展 worker 部署。
推荐阅读
- c# - 让类返回一个字段
- python - 根据具有子字符串的特定值删除字典项
- sql - 如何修复:SQLSTATE [42S22]:找不到列:1054 Unknown column 'create_at
- python - ModelForm save() 得到了一个意外的关键字参数“提交”
- java - 大小为 2N 的数组中的 N 个重复元素
- php - 检查文件是否存在在在线主机上的 laravel 中不起作用
- python - 在这种情况下我应该使用哪个图像质量指标(二进制分割图像)?
- java - 从 url 获取文件名时如何修复空名称
- java - Java多线程在数据库中插入数百万条记录
- android - FIrebase 测试实验室应用程序仅显示没有互联网页面