Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的高负载支付处理体系结构_Php_Mysql_Architecture_Payment_Credit Card - Fatal编程技术网

PHP中的高负载支付处理体系结构

PHP中的高负载支付处理体系结构,php,mysql,architecture,payment,credit-card,Php,Mysql,Architecture,Payment,Credit Card,想象一个本地Groupon克隆。现在想象一下,一笔交易吸引了10倍的普通访客,因为访客试图同时购买MySQL数据库,所以交易失败,超过了交易的最大购买限制 我正在寻找高负载网站支付处理的最佳实践,它将并行处理有限数量产品的支付 目前,当客户试图在第三方支付处理程序的页面上购买时,最简单的选项似乎是锁定/解锁交易 有任何想法吗? < P >你考虑补偿服务交易吗? >P>你考虑补偿服务交易吗? 我一直支持你,直到你开始谈论第三方支付处理程序页面。在将用户发送到第三方网站时,很难控制用户的体验,因为你

想象一个本地Groupon克隆。现在想象一下,一笔交易吸引了10倍的普通访客,因为访客试图同时购买MySQL数据库,所以交易失败,超过了交易的最大购买限制

我正在寻找高负载网站支付处理的最佳实践,它将并行处理有限数量产品的支付

目前,当客户试图在第三方支付处理程序的页面上购买时,最简单的选项似乎是锁定/解锁交易


有任何想法吗?

< P >你考虑补偿服务交易吗?

>P>你考虑补偿服务交易吗? 我一直支持你,直到你开始谈论第三方支付处理程序页面。在将用户发送到第三方网站时,很难控制用户的体验,因为你不知道他们在那里做什么,他们是否被跟踪,完成交易需要多长时间,他们是否完成了交易,等等

如果在本地处理付款不是一个选项,那么这不一定是一个问题——它只是提出了一个问题,即您必须实际思考如何处理您的交易

所以,如果是我,现在不考虑第三方-我们将把它放在一边一分钟。显然,我会确保我的MySQL数据库具有足够的弹性,不会崩溃,因为这会给协调事务带来巨大的问题。但是,事情发生了,所以你需要一个备份

我的建议是使用一个缓存系统来跟踪产品和当前可用的产品。Memcache可以很好地做到这一点,因为它只是一条很容易抓取的记录。你根本不需要点击数据库就可以获取产品信息(可用性),如果产品出现故障,你的用户/应用程序也不会更明智,因为你可以直接从Memcache获取关于你产品的信息(不需要mysql)

这会在存储付款记录时出现问题(当数据库关闭时)。当你收款时,你显然需要数据库中的交易信息,如果你的数据库坏了,那就是个问题。Memcache并不是一个很好的解决方案,因为你的价值有限,你必须知道你关心的每一个关键点。最重要的是,Memcache没有集合或集合操作,因此您不能附加到值,而不必担心会破坏某些数据

因此,让我们添加一项不同的技术,Redis

事务问题的一个解决方案是在MySQL服务器不可用的情况下将它们写入redis(或者如果您确实想,但实际上不需要这样做,则同时写入两者)。然后有一个后台进程,知道如何从redis获取事务详细信息,并在MySQL表恢复联机时将其写入MySQL表。Redis对崩溃有很强的恢复能力,并且能够以巨大的容量运行。它还具有set操作,因此您可以轻松地将数据附加到集合中,而无需担心读/更改/写操作期间的竞争条件

因此,您可以将所有事务存储在一个redis密钥中,作为一个集合(如果您愿意,可以将它们存储为json字符串,这非常简单),然后当数据库崩溃时,您可以从redis获取数据,并在其恢复联机时将其写入MySQL

为了简单起见,如果您打算使用redis来存储事务,您还可以使用它来存储产品缓存,而不是memcache—保持堆栈简单

这样可以避免访问数据库获取产品详细信息,并且在MySQL崩溃时跟踪(可能)丢失的事务。但它并不能解决在MySQL宕机时,在新交易到来时跟踪产品库存的问题,也不能确保不会过度销售产品

为了处理这种情况,保存事务时,可以减少可用产品的数量(将其保持为一个固定数字,这样就不会在页面加载时不断重新计算)。这会立即告诉你产品是否超卖。然而,这样做并不能保护“产品在购物车中”的时间。一旦用户将产品放入购物车(因为你说你有库存,所以你允许这样做),你就有问题确保在他们退房前产品不会卖完

此问题的解决方案也可以作为第三方交易问题的解决方案。因此,您对产品使用缓存机制,对事务使用回退机制。您现在应该做的是,当用户尝试购买产品时(或者将其放入购物车,或者被送到第三方处理器),为他们创建“产品预订”。可能最简单的方法是为每一项创建一个redis条目。让产品预订有一个有效期,比如说5或10分钟,如果你愿意,甚至15分钟。每次你在你的站点上看到一个用户时,刷新超时时间以确保他们不会耗尽时间(如果你愿意,显然你可以在这里加入更多的逻辑)。当交易完成并从挂起更改为支付时,您需要创建交易记录(mysql或redis,取决于数据库可用性),减少可用数量,并删除预订记录

然后,除了未过期的预订信息之外,您还可以使用可用数量信息来确定可供销售的数量。如果这个数字下降到零,那么你实际上已经卖完了;但是,如果你的用户中有一定数量的人不转换,它会释放出他们没有购买的库存,允许你冲洗并重复这个过程,直到你实际上已经卖完为止

这是一个相当健壮的系统的相当长的解释,如果您遇到MySQL服务器