diff options
| author | Stefan Boberg <[email protected]> | 2021-10-06 13:59:18 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-10-06 13:59:18 +0200 |
| commit | fa48ebf89e06edc9d3bdd26b119417df20902bdd (patch) | |
| tree | 2ea8c3e06282ff537d5985b94f8dc129bd60e9e8 /zenhttp/httpsys.h | |
| parent | Added option to specify path to logfile. (diff) | |
| download | zen-fa48ebf89e06edc9d3bdd26b119417df20902bdd.tar.xz zen-fa48ebf89e06edc9d3bdd26b119417df20902bdd.zip | |
Support for asynchronous HTTP response processing (#19)
This change introduces WriteResponseAsync which can be used to move potentially slow request handler code (like upstream lookups) off the I/O service thread to ensure we are always able to serve as many HTTP requests as possible. The current implementation defaults to 16 async worker threads and there is currently no back-pressure.
- Added RequestStats - Metrics for network requests. Aggregates tracking of duration, payload sizes into a single class for ease of use
- Added some metrics on upstream communication
Co-authored-by: Per Larsson <[email protected]>
Diffstat (limited to 'zenhttp/httpsys.h')
| -rw-r--r-- | zenhttp/httpsys.h | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/zenhttp/httpsys.h b/zenhttp/httpsys.h index a8395b283..46ba122cc 100644 --- a/zenhttp/httpsys.h +++ b/zenhttp/httpsys.h @@ -16,6 +16,7 @@ # define _WINSOCKAPI_ # include <zencore/windows.h> # include "iothreadpool.h" +# include "workthreadpool.h" # include <http.h> @@ -35,7 +36,7 @@ class HttpSysServer : public HttpServer friend class HttpSysTransaction; public: - explicit HttpSysServer(unsigned int ThreadCount); + explicit HttpSysServer(unsigned int ThreadCount, unsigned int AsyncWorkThreadCount); ~HttpSysServer(); // HttpServer interface implementation @@ -45,6 +46,11 @@ public: virtual void RequestExit() override; virtual void RegisterService(HttpService& Service) override; + WorkerThreadPool& WorkPool() { return m_AsyncWorkPool; } + + inline bool IsOk() const { return m_IsOk; } + inline bool IsAsyncResponseEnabled() const { return m_IsAsyncResponseEnabled; } + private: void Initialize(const wchar_t* UrlPath); void Cleanup(); @@ -53,8 +59,6 @@ private: void OnHandlingRequest(); void IssueNewRequestMaybe(); - inline bool IsOk() const { return m_IsOk; } - void RegisterService(const char* Endpoint, HttpService& Service); void UnregisterService(const char* Endpoint, HttpService& Service); @@ -63,10 +67,13 @@ private: spdlog::logger& m_RequestLog; spdlog::logger& Log() { return m_Log; } - bool m_IsOk = false; - bool m_IsHttpInitialized = false; - bool m_IsRequestLoggingEnabled = false; - WinIoThreadPool m_ThreadPool; + bool m_IsOk = false; + bool m_IsHttpInitialized = false; + bool m_IsRequestLoggingEnabled = false; + bool m_IsAsyncResponseEnabled = true; + + WinIoThreadPool m_ThreadPool; + WorkerThreadPool m_AsyncWorkPool; std::wstring m_BaseUri; // http://*:nnnn/ HTTP_SERVER_SESSION_ID m_HttpSessionId = 0; |