1

我正在使用 PHP 和 MySQL 开始一个新项目,大致如下:

每分钟我都会从不同用户的 API 中获得一份待办事项列表。

例子:

user1 send $1 to user2
userx send $2 to usera
userw send $0.50 to user2

etc..

假设 user1 想向 user2 发送 $1。有两种可能,成功或不成功,因为资金不足或用户拼写错误的用户名。如果不成功,我会向用户发送一条消息。

我现在面临几个选择:

选项1

创建一个包含需要处理的事务的数据库表,并使用每分钟处理一次的 cronjob。这里的风险是脚本可能会因错误或超时而运行,而其他事务仍会在数据库表中显示 In Progress。所以我需要第二个脚本来检查时间戳。

选项 2

创建一个 API 或函数,在我收到它们并给我一个响应后,它会为每个事务调用。然后我可以调用另一个 API 或函数来处理该响应或继续下一个事务。但是,我仍然必须将它们放在数据库表中,因为如果脚本停止执行,我不能冒险丢失它们。所以它的工作原理如下:将所有事务放在数据库表中 - 开始事务 - 完成事务后从表中删除 - 开始事务 2。


这两个选项都有缺陷,因为您不知道交易列表会有多长。如果它很长,PHP 绝对不是长时间运行的最佳选择 - 使用将超时设置为零是有风险的。我正在寻找一个可以与 PHP 一起扩展的解决方案。所以我在考虑选项3。


选项 3(最佳解决方案?)

使用 API 返回 10 个事务。

在数据库中设置一个标志来说明它们被发送到一个脚本和时间戳来说明它们何时被发送

PHP 脚本从 API 检索 10 个事务 - 处理 10 个事务。

一旦事务完成 - 从该表中删除它并将其复制到已完成的事务表中。

如果发送时间大于 X 分钟(基于 10 个事务的执行时间的上限),则每 3 分钟检查一次 cronjob 脚本。如果它更大 - 将它们设置为不发送 - 这样它们就可以再次发送出去。


正如你所看到的,我写下了我对此的整个思考过程,并正在寻找输入。肯定有我错过的东西。另请注意,这些不是真正的金融交易——这只是我可以用来说明的最好的元数据。

4

2 回答 2

1

如果您想使用当前技术堆栈的最小差异来做到这一点,那么您就走在了正确的轨道上。本质上,您正在重新创建一个简单的 MQ 或作业服务器。

作业/任务/事务队列所需的最低功能是:

  • 工作(用户 1 向用户 2 发送 2 美元)
  • 状态(准备好、处理完毕、错误、完成)

你也可能想要

  • 最后一个错误字符串(这样你就可以弄清楚到底发生了什么)
  • 可能是重试计数(对于应该在失败之前重试的任务,任何可能由于瞬态错误而失败的任务)

如果您决定并行化处理 cron 作业,您将需要跟踪脚本的哪个实例有待处理的作业,尤其是在您开始处理大批量操作时。(如果你这样做,你会想要观察以确保任何给定的事务快速完成,或者你可以有效地将所有工作停在一个缓慢的工作之后)

无论您是从 API 获取还是直接从数据库获取,都是 6 个,6 个。

于 2009-01-09T22:40:26.113 回答
0

我建议在收到交易请求时处理每笔交易。

IE Bob 单击“汇款”按钮向 Alice 汇款 20 美元。我会调用一个函数来处理此事务,并向他们显示“事务成功”或“出现问题..”消息。

如果事务处理需要很长时间,您可以通过 AJAX 完成,在服务器端完成处理时向他们显示一个很好的进度条,显示“正在处理..”,然后将它们重定向到yoursite.com/transactions.php?result=success&id=$idyoursite.com/transactions.php?result=failure&id=$id

于 2009-01-06T13:12:39.000 回答