生成并保留连续序列号

问题描述 投票:0回答:1

我面临的问题是如何在分布式环境中的设备表中保留唯一的连续序列。

情况

客户有多个刷写站,对设备进行刷写。 根据设备的类型,需要保留连续的序列号,将其闪存到设备上,并在成功的闪存过程中向数据库确认。 即使刷新过程失败,我也必须确保序列号是连续的。 闪烁终端通过 REST 服务请求序列号。

当前解决方案

在我当前的解决方案中,闪烁站按设备类型请求串行。 该条目已创建并标记为“正在进行”。我的问题是,如果软件例如崩溃时,序列号仍保留,在最坏的情况下会导致设备类型的序列号出现间隙。 成功后,状态设置为“完成” - 这是最好的情况

我当前的表有以下列:设备类型、序列号、状态、生产日期

任何有关可行方法的提示都将受到高度赞赏。

php mysql rest mariadb
1个回答
0
投票

我做过一个类似的项目,其中大约10个工作站将同时处理一些数据,但偶尔,其中一些会失败,与您的情况类似,用户希望序列号“不被跳过”。

让我分享一下我们应用的方法:

数据库表(我们将其命名为“jobs”)将存储基本数据,以及时间戳字段和“序列”字段(整数类型)和“结果”字段(默认为“进行中”)

但是串行字段的默认值为-1

因此,当工作站开始作业时,会插入一条串行字段为“-1”、结果字段为“进行中”的数据库记录,并等待工作站“完成”作业。

当工作站成功处理数据时,它会将“结果”字段更新为“成功”,但如果失败(类似于“崩溃”的情况,那么结果字段将保持“正在进行”一段时间)好久了

我们将每分钟运行一个 cron 作业(计划作业)来

  1. 从作业中选择最大(串行)
  2. 从结果 =“成功”且序列 = -1 按时间戳排序的作业中选择 *
  3. 循环(2)的记录,并将序号赋给数据库记录(按顺序,序号加一)

这样就不会出现“跳过”的序列号了

失败的(对于你的情况我认为它是“崩溃”)将单独处理。我认为您可以使用“最大持续时间”,在此之后作业仍在“进行中”并将其视为“崩溃”

希望上述内容(基于我的一个项目)能为您的案例提供一些灵感/想法。

© www.soinside.com 2019 - 2024. All rights reserved.