Inets HTTP client stability

Michael McDaniel erlang@REDACTED
Thu Oct 27 20:38:06 CEST 2005


On Thu, Oct 27, 2005 at 02:34:21PM +0200, Heinrich Venter wrote:
> Hi all.
>  
> I am about to develop an app that will act as an http gateway for some of the
> services we are running.  For the incoming http requests I plan to use httpd
> from inets.  For the outgonig leg it would thus make sense to use the http
> client from inets.
> My question is wether any one else is using the inets http client for medium to
> high volume outgoing traffic?  I know of two instances where people chose to
> create a java node to make http connections, instead of using inets.
> Is it worth the risk to try the inets solution first, or should I budget the
> time to make a java node and try to upgrade to inets later?
> Any one with experience in this regard?
>  
> The requirements for the http client will be that many connections will be made
> to a series of speciffic URLs.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

I have successfully been using http:request/4 for doing POSTs for a 
few months now in a production system.  I am very happy with the
results (and Erlang!).

See code below...

The production system is not supporting heavy traffic (though the customer
hopes to make more sales!); however, during testing I was very pleased.

The destination server is provided by another company, and their
testing server could not keep up with my load testing.  At one point I
had between 800-900 http:request/4s backed up retrying as described 
below.  All the POSTs eventually were successful with a response from the
test server.  An abbreviated version of the code is below...


-define(DEFAULT_TIMEOUT, 2000).
MyFun(Timeout, Body) ->

  case (catch http:request(post,
  {"http://example.com/path/" ,
  [ 
     {"Date", httpd_util:rfc1123_date()} ,
     {"Host", "example.com"} ,
     {"Accept", "text/xml/html"},
     {"User-Agent",  "Demo Erlang Client"} 
  ], "text/xml; charset=utf-8", Body },
     [{keepalive, false}, {nodelay,true}], [])) of
       {ok, Result}    -> {ok, Result} ;
       {error, Reason} -> 
		      Result = null , 
                      mylogger:log_error(?MODULE, ?LINE,
		      'MyFun, http:request', "failed, see /tmp/my.log"),
		      {ok, Io} = file:open('/tmp/my.log', [append]) ,
	 	      io:fwrite(Io, "~26p, ~p~n",
					[erlang:localtime(), Reason]) ,
		      file:close(Io) ,
		      if TimeOut > 8192000 ->  % milliseconds
	 		        timer:sleep(TimeOut/8) , 
				?MODULE:MyFun(?DEFAULT_TIMEOUT,Body);
			 true ->
	 		        timer:sleep(TimeOut) , 
				?MODULE:MyFun(2*TimeOut,Body) 
		      end 
  end ,

	%%% Do something with Result ...

end.

Of course you could give up eventually but I "know" I'll eventually be
able to get where I'm POSTing to, hence the endless retries.

You may prefer to spawn rather than serialize the repeat fun calls as
I have done.

Please anyone mention if there are more accepted/efficient ways of
accomplishing the above.  I still consider myself very novice with
Erlang and Erlang idioms.  I have not yet started using OTP yet,
and still am writing "pure" Erlang.  I have a new project coming up
and will probably dabble with OTP on that one.

~Michael









More information about the erlang-questions mailing list