处理大量查询并避免重复

时间:2016-09-24 06:16:21

标签: go

我的项目涉及并发和数据库管理。这意味着我必须在所有线程之间同时编辑数据库。更具体地说,我正在从数据库中读取一行,然后插入一行来标记我抓住了该行。这可以用于事务,但由于我将在多台机器上运行该程序,我将在每个机器上拥有不同的数据库连接。对我来说,完成上述任务是更好的方式吗?

1 个答案:

答案 0 :(得分:4)

使用事务和版本字段/列应用乐观并发(可能是时间戳或时间戳加上刚刚增加的实际版本号或版本号的其他机制)是必须的。

但是,由于您在不同的计算机上执行此操作,因此可能会发生大量重复失败的事务。

为了防止这种情况,您可以使用排队机制。调度程序从数据库中读取未处理的记录,并使用队列或作业调度程序将它们分派给工作人员。然后,每个worker将从该队列中获取id并在事务中处理它。

这样:

  1. 如果交易失败,调度员会再次排队
  2. 如果工人垮台,其他工人会继续(注意到下降是监控的问题)
  3. 工作人员可以轻松扩展,并且可以随时添加新工作人员(只要您的数据库不是您的瓶颈)。
  4. 在这种情况下,请求/回复模式最好,以防止队列拥塞。我已成功(并且愉快地)使用NATS来处理类似情况。当然,您可以使用您选择的其他工具,但请记住您必须处理请求/回复部分。只是将事情排在队列中并不能解决所有问题,应该控制排队的工作量!