zoukankan      html  css  js  c++  java
  • [Erlang32]ibrowse流程及性能测试

    1.简介

    ibrowse是用erlang写的一个HTTP client.github地址:https://github.com/cmullaparthi/ibrowse 使用方法见项目的readme。

    2.流程

    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

    来自己管理负载。

    3.性能测试

    可以使用https://github.com/talko/httpcbench 来对erlang写的这几个主流HTTP client做下测试。

    最好把里面的http请求都改成自己实际的请求地址。

    4.配置说明

    %%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
    View Code

    流程图可见:https://github.com/zhongwencool/issue_blog/tree/master/freemind  使用freemind记录。

    first try SSL using Erlang

  • 相关阅读:
    Python列表、元组、字典、集合的方法
    Python字符串方法总结
    进程、线程、协和的对比
    案例:图片下载器
    使用gevent实现多任务
    使用greenle完成多任务
    使用yield完成多任务
    生成器总结
    生成器send函数
    生成器yield关键字
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/ibrowse.html
Copyright © 2011-2022 走看看