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

Fiona

有一个出库的任务,有多个用户,只要一个用户的出库参数是true,这个任务就要一直执行 目前有两台后端服务器做负载均衡,为了保证任务唯一,用redis做状态控制,用一个key来表示任务的运行状态,任务在用户前端点击启动的时候通过判断对应key的状态来选择是否要新启一个线程执行任务。 现在有问题,有时候出错误了会直接将这个线程中断掉,这时候只能把所有用户的参数设置为关闭再打开,才可以重新执行,除了现在的redis怎么设计可以让用户知道这个线程现在是运行,还是停止的状态 一个脚本任务 两台服务器 用户前端点击按钮开启/关闭脚本任务——只要一个用户是开启的,脚本任务就不停止。全部关闭脚本任务关闭 redis做脚本任务状态控制 脚本任务目前是另起一个线程,然后死循环执行,当用户都关闭的时候跳出死循环 * * * **你们是怎么设计的,这样设计好像问题很多,项目启动的时候怎么自动启动脚本任务并且保证集群中只有一个,怎么让用户知道当前脚本任务确实在执行** * * * 之前的问题描述可能不太好理解 下面是脚本的大概逻辑 //启动一个新线程执行,要求只有在所有用户的设置都是关闭的状态下,这个线程才会结束 while(有用户打开设置){ //给打开设置的用户工位分配对应的数据 } graph TD A[用户打开设置] -->C{判断脚本是否已经运行,通过redis中存的状态判断} C -->|状态为true| D[脚本已在运行不做处理] C -->|状态为false| E[运行脚本] D -->F[结束] E -->F[结束] 问题: 1. **集群发布时,如何确保有用户打开设置的情况启动对应的脚本,并保证脚本再集群中唯一。** 2. **有时候会出现不知道什么意外导致这个脚本线程挂掉了,如何在监听这个脚本的运行状态。**

阅读量:283

点赞量:14

问AI
可以使用redisson分布式锁 来保证只有一个后端服务在运行该脚本任务,由于其创建的分布式锁是有过期时间(默认30秒)的且有锁续期机制(默认每隔10秒续期),所以尽管当执行脚本任务的服务崩溃,锁也会在一定时间之后过期,另一个服务则可以拿到锁执行任务。 用分布式锁的存在与否 来判断当前脚本任务状态,锁存在表示脚本任务正在执行,反之则不在执行("当然如果服务崩溃后,锁没有被及时释放,这里会存在一定的延迟,可以通过调整锁的默认过期时间来缩短延迟时间")。 大致流程: 1. 服务拿到分布式锁,启动任务(客户端通过锁是否存在来判断任务状态) 2. 任务执行中 3. 任务执行完成,释放锁