批量订单(大概是每个用户1W订单)处理的最优方案或思路是什么?
系统的订单是从excel表导入的。每个用户可以提交1、2万的订单,订单提交后,还要根据订单金额扣除用户相应的金额。
还要及时反馈1、2万订单成功多少,失败多少,从用户扣除订单金额,这个过程怎么处理才是最优解呢?
我现在的做法是,提交后。
1、从redis取出所有产品的库存信息。
2、循环处理订单,把0库存的剔除,把有库存产品累计金额。
3、队列把有库存的订单,用队列写mysql(批量插入)
4、扣除用户余额。
实践中发现以上做法不严谨,有时mysql插入失败。还是会扣除累计成功的用户余额。
PS:
整个过程耗时大概是PHP2秒左右,但是有同类型的系统(ASP.NET写的,不是PHP),几乎能做到5、600毫秒能反馈。
请问这个是PHP的问题?做不到这么短时间的响应速度,还是我自己优化不足呢?
我测试过流程时间, 以上流程,1、耗时0.7s 2、耗时1.2s
我分析一下,先从表设计开始:
如果是“及时”而非“实时”以上操作可以最大限度的满足效率需求,如果要保证写入速度采用的是多主库尽量避免使用自增ID主键。 最终的扣减结果和生成订单结果根据批次、批次订单和订单表结合查询获取。
一两万一个的订单还是订单总额一两万, 还是一两万个订单?
没怎么听懂
去了解用户真正的需求是什么?真的需要当下就放回所有订单的结果吗?
如果不是,其实可以把每个 Excel 上传的操作视为一次导入任务,而这个任务是异步来处理的,下面每个订单是一个子任务,在子任务的处理过程中用事物保证一致性!并实时反馈处理进度,用户能实时看到正在处理那个订单,已经订单是导入成功了还是失败了,失败的原因是什么,而且这种方式对于失败的订单处理可操作空间更大!
excel扩展建议换成xlswriter,速度能提升很多
相比excel订单导入,建议订单数据实时同步,订单状态扭转,支付数据联动更新
拿到数据后, 先按照商品汇总, 然后按照商品ID分发到多个(线程 协程 or 异步任务)内, 每个任务处理100个商品, 最后汇总结果返给前端即可.
这种任务看起来主要耗时在表格解析以及数据库写入, 速度差那么多, 大概率竞品是多线程进行了异步处理