调度队列的理解和运用

队列的运用

当前模型(项目情况)

1.监控平台有执行端和服务端
执行端的主要作用:1.注册节点 2.监控资源 3.插件式的添加资源后续的具体操作实现 4.发送心跳到服务端
服务端的主要作用:1.查看资源当前的状态 2.控制资源的状态 3.给执行端发送命令执行端只负责执行
4.接收执行端发送的心跳判断节点的健康状况

当前需要实现的目标:

1 服务端功能:
1.1 结点出现问题时,能够将结点上运行的监控正确迁移到其他结点。
1.2 结点公平性分配,当不断增加监控时,多个结点的分配应该尽可能公平。
1.3 结点条件分配,当结点有约束时,分配到结点的资源需要满足约束条件。
注意,这里约束条件可能会变化,当结点的约束条件发生变化时,需要检查当前结点的所有的资源是否满足
约束条件,如果不满足,则需要马上重新分配。

现在的问题

如果当前有一个有资源的节点不健康(死掉了),那么现在我需要将这个节点上的资源迁移到其他满足条件的节点上,但是现在没有满足条件的节点怎么办?

解决!!!

当没有满足条件的节点存在的时候,先把这些资源先添加到一个队列里面,当有满足条件的节点出现的时候,将这些资源再从队列中取出来进行迁移。

比喻

你可以看成这样一个模型,外面有人源源不断的送鸡蛋过来,你一下子搞不赢,就将送过来的鸡蛋全部先放到临时得盒子里,然后另一个人在里面一个一个放到礼盒里面去;如果哪个礼盒坏了,就把鸡蛋也都倒出来进入临时盒子。跟新来的一起来调度。鸡蛋就是资源,礼盒就是结点,临时盒子就是调度队列。

运用举例:

我现在使用的是:ConcurrentLinkedQueue队列

package org.jeecg.modules.node.service.impl;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.source.entity.SourceStatus;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.concurrent.ConcurrentLinkedQueue;

@Slf4j
@Service
@RequiredArgsConstructor
public class SourceScheduleQueueService {
    private final ConcurrentLinkedQueue<SourceStatus> scheduleQueue = new ConcurrentLinkedQueue<>();

    public void addToQueue(SourceStatus source) {
        scheduleQueue.offer(source);
        log.info("Added source {} to schedule queue", source.getId());
    }

    public void addAllToQueue(Collection<SourceStatus> sources) {
        sources.forEach(this::addToQueue);
    }

    public SourceStatus pollFromQueue() {
        return scheduleQueue.poll();
    }

    public boolean isEmpty() {
        return scheduleQueue.isEmpty();
    }

    public int getQueueSize() {
        return scheduleQueue.size();
    }
}

要加入队列就调用addToQueue或者addAllToQueue。
要取出就是pollFromQueue

ConcurrentLinkedQueue的基础知识

ConcurrentLinkedQueue是非阻塞线程安全的队列,适用于“高并发”的场景。是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)

①、 非阻塞算法
ConcurrentLinkedQueue 使用的是 Michael & Scott 算法(Michael & Scott 算法的提出者是 Maged M. Michael 和 Michael L. Scott)。Michael & Scott 是无锁算法,允许多个线程并发访问队列,而无需显式的锁(通过使用 CAS 等原子操作保证线程安全),从而减少了锁竞争和上下文切换的开销。
②、 线程安全
该队列是线程安全的,允许多个线程同时进行插入和删除操作。所有的操作(如插入、删除和遍历)都是原子操作,不会出现线程间的竞态条件。
③、高性能
由于采用了非阻塞算法,ConcurrentLinkedQueue 在高并发环境下性能优越,特别适用于需要高吞吐量的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值