- 主题:有人熟悉php的ci框架么?大坑求填
基本架构:nginx+apache+php
当单机负荷增大的时候,经常出现:php整个生命周期走完,该写数据库的写完,该发消息的发完,然后客户端收到500。
然后,我们后台有自动化脚本在跑,有出错重试的逻辑。
然后,然后就挂了。
比如说算钱算了两遍。
这个在高负荷下几乎100%毕现。出现此现象的并发阈值与机器性能正相关。
求解。我们已经被这个问题搞死了。
未来应该会逐渐迁spring+mybatis,希望没有这个问题。先阶段求填坑。
--
FROM 39.185.114.*
no,我们想要的是:500了就不要写数据库发消息,所谓的事务一致性。机器扛不住是很正常的。你不能告诉我500,实际活干完了
ssh映像中没遇到这种坑
【 在 hgoldfish 的大作中提到: 】
: spring + mybatis 解决不了这个问题。
: 先看看哪里是热点,优化一下。从你的描述看,你这个瓶颈不是在于web端。有这个闲心不如看看数据库、缓存是不是有问题。再看看业务逻辑能不能改改,长时间的业务就改成后台执行的方式,写数据能先缓存就缓存,能批量就批量。
: 我觉得你是不是想改个方案,过来这边找认同?
: ...................
--
FROM 39.185.114.*
举个例子么,当然实际不是算钱
那就是下订单好了,用户可以合法下1000个订单。于是重试逻辑因为500刷订单了。自己的脚本把自己攻击死了
【 在 hgoldfish 的大作中提到: 】
: 算钱都能算两遍,你们的交易系统连防御重放攻击的能力都没有吗?
:
--
FROM 39.185.114.*
记录啊,然后就是用户1秒内创建了1000个订单,前999个都是500,最后一个成功了
实际数据库里1000个成功了。。。。。
【 在 hgoldfish 的大作中提到: 】
: 订单你不纪录订单时间,订单ID,用户名、订单内容?你这重试脚本我看比较奇怪,想想看能不能取消掉好了。
:
--
FROM 39.185.114.*
这个倒是没有关心过。
内存用完很正常,但是500的请求数据别写进数据库啊。
【 在 readme917 的大作中提到: 】
: 内存用完了?
: 你们apache的服务器,内存峰值使用达到多少
:
--
FROM 39.185.114.*
就算你说的先拿交易id,那么总有一个api叫create_deal_id吧。
那么这个api在高并发下可能会挂,但是挂了你总不要往数据库插数据吧?
现在的case是:客户端调用create_deal_id,500了,无人值守的自动化客户端,不能弹窗,总得反复重试吧?
重试了999下,第1000下好了。看起来ok
但是最终数据库有1000个id,前999个都是脏数据。
这就是问题的根源。
【 在 hgoldfish 的大作中提到: 】
: 这个事务一致性你自己程序保证吧。一般都是业务逻辑代码前开启事务,后结束事务。我看你这不是500错误,应该是nginx报的504或者或者502。
: 机器扛不住正常,网络发生错误也正常,后者你连500错误都接不到。你关注从技术上解决就错了。
: 交易ID不是交易结束后产生的,而是一开始就产生的。交易量太大上消息队列。重试脚本重试的时候没有确定只重试明确失败的动作?不去关注业务逻辑,ssh一样遇到这些坑。只是ssh性能强,不像php那样子动不动就扛不住。
: ...................
--
FROM 39.185.114.*
create操作,在服务器看来,是合法的create。
也就是说,如果用户量真上来,这里流程完全是合法的。现在是1w的用户量,被我们自己的客户端“模拟”成1000w用户量了。
【 在 hgoldfish 的大作中提到: 】
: 那你重试的时候程序直接返回已经成功不就搞定了?
:
--
FROM 39.185.114.*
业务上当然不知道是脏数据啊,只是看到短时间内刷了几百万个id,谁知道是不是真有几百万个客户想要这些id呢。
【 在 hgoldfish 的大作中提到: 】
: 知道是脏数据state=UNUSED,直接删掉不就成了。
:
--
FROM 39.185.114.*
当然,换句话说,我们的服务器现阶段没有考虑过ddos的攻击。
用户这么搞完全可以ddos搞死我们。
【 在 hgoldfish 的大作中提到: 】
: 知道是脏数据state=UNUSED,直接删掉不就成了。
:
--
FROM 39.185.114.*
怎么改,出错直接扔掉?用户体验很不好。
而且交易id只是举例,实际是重api。一个api后台干n多事情。每分钟1w个就能搞死我们的服务器。
我现在讨论的只是如何保证业务代码走完不要给500,或者给了500不要进数据库这个一致性。
我们没有开放api,只要能保证这个,我们自己的客户端就不会干死自己。
【 在 hgoldfish 的大作中提到: 】
: 改你们自己的客户端呗。而且交易id直接扔redis啥的,就那个简单的API我单机24核一天就可以跑10亿。
:
--
FROM 39.185.114.*