集群怎么保证脚本线程唯一,用户怎么知道脚本线程运行状态?

有一个出库的任务,有多个用户,只要一个用户的出库参数是true,这个任务就要一直执行
目前有两台后端服务器做负载均衡,为了保证任务唯一,用redis做状态控制,用一个key来表示任务的运行状态,任务在用户前端点击启动的时候通过判断对应key的状态来选择是否要新启一个线程执行任务。

现在有问题,有时候出错误了会直接将这个线程中断掉,这时候只能把所有用户的参数设置为关闭再打开,才可以重新执行,除了现在的redis怎么设计可以让用户知道这个线程现在是运行,还是停止的状态

一个脚本任务
两台服务器
用户前端点击按钮开启/关闭脚本任务——只要一个用户是开启的,脚本任务就不停止。全部关闭脚本任务关闭
redis做脚本任务状态控制
脚本任务目前是另起一个线程,然后死循环执行,当用户都关闭的时候跳出死循环


你们是怎么设计的,这样设计好像问题很多,项目启动的时候怎么自动启动脚本任务并且保证集群中只有一个,怎么让用户知道当前脚本任务确实在执行


之前的问题描述可能不太好理解
下面是脚本的大概逻辑

//启动一个新线程执行,要求只有在所有用户的设置都是关闭的状态下,这个线程才会结束

while(有用户打开设置){

//给打开设置的用户工位分配对应的数据

}

graph TD

A[用户打开设置] -->C{判断脚本是否已经运行,通过redis中存的状态判断}

C -->|状态为true| D[脚本已在运行不做处理]

C -->|状态为false| E[运行脚本]

D -->F[结束]

E -->F[结束]

问题:

  1. 集群发布时,如何确保有用户打开设置的情况启动对应的脚本,并保证脚本再集群中唯一。
  2. 有时候会出现不知道什么意外导致这个脚本线程挂掉了,如何在监听这个脚本的运行状态。


回答:

可以使用redisson分布式锁来保证只有一个后端服务在运行该脚本任务,由于其创建的分布式锁是有过期时间(默认30秒)的且有锁续期机制(默认每隔10秒续期),所以尽管当执行脚本任务的服务崩溃,锁也会在一定时间之后过期,另一个服务则可以拿到锁执行任务。

用分布式锁的存在与否来判断当前脚本任务状态,锁存在表示脚本任务正在执行,反之则不在执行(当然如果服务崩溃后,锁没有被及时释放,这里会存在一定的延迟,可以通过调整锁的默认过期时间来缩短延迟时间)。

大致流程:

  1. 服务拿到分布式锁,启动任务(客户端通过锁是否存在来判断任务状态)
  2. 任务执行中
  3. 任务执行完成,释放锁

以上是 集群怎么保证脚本线程唯一,用户怎么知道脚本线程运行状态? 的全部内容, 来源链接: utcz.com/p/945346.html

回到顶部