【问题标题】:Best way to prevent two "bots" from working on the same database row?防止两个“机器人”在同一数据库行上工作的最佳方法?
【发布时间】:2014-04-18 08:42:02
【问题描述】:

我有几台服务器。每个服务器都有一个机器人程序。机器人都连接到同一个mysql数据库。他们所做的是,连接到数据库,查询数据库并获取包含 username;password 行的 .csv 文件,登录特定网站上的帐户,执行一些自动化操作,在数据库中将完成的帐户设置为 Done .

我很难确定最佳方式,以确保所有机器人能够从同一个数据库民意调查中提取数据,而不会发生冲突并且不会留下任何帐户。

我的想法是:

  • 预定义每个机器人可以工作的行范围。

例如:

Bot1 = row 0 to row 999
Bot2 = row 1000 to row 1999
Bot3 = row 2000 to row 2999 ...

这可能是个问题,因为如果我需要扩展,我必须预先定义每个机器人。

  • 创建一个名为 bot 的列 => 让每个机器人选择 500 行,将预定义的值添加到 列 bot 在所有 500 行上 => 仅在行上工作 WHERE bot = 'pre-defined value'

这可行,但仍可能存在一些冲突。除此之外,我的机器人需要处理 CSV 文件,因此它们实际上不能在数据库上运行。

我关心的是可扩展性。我希望能够根据需要添加任意数量的服务器,并让它们都能很好地相互配合。

建议?

我正在阅读有关 mysql lock() 函数的信息,但由于我的机器人获取帐户(.csv 文件)的方式,我认为它在这种情况下不会起作用。

【问题讨论】:

  • 对机器人使用模数来确定要抓取的行:row_id % bot_id。虽然您不是对机器人范围进行硬编码,但您是在对机器人数量进行硬编码。您还可以更新交易中的批次,一次只有一个人可以获得“下一个 1000”。
  • 所以它会像我上面所说的第二个选项?
  • 从索引的角度来看不是很好,但我在想这样的事情(如果你有 10 个机器人): SELECT * from passwordTable where alreadyProcessed = 0 and id % 10 = 0

标签: mysql database automation


【解决方案1】:

感谢您的回答。

我所做的是:

我创建了一个 PHP API,它获取状态 = 0 的随机行并以 XML 格式打印其信息。然后我在我的机器人中使用 GET 请求来使用这个 PHP 脚本获取一个随机行并将其放在一个变量上。后来,我使用正则表达式从前面的变量中刮取每一列,并将它们放在各自的变量中。在我的机器人在该帐户上完成运行后,它会在它刚刚使用我的 PHP API 抓取的行上设置 status = 1,因此其他机器人不会再次触及该行。这样,我可以让多台服务器运行而不会出现冲突问题,.CSV 也不会出现问题,唯一的问题是现在我的 mysql 服务器上有更多负载,但这不会太难解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2015-10-16
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多