理解ibrowse的send_req

ibrowse简介

ibrowse是一个用Erlang写的http client。具有异步,多进程,管道,代理等功能,具体可以点击项目主页看看。

用途

游戏项目里面,跟渠道对SDK,一般情况是http请求,iOS的内购也是http请求。所以,有了ibrowse这个项目,可以简化我们的代码,不用自己再造轮子写http的发包和收包。

send_req

用ibrowse这个项目,也就使用ibrowse:send_req这个函数而已。

首先在send_req函数,根据Host和Port从ibrowse_lb ETS获取lb pid,如果ibrowse_lb ETS没有的话,就去ibrowse进程get_lb_pid,启动ibrowse_lb进程,并且将其pid存储到ibrowse_lb。

接着try_routing_request,通过spawn_connection(ibrowse_lb进程)获取Conn_Pid,Conn_Pid是处理收发包的进程pid。ibrowse_lb进程会根据Max_sessions(多少个http client进程)和Max_pipeline_size(一个http client进程多少个请求串行)来决定Conn_Pid,如果超负荷,就返回{error, retry_later}。

拿到Conn_Pid之后,会调用ibrowse_http_client:send_req,实际上是一个gen_server:call,底层的网络处理是异步的,所以底层发完包之后直接{noreply, State},等收到包之后才gen_server:reply,也就是实现了pipeline的原因。同时,立刻noreply之后,也可以让后面消息及时等到处理。

send_req大概也就这样了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注