ibrowse是用erlang写的一个HTTP client.github地址:https://github.com/cmullaparthi/ibrowse 使用方法见项目的readme。
ibrowse:start ---> 为每一个{host,port}创建一个ibrowse_lb的gen_server进程,用于管理此{host, port}下的连接状态。
它会根据配置中的maxsession创建ibrowse_http_client的work(:gen_server)是用来创建实际的连接。每个work可以同时处理maxpipe个连接。
如果你不在priv/ibrowse.conf 里面配置,max_sessions max_pipe_size都是10,如果想大并发使用,请务必根据实际情况测试,然后选择适当的参数。
它有自己的负载均衡(load balance)机制:用Orderedi set ets ibrowse_lb优选进程中的每个session同时处理的连接数中最少的session。
如果你不想使用load balance机制:你可以使用
ibrowse:start_worker_process/1 ibrowse:send_req_direct/4,5,6,7, ibrowse:stop_work_process/1
来自己管理负载。
可以使用https://github.com/talko/httpcbench 来对erlang写的这几个主流HTTP client做下测试。
最好把里面的http请求都改成自己实际的请求地址。
%%priv/ibroswer.conf
{dest,HostName1,Portnumber1,MaxSessions,MaxPipelineSize,Options}
{dest,HostName2,Portnumber2,MaxSessions,MaxPipelineSize,Options}
4.1 为每一对{Host,Port}最多创建MaxSessions; 4.2 每个session最多可同时处理MaxPipeLineSize; 4.3 如果所有的session都达到了Max,就会返回重试三次后返回{error,try_later}; 4.4 Options为connect网络参数。可见文档:
%% optionList() = [option()] %% option() = {max_sessions, integer()} | %% {response_format,response_format()}| %% {stream_chunk_size, integer()} | %% {max_pipeline_size, integer()} | %% {trace, boolean()} | %% {is_ssl, boolean()} | %% {ssl_options, [SSLOpt]} | %% {pool_name, atom()} | %% {proxy_host, string()} | %% {proxy_port, integer()} | %% {proxy_user, string()} | %% {proxy_password, string()} | %% {use_absolute_uri, boolean()} | %% {basic_auth, {username(), password()}} | %% {cookie, string()} | %% {content_length, integer()} | %% {content_type, string()} | %% {save_response_to_file, srtf()} | %% {stream_to, stream_to()} | %% {http_vsn, {MajorVsn, MinorVsn}} | %% {host_header, string()} | %% {inactivity_timeout, integer()} | %% {connect_timeout, integer()} | %% {socket_options, Sock_opts} | %% {transfer_encoding, {chunked, ChunkSize}} | %% {headers_as_is, boolean()} | %% {give_raw_headers, boolean()} | %% {preserve_chunked_encoding,boolean()} | %% {workaround, head_response_with_body} | %% {worker_process_options, list()} %% %% stream_to() = process() | {process(), once} %% process() = pid() | atom() %% username() = string() %% password() = string() %% SSLOpt = term() %% Sock_opts = [Sock_opt] %% Sock_opt = term() %% ChunkSize = integer() %% srtf() = boolean() | filename() | {append, filename()} %% filename() = string() %% response_format() = list | binary
流程图可见:https://github.com/zhongwencool/issue_blog/tree/master/freemind 使用freemind记录。
first try SSL using Erlang