The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Async::Microservice::Time - example time async microservice

SYNOPSYS

    # can be started using:
    plackup --port 8085 -Ilib --access-log /dev/null --server Twiggy bin/async-microservice-time.psgi

    curl "http://localhost:8085/v1/hcheck" -H "accept: application/json"
    curl "http://localhost:8085/v1/epoch"  -H "accept: application/json"
    curl "http://localhost:8085/v1/datetime?time_zone=local" -H "accept: application/json"

DESCRIPTION

This is an example asynchronous http micro service using Async::Microservice. View the source code it's minimal.

METHODS

service_name

Just a name, used to identify process and look for OpenAPI documentation.

get_routes

Path::Router configuration for dispatching

http response methods

GET_datetime

https://time.meon.eu/v1/datetime

POST_datetime

    $ curl -X POST "https://time.meon.eu/v1/datetime" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"epoch\":-42}"
    {
       "date" : "1969-12-31",
       "datetime" : "1969-12-31 23:59:18 +0000",
       "day" : "31",
       "epoch" : -42,
       "hour" : "23",
       "minute" : "59",
       "month" : "12",
       "second" : "18",
       "time" : "23:59:18",
       "time_zone" : "+0000",
       "time_zone_name" : "UTC",
       "year" : "1969"
    }

GET_epoch

https://time.meon.eu/v1/epoch

GET_sleep

https://time.meon.eu/v1/sleep?duration=2.5

This is the only parallel processed reponse method (the other ones are pure CPU-only bound) that sleep given (or random) number of seconds and only then returns the request response with when it started and how long it took. Normally this the same as what is in duration parameter, but in case the server is overloaded with requests, the event loop may call the timer handler much later than the duration. Try:

    ab -n 1000 -c 500 http://localhost:8085/v1/sleep?duration=3
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0  259 432.8     21    1033
    Processing:  3001 3090  72.5   3061    3253
    Waiting:     3001 3090  72.5   3061    3253
    Total:       3022 3349 394.1   3155    4065

Then try to run together with 100% CPU load:

    ab -q -n 10000 -c 50 http://localhost:8085/v1/datetime

the rest

Check out Async::Microservice for built-in http response methods.

SEE ALSO

t/02_Async-Microservice-Time.t for an example how to test this service.