On Thu, Dec 1, 2016 at 5:49 PM, Evgeny Grin <k...@yandex.ru> wrote:

> It's a basic of theory of mass telecommunication.
> Developed with first automatic telephone exchange.
> In overloaded situation - just reject some part of incoming traffic as
> retries only prevent end of overload.
>

Exactly. :-)

But instead of rejecting it redirects them to a new server.

You can do it manually.
> Start MHD with MHD_USE_NO_LISTEN_SOCKET and process polling of listen
> socket in your own thread. Use MHD_add_connection() when new connection
> arrive.
>

Hm I didn't know about MHD_add_connection()... it seems awesome. I'm going
to check how to use it.


> As soon as you detect "overload" of MHD - start new MHD instance without
> listen socket and use MHD_add_connection() with new MHD instance.
>

This is the problem: how to detect that a function of my application is not
responding (overloaded) to not redirect new requests to it? :-/

(this is little bit funny: my app can't know if it is not responding
because it is not responding... But MHD/nginx can! :-D)

I think nginx uses some system call to check if the TCP destination (proxy)
is responding, but I don't know how it does that. See my environment:

. nginx running on port 443; // in Least Connected mode
. fastcgiapp1 rutting on port 9000; // primary
. fastcgiapp2 rutting on port 9001. // backup

(both fastcgitapp are blocking and doesn't have any threading support, so I
think nginx creates the required threads)

When the fastcgiapp1(primary) is not responding, fastcgiapp2(backup) is
used (nginx creates a new thread, now I have two threads). Some time after
(timeout) nginx try to use fastcgiapp1 again (now one thread). Nginx never
redirects new requests to fastcgiapp1 if it is not responding... it uses
fastcgiapp2, however, fastcgiapp1 is the primary app, so nginx retries to
use it after some time.

Supposing this pseudo code:

static int ahc_echo(void * cls, struct MHD_Connection * connection ...
other params) {
  if (isSomeFunctionOfMyAppResponding()) {
    do something ...
  } else {
    create a new thread with blocking server and finally do something ...
  }
}

MHD_start_daemon(*MHD_USE_SELECT_INTERNALLY* ...

The pseudo model above seems MHD_USE_THREAD_PER_CONNECTION, but creating
new threads only when it is really required.

--
> Best Wishes,
> Evgeny Grin


-- 
Silvio Cl├ęcio

Reply via email to