首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何管理分布式调度程序中的不同节点选择唯一的事件?

如何管理分布式调度程序中的不同节点选择唯一的事件?
EN

Stack Overflow用户
提问于 2021-08-18 07:08:25
回答 1查看 134关注 0票数 0

我有一个分布式作业调度程序,运行在三台机器上,从数据库中选择事件(弹性搜索)。

我面临的问题是,有时所有节点都会选择相同的事件。这是对系统资源的不必要负载。

我想要做的是实现一种机制,这样作为分布式调度程序一部分的每个节点都应该选择唯一的事件。

我现正探讨以下方案:

  1. 在作业本身中添加节点ip,在从弹性搜索中获取数据时,我也可以传递节点id。(这是我正在使用的当前实现).

  1. 我曾试图探索动物园管理员以达到同样的目的,但我不确定是否有可能使用动物园管理员。

有人能帮我朝着正确的方向前进吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-18 07:20:26

使用后端存储作业没有错,但如果事务数量很高(> 1k tps),则可能成为瓶颈。

对于分布式调度,您需要解决两件事:

  1. 一个并且只有一个工作人员应该接受一个任务(您的相关问题)。如果一个工作人员运行任务失败(例如内存不足,重新启动,.),则
  2. 任务应该回到持久性。

要用典型的后端轻松地解决这两个问题,您可以添加两个字段:

代码语言:javascript
复制
State :: { PENDING, WORKING, DONE }
LastUpdate :: DateTime

要解决前一个问题,您必须原子地查询和更新一个PENDING记录(即在同一个事务中):

代码语言:javascript
复制
@Transactional
public Optional<Task> getTaskToWorkOnIfAny() {
    Optional<Task> task = myBackend.getOnePendingTask();
    if(task.isPresent())
        // update task, I'm working on it!
        myBackend.updateTask(task.get(), WORKING, new DateTime());
    return task;
}

然后,像往常一样努力去做。

要解决后一个问题,只需检查任务是否WORKING时间过长(如果任务很长,可以添加ping更新字段)。

如果任务失败,是否应该编写try/catchWORKING移动到PENDING。当然可以,但是如果系统真的崩溃了,那么您的任务将是WORKING,所以您应该遵循我以前的策略。

注意:要考虑整个问题,您只需遵循前面的代码,其中getTaskToWorkOnIfAny类似于SELECT * FROM task WHERE state = 'PENDING' OR (state = 'WORKING' AND lastUpdate < yesterday()。没别的了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68827919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档