现有的主项目是laravel开发的项目,采用分布式部署,会根据不同的事件,将不同的数据回调给不同的第三方url,并发很大,大概一天要回调几百万次,采用laravel queue消费这些回调。目前遇到的问题:
1.对服务器内存消耗较大,需要开了200多个进程去消费这些回调
2.有的客户提供http 服务器响应慢,就会阻塞消费的进程
3.各台服务器负载均衡,所以由哪台服务器发送的不可知,所以客户那边需要绑定我们所有负载服务器的ip作为白名单
4.重发机制依赖guzzle/http的retry,导致重试期间会严重阻塞队列
5.没有很好的记录、查询这些回调的机制
1.采用webman来统一处理这些回调,做一个转发url,流程是:
laravel主项目->webman项目->第三方url
2.webman工作进程接收数据,并通过异步TCP客户端的方式发送给 自定义10个进程消费(主要是不阻塞工作进程)
3.自定义进程中入库、发送、更新库中的对应数据(如发送时间、第三方web服务器的响应数据等,作为后期检索发送的依据)。其中自定义进程发送中采用fiber的http协程发送
请问方案可行吗? 尤其是3中的fiber的http协程发送,会阻塞自定义的消费进程吗?
webman开一个redis队列,然后laravel主项目直接入队列,队列里访问url。
队列里用workerman/http-client 发起url请求,workerman/http-client本身就是非阻塞的,感觉用不到fiber。
当然用fiber好处是以同步的方式写代码,业务不用写在回调函数里了
感谢,我测试了一下,确实如果不要响应结果的话,不需要fiber了,直接workerman/http-client发送就好了,然后回调再入库