Go 处理大量查询并避免重复

Go 处理大量查询并避免重复,go,Go,我的项目涉及并发和数据库管理。这意味着我必须在所有线程之间同时编辑数据库。更具体地说,我从数据库中读取一行,然后插入一行来标记我抓住了那行。这可能适用于事务,但由于我将在多台机器上运行此程序,因此在每台机器上都有不同的数据库连接。他们是我完成上述任务的更好方式吗 这里必须使用事务和版本字段/列(可以是时间戳或时间戳加上实际版本号(仅增加)或版本号的其他机制)应用乐观并发 但由于您在不同的机器上执行此操作,因此可能会发生大量重复的失败事务 为了防止这种情况,您可以使用排队机制。dispatcher

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

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

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

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

这样:

  • 如果事务失败,dispatcher将再次对其排队
  • 如果一名工人倒下,其他工人将继续工作(注意倒下是一个监控问题)
  • 工人可以轻松扩展,并且可以随时添加新工人(只要数据库不是瓶颈)

  • 在这种情况下,请求/应答模式最能防止队列拥塞。我已经成功地(并且愉快地)使用了类似的案例。当然,您可以使用您选择的其他工具,但请记住,您必须处理请求/回复部分。仅仅在队列中扔东西并不能解决所有问题,排队的工作量应该得到控制

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

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

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

    这样:

  • 如果事务失败,dispatcher将再次对其排队
  • 如果一名工人倒下,其他工人将继续工作(注意倒下是一个监控问题)
  • 工人可以轻松扩展,并且可以随时添加新工人(只要数据库不是瓶颈)
  • 在这种情况下,请求/应答模式最能防止队列拥塞。我已经成功地(并且愉快地)使用了类似的案例。当然,您可以使用您选择的其他工具,但请记住,您必须处理请求/回复部分。仅仅在队列中扔东西并不能解决所有问题,排队的工作量应该得到控制