我有多个侦听器轮询单个表并搜索挂起的记录和进程(进行 api 调用,运行一些业务逻辑)它们
- 侦听器从表中选取 5 条具有 limit 查询的挂起记录,并将其listener_id放在列中,以便为该特定侦听器锁定这些记录
- 其他侦听器读取剩余的待处理记录并锁定其中 5 个
- 处理后,侦听器将更新记录状态为完成
这样做是为了水平可伸缩性。此方法的一个问题是,如果侦听器成功处理记录但无法更新记录,则记录将停滞在进行状态。
我想在这些锁上安装 TTL,这种方法的问题在于我不允许重复处理这些记录。
我无法使用选择进行更新,因为它是阻止调用。
请指教,还有什么其他方法可以解决这个问题
我在应用程序中运行了侦听器。所以我决定用这种方式解决它。
- 应用程序使用application_id在mysql表中创建记录(每台机器都是唯一的)
- 侦听器仅按此application_id和偏移量轮询表。因此,我们实现了水平可扩展性和负载平衡。
- 侦听器还记录了上次记录读取的偏移量。 如果计数器为 5,则在下一次轮询中,我们搜索 5>记录。所以这也有助于我去重复数据。
- 处理记录后,我们按小于 5 的 application_id 和记录对表运行删除查询。