欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 编程语言 > php >内容正文

php

yii2 请求外部api-凯发ag旗舰厅登录网址下载

发布时间:2024/10/14 php 38 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

需求:
我们先举个某系统验证的列子:(a渠道系统,业务b系统,外部厂商c系统)
(1)b业务系统调用a渠道系统,验证传入的手机、身份证、姓名三要素是否一致。
(2)a渠道系统再调用外部厂商c系统。
(3)a渠道系统将结果返回给b业务系统。
这3个过程中,(2)过程,调用外部厂商是需要计费的。
当b业务系统并发量很高时,有100笔相同的三要素校验,由于是相同的三要素,a渠道只要调用一次厂商即可知道结果。为了防止在某一请求还没响应结束的同时,其他请求也去调用外部系统,这个时候就需要加锁处理

分布式锁的特点
原子性:同一时刻,只能有一个机器的一个线程得到锁;
可重入性:同一对象(如线程、类)可以重复、递归调用该锁而不发生死锁;
可阻塞:在没有获得锁之前,只能阻塞等待直至获得锁;
高可用:哪怕发生程序故障、机器损坏,锁仍然能够得到被获取、被释放;
高性能:获取、释放锁的操作消耗小。

要实现:加锁,减锁,锁超时
实现方式可以是:数据库 mc redis 系统文件 zookeeper

现在就是渠道系统,当100个相同的业务请求传递过来,我的第一个请求要先加锁,然后请求外部厂商系统,等响应结果以后,插入另一个key中,然后再删除锁。
其他请求先去获取下锁,如果已经存在锁就轮寻等待,如果锁不在了,直接去查询结果。
如果第一个请求失败了,结果并没有插入到位,就继续获取锁再去查询外部系统。

获取锁:
$redis->set('lock:手机号&身份证&姓名', 1, ['nx', 'ex'=>10]);
释放锁:
就是直接删除这个key
锁超时:
lock的key有超时时间

新版的redis set命令就可以实现分布式锁,可以同时实现如果不存在时才去set和超时时间两项。

connect("127.0.0.1",6379); //高并发时防止重复请求//渠道系统传递过来的key $lockkey='lock:18806767777&37781991111629092&taoshihan'; $resultkey='res:18806767777&37781991111629092&taoshihan';//如果已经查询过值,可以直接返回 $info=$redis->get($resultkey); if($info){exit($info); }//如果没有值的,获取锁 $lock=$redis->set($lockkey, 1, ['nx', 'ex'=>10]); if($lock){//请求外部系统获取结果,比如响应结果比较慢sleep(8);$info='{"name":"taoshihan"}';$ret=$redis->set($resultkey,$info);if($ret){//删除锁$redis->del($lockkey);exit($info);} } echo "请稍后重试!";

以上内容希望帮助到大家,很多phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、tp6,laravel,yii2,redis,swoole、swoft、kafka、mysql优化、shell脚本、docker、微服务、nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

php进阶架构师>>>视频、面试文档免费获取​shimo.im

或 者关注咱们下面的知乎专栏

php架构师圈子​zhuanlan.zhihu.com

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图