Go 实现高并发下同步请求的思路
2020-07-14 06:05
465 查看
Go 实现同步请求的思路
1、背景
在实际生产中,我们或多或少的需要对接第三方的同步接口,那我们如何实现高并发下go的同步请求方法呢,下面我就讲一下我最近在生产中运用的一种方法。
我们最近遇到的需求是对接第三方的接口,需要实时的获取到对方的相应数据,超过三秒没有拿到则判断请求失败,返回对应的错误信息。
2、思路
我的做法是,首先定义一个全局的channel
var ReqChannel = make(chan *Packet, 20)
然后在请求的业务里,定义一个请求唯一的id并往这个channel里塞值,同时起一个协程循环的读取这个channel
for { req := <-model.ReqChannel packet := &Packet{ Sign: SignPubwin, CompanyId: CompanyId, Type: req.Type, Id: req.Id, Data: req.Data, } Logger.Debugf("send packet to pubwin, id:%d, type:%#x, body:%s", req.Id, req.Type, string(req.Data)) err := ptr.SendPacket2Pubwin(packet) if err != nil { Logger.Errorf("send packet to pubwin failed, id:%d, type:%#x, body:%s, err:%v", err, req.Id, req.Type, string(req.Data)) } }
读取完以后,再定义一个全局的map,key是刚读取的请求的唯一ID,value定义成需要返回类型的channel
// 我的请求是返回一个byte数组 var ResMapChannel map[uint32]chan []byte
请求返回后,将请求的ID和返回的值塞到定义的map里,同是在请求的地方循环的读取key为请求ID的channel,
并设置对应的超时时间,记得处理结束移除对应map里的key,防止循环处理
// 初始化channel var respChannel []byte // 设置超时时间 ticker := time.NewTicker(3 * time.Second) // 阻塞读取channel for { select { case respChannel = <-model.ResMapChannel[id]: if respChannel != nil { // 处理返回的channel []byte err := json.Unmarshal(respChannel, &checkoutInfo) if err != nil { Logger.Errorf("response change failed! id %d, response channel %+v, err %s \n", id, respChannel, err.Error()) return nil, err } // 处理结束移除map delete(model.ResMapChannel, id) return checkoutInfo, nil } case <-ticker.C: Logger.Errorf("response timeout, id %d", id) // 处理结束移除map delete(model.ResMapChannel, id) return nil, nil } }
这样就可以保证高并发下的请求的返回的唯一正确性,以上仅仅是个人思路,仅供参考,对于有更好方法的小伙伴,或者是我的方法有不正确的地方,欢迎大家在评论区留言。
相关文章推荐
- Go 并发实现协程同步的多种解决方法
- GO1.5实现简单的http并发请求,支持:GET、POST、HEAD、PUT
- [置顶] 工厂模式实现并发请求多个接口 (同步后台数据实现离线APP)
- Go并发:利用sync.WaitGroup实现协程同步
- 黑马程序员——Java5中的线程并发库(二)--Semaphore实现信号灯、其他同步函数、可阻塞的队列、同步集合
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
- 解决 Ext.Ajax.request 同步请求实现问题 (Ext3.0)
- 分布式系统重复/并发请求解决思路
- javascript原生态的同步异步请求实现
- Ext 2.2-2.3 Ext.ajax.request 同步请求的实现
- 并发回射服务器的最基本实现思路( fork )
- Java并发包中的同步队列SynchronousQueue在不用JDK版本中实现方式
- 众筹网站项目第四天之弹层组件layer的使用及同步请求方式实现用户分页查询(1)
- python知识图谱--xml---并发和并行--死锁---递归---数组--同步和异步请求---线程
- 数据库中两张表之间的数据同步实现思路(增加、删除、更新)
- vue如何使用async、await实现同步请求
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
- ios网络学习------2 用非代理方法实现同步post请求
- JQuery.extend扩展实现同步post请求
- Java并发包中的同步队列SynchronousQueue实现原理