在mysql表中轮询和处理挂起记录的不同方法

时间:2015-04-16 09:20:16

标签: mysql message-queue polling

我有多个侦听器,它们轮询单个表并搜索待处理的记录和进程(进行api调用,运行一些业务逻辑)

  1. 侦听器从表中选择带有限制查询的5个待处理记录,并将其listener_id放入列中,以便为此特定侦听器锁定这些记录
  2. 其他侦听器读取剩余的待处理记录并锁定其中的5个
  3. 一旦处理完,侦听器就会将记录状态更新为
  4. 这是为了实现水平可伸缩性。这种方法的一个问题是,如果侦听器成功处理记录但未能更新记录,则记录将停留在进度状态。

    我想在这些锁上有TTL,这种方法的问题是我不能允许重复处理这些记录。

    我无法使用select for update作为阻止调用。

    请告知,解决这个问题的其他方法是什么

1 个答案:

答案 0 :(得分:0)

我在应用程序中运行了监听器。所以我决定以这种方式解决它。

  1. 应用程序使用application_id(每台机器唯一的东西)在mysql表中创建记录
  2. 监听器仅通过此application_id和偏移轮询表。因此,我们实现了水平可扩展性和负载平衡。
  3. 监听器还记录了最后一条记录读取的偏移量。如果计数器是5,则在下一轮询中我们搜索记录>所以这也有助于我进行重复推算。
  4. 处理完记录后,我们会通过application_id在表格上运行删除查询,并记录小于5的记录。