发消费券用webman做API适合么?各位大佬帮忙哦。

abei

政府发的市民消费券

可能刚开始同时要1-2万人进来抢,不过就几分钟就没了。

现在用的yii2,上次cpu被弄到100%了

现在计划用我们的webman,之前没弄过常驻内存的,不知道适合不适合?

会不会出现一些问题?

当前是想用一个机器nginx做反向代理,内网两个机器做业务处理。


就怕出现问题,会被弄死的。

2948 10 3
10个回答

liziyu

mark

  • tgzmos 2022-06-17

    看的qps;如果qps有上万,建议使用go为一个高并发接口服务;其它业务可以使用webman;然后nginx作为代理负载

six

我觉得合适,2台webman相当于10台yii的性能,甚至更多。
2万人来抢,假设抢1分钟,每秒支持333个请求就行。高峰期假设乘以3,大概每秒能承受1000请求估计就行。
做完之后用ab压测下。

  • abei 2022-06-01

    我主要这个不是常驻内存么,万一进程卡住了咋办

  • abei 2022-06-01

    你之前用过webman么,觉得如何

  • six 2022-06-01

    除非数据库有问题挂了,不然怎么会卡住?webman我们一直在用,性能确实比fpm的好非常多。

  • abei 2022-06-01

  • abei 2022-06-01

    之前没搞过高并发的,很多工具都不熟悉,嗯,谢谢

nitron

已有项目,并且运行没问题的,建议先考虑优化,确定瓶颈在哪里,比如OPCACHE是否开启,DB Server配置是否足够,DB索引是否合理,FPM根据内存大小预先开启足量进程,还有其他一些业务逻辑设计等,都做了还是不行再考虑换框架这类操作

不否认换了Webman性能会更好,但是你要权衡更换成本,比如更换过程中的遇到的坑你有没有办法填,出了问题你能不能担得起,毕竟这是市政项目,牵扯的东西很多

  • abei 2022-06-01

    嗯,是呀,就是觉得牵扯太多。

  • liziyu 2022-06-01

    务实👍

  • nitron 2022-06-01

    另外再多提一嘴,你这个业务算是比较简单的秒杀逻辑(至少从描述中看起来比较简单),可以考虑在业务上做优化(如果可以),采用先扣库存再进行后续逻辑处理的方式(比如队列),比较典型的例子就是常见的"优惠券将会在稍后发放到您的账户中"这种, 前面上个负载均衡,平时就一台机器,发券前提前多开几台,结束后降回一台

  • abei 2022-06-01

    是的,现在用的就是,除了会员的生成用mysql有点大,其他都放到了redis里,然后服务器有个计划任务负责发券,当前自己用到时没啥问题。

    客户想包装成产品,做云端,买个其他各城市的部门来发券,相当于重新搞一个新系统再。

    负载均衡还没有上,这几天正在研究nginx搞这个,现在有3台服务器,打算用最弱的一台做分发,其他两台方程序。

  • abei 2022-06-01

    @nitron 现在mysql是了一台高性能的数据库服务器,但是还是感觉慢,想做主从,不过之前没弄过,还没有搭建好。

  • abei 2022-06-01

    上次在客户公众号上搞,因为要授权,必须跳转一次PHP做会员初始化,结果一次来太多人,当时开了1000个静态的fpm进程,卡在那里不动了。

    最后过了十分钟还那样,重启了phpfpm后好了,我觉得是cpu(8核)已经到头了没能力处理进程了。

  • nitron 2022-06-02

    授权这个,因为从公众号获取用户信息需要服务器向微信服务器发起一个Http请求,这个涉及第三方系统,没办法.
    注意不要重复获取access_token就好

  • abei 2022-06-02

    是的,这个没有,access_token都是缓存了的,就是一次太多人访问。。不过也的确没有好的办法,下次弄负载均衡估计就解决了。

  • tanhongbin 2022-06-02

    大佬发言给力呀,先优化,实在扛不住了再换webman,也别一下子全搬过来,高并发的请求可以用webman处理,多异步,这么高并发的请求应该不会有新增完数据就要看的,mysql的增加删除和修改全给它异步了,查询缓存一做基本io上redis扛得住,就问题不大

  • abei 2022-06-02

    @tanhongbin 【这么高并发的请求应该不会有新增完数据就要看的,mysql的增加删除和修改全给它异步了】是什么意思哈?求

人民资本家

这种情况用swoole可能会更好一点。

  • abei 2022-06-02

    为啥那?swoole似乎学习成本有点高

  • 人民资本家 2022-06-02

    IO操作多的话Swoole表现会更好,workerman在异步这块现在可以说是空白

  • abei 2022-06-02

    哦,我了解下。

  • six 2022-06-02

    他本来就是没有常驻内存的经验,直接上swoole玩php协程非常不推荐,学习swoole的难度不亚于学习一门新语言例如go。
    如果系统瓶颈在数据库,那上啥也没用。如果瓶颈在框架性能低下,上webman是很好的选择,学习基本没有成本,同样的代码写法性能提高数倍,稳定性也好与swoole,并且性能也比swoole高。

  • abei 2022-06-02

    感谢各位兄弟的建议,嗯,项目也比较紧,学习太久估计不行,就一个月时间。

  • liziyu 2022-06-02

    如果说没有扎实的网络与操作系统相关的基础或经验,别说用swoole了,就是用了go也难解决性能瓶颈!~
    深(身)有体会!! ^_^

  • abei 2022-06-02

    看来要恶补基础知识啦

  • 2548a 2022-06-02

    说的不错,记得我以前刚开始工作的时候,有个项目每天零点要执行任务,当时项目有8,9万个会员以后,执行任务需要2,3个小时才执行完,但是现在如果让我再执行同样的任务,也就是十几分钟的事情.

  • abei 2022-06-02

    你现在咋搞的?

  • 2548a 2022-06-02

    减少数据库查询,批量插入或者更新数据库,这些是从代码层面去优化sql. 一个接口能少查询一次sql,那高并发下一秒就是少上千次查询.

  • abei 2022-06-02

    👍

  • adminv 2022-06-03

    为什么不学go?

2548a

如果是我的话,肯定先问领导,直接跟他说换个框架,性能有数十倍的提升,但是这个过程有太多的不确定性,让他决定是否愿意冒这个险,如果不愿意的话没必要换,如果他同意的话,也不至于自己一个人把责任全担下来了.

1024

你们公司搞到了政府的项目?是不是靠关系啊

  • abei 2022-06-02

    怎么突然问这个了。

CaesarTang

端午节上线的项目,项目中使用到数据库访问,单纯的增删改查(有索引),使用docker部署,cpu占用在 10-20% 间,webman的性能让我着实震惊。8小时将近 1200w 的流量稳定支撑,并且cpu占用并不高。主要服务架构如下:

  1. 一台服务器使用nginx做负载(8C16g)
  2. 两台服务做业务,每台服务器两个节点(均为 4c8g)
  3. 云数据库(4C8G)

顺带一提,该项目也使用了thinkphp开发的一个服务,简单的一个查询数据库(有索引),使用docker部署,cpu占用却有 300-400%。
当然,这只是我这边的实际使用场景,仅供参考。你的项目需要具体业务具体分析。至于业务层涉及到的服务器调优,数据库优化,redis缓存等等,这里就不过多讨论了。

  • abei 2022-06-06

    哇~

  • abei 2022-06-06

    用redis了么,如果用了是放到了一台业务服务器上了么

  • CaesarTang 2022-06-06

    没有用到redis

  • abei 2022-06-06

    那mysql压力很大呀

  • abei 2022-06-14

    我问下,你每个业务的机器上就是启动了一个webman是吧。

  • CaesarTang 2022-06-14

    使用docker打包部署服务,每台机子部署2个

  • CaesarTang 2022-06-14

    对于mysql和redis,如果有预算并且是要短期保证业务稳定,个人建议使用云服务。比如阿里云的云rds或云redis,都有集群版的,比自己部署的要好要稳定要便捷。自己部署的话,非专业运维,包括调优,监控等等都会比较麻烦,并且单机部署,流量,性能和IO,都会有瓶颈。

  • CaesarTang 2022-06-14

    你这边是如何发券的,减库存跳转链接用户点击领取 或 减库存调用api接口?

  • abei 2022-06-14

    减库存,然后后台有个计划任务负责发券。

  • CaesarTang 2022-06-14

    计算任务是crontab,还是?

  • abei 2022-06-14

    嗯嗯,是crontab

  • CaesarTang 2022-06-14

    以下思路,仅供参考:

    1. 流量分流(前端资源加cdn或放在对象存储上;后端的用作负载的服务器,性能要好,带宽要高,保证接口请求的流量稳定)
    2. 后端服务负载均衡(后端服务多台服务器部署,负载处理业务,后续有压力可扩容)
    3. 云mysql 或 云redis 做库存处理(mysql的原子操作 或 redis的lua脚本执行 保证不会超发)
    4. 消息中间件做发券处理(redis消息队列或rabbitmq等,减库存后,将发券任务交给中间件,多个消费者服务同时发券处理)
  • CaesarTang 2022-06-14

    使用crontab会造成任务堆积的

  • abei 2022-06-14

    现在是在一个内存最大的服务器上安置了redis,所在的云上没有云redis,这时候其他机器通过局域网访问这台机器的redis你觉得会不会有问题那?

    还有问个问题哈,常驻内存的,如果这个进程比如调用一些外部api服务,响应时间比较长,岂不是后面的都卡主了。

  • abei 2022-06-14

    crontab 之前发生过数据问题,正在考虑换个

  • 静默 2022-06-14

    fpm也一样卡住,所以调用外部api需要控制好超时时间,比如设置1秒超时。

  • CaesarTang 2022-06-14

    如果当前请求未处理完,其他的请求会等待。
    具体的业务场景有不同的处理方案。要在接口中等待外部api请求完成,比如微信授权,则可以把该接口分离成一个单独的服务来部署,这样可避免影响其他业务 或 合理设置超时时间;若可异步处理,比如发券,可使用消息中间件服务。

  • CaesarTang 2022-06-14

    我这边在使用mysql或redis服务时,结合使用场景,一般会从三个角度去考虑,流量,性能及多机活备。
    通过内网访问,流量是没问题的,至于性能及活备,因为无法预知上线后的业务情况,所以无法评估你当前配置的redis服务有没有问题。

  • CaesarTang 2022-06-14

    如果没有更好的方案,建议提前开发好业务功能,按照当前思路部署服务,然后做压测来定位服务瓶颈。

  • abei 2022-06-14

    @静默 但是fpm不是每个请求开一个进程么,如果一个进程卡出,应该不影响其他的把

  • abei 2022-06-14

    @CaesarTang 好的,太感谢了

  • 静默 2022-06-15

    fpm不是每个请求开一个进程,是的话一秒来1万个请求,服务器内存直接爆了。
    都是预先开一些进程,每个进程排队处理消息,包括nginx也是一样。

  • abei 2022-06-15

    @静默 是的,我的意思是说每个fpm进程间不互相干扰,不需要等待。

  • 静默 2022-06-15

    webman在前面加一层nginx也一样,新请求会发给空闲的进程,不互相干扰

  • abei 2022-06-15

    @静默 哦

yootou

发消息券这种,一种用webman这类常驻内存来做API,另外消费券本身,建议先放在REDIS等缓存里边,不要直接访问数据库,再一个利用队列的方式。这样你说的1到2W人,轻松就能解决了。

  • abei 2022-06-14

    我想问下,redis是放到一个机器上么?比如负载均衡了3台机器,redis要单独放一个机器么?

  • yootou 2022-06-28

    redis放任一台服务器,只要能访问即可。

MarkGo

给个建议,可以自己试试内网压测。
1、消费卷数量存到redis。
2、领取消费卷的时候查redis结果,有卷领取成功的话通过队列回写mysql结果。【异步、
3、前端抢劵的时候增加个setTimeout,随机延迟10~1000毫米时间发送请求,避免产生毛刺。

其实避免了mysql的同步操作,剩下的就是带宽问题了,所有接口非必要信息不要返回,减少请求大小,开启gzip就好了。
静态资源建议上cdn,针对请求异常时前端做好友好提示,类似活动异常爆满,请稍后重试。这样就算webman倒了也对客户影响不大。

  • 暂无评论
MarkGo

当前是想用一个机器nginx做反向代理,内网两个机器做业务处理。

更加建议租用云负载,按量付费。
以腾讯云为例:
建议:
clb-〉(CVM 3) -〉云redis -〉 云数据库
胆大的:
clb->CVM
2 -> CVM(redis单机) -> 云数据库

  • abei 2022-06-20

    好的,谢谢,现在也有了一些思路,不过我估计要用你的那个大胆的方案,客户所在的云没有云redis。。。

  • MarkGo 2022-06-20

    redis单机一般问题也不大的。webman启动的时候加载带领取的卷id到redis里,领劵的时候redis取个出来,然后丢队列,队列update 到取mysql那。

  • MarkGo 2022-06-20

    肯定是政务云机房哪些。。。。。

  • abei 2022-06-20

    @MarkGo 被你说对了,特麻烦,开个端口还得发邮件申请。

  • MarkGo 2022-06-20

    我们之前也用过,价格特别贵,然后window系统还要另外支付授权费用。申请端口和远程进去要用跳板机。

  • abei 2022-06-20

    @ MarkGo 对啊对啊,超级麻烦,那个堡垒机传文件夹还不智能,上次开个443端口,说要和省里申报,最少要一天(非工作日)才能过。

    让加个白名单,相当不愿意。

🔝