HNHacker News
TopNewBestAskShowJobs

lganzzzo

181 karma · joined October 13, 2018

submissionscomments
lganzzzo··on Show HN: C++ Http-Live-Streaming Server built with Oat++ framework
Thank you, I appreciate your feedback!
lganzzzo··on Show HN: C++ Http-Live-Streaming Server built with Oat++ framework
C++ HLS streaming server built with oat++ zero-dependency framework. (about oat++ see: https://github.com/oatpp/oatpp)

Features:

- Serve embedded video

- Serve HLS stream

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Yeah, I already looked through requirements. It will take me some time to prepare all that stuff. But I think it's gonna be fun
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Thank you for the question.

-----------------------------------------------------------------------------

// I want to adopt oatpp.io, but I'm using a synchronous database driver mongo-cxx-driver.

- Unfortunately no - if your driver has only synchronous API you can use it with multithreaded oatpp only.

-----------------------------------------------------------------------------

// Also, when using coroutine, will the server be a single-thread process?

// or it will be a multiple thread process with each thread using coroutines (to fully utilize the cpu)

- Yes, it will be a multiple thread process with each thread using coroutines. You can configure how many threads should run the AsyncHttpConnectionHandler. Number of threads is passed to the AsyncHttpConnectionHandler constructor. Also you may tweak it in compile time via option:

"-D OATPP_ASYNC_HTTP_CONNECTION_HANDLER_THREAD_NUM_DEFAULT=<num of threads>"

You have to play with this parameter in order to achieve best performance. In most cases on : - Linux it's value should be (<num of CPUs> - 1). - On MacOS it's value should be 2.

-----------------------------------------------------------------------------

// If my server wants to visit third party rest APIs in an asynchronous way,

// what's the best asynchronized library to choose to make use of coroutine?

- Native way to do it is to use oatpp ApiClient https://oatpp.io/docs/component/api-client

it provides two declarations:

- API_CALL("GET", "/resource", getResource) ///< Example of API call

- API_CALL_ASYNC("GET", "/resource", getResourceAsync) ///< Example of Async API call

Also there is an example project with the full example how to make asynchronous calls to rest APIs https://github.com/oatpp/oatpp-examples/tree/master/tls-libr...

There is no README currently in this example, but I gonna add asap.

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Hey, thank you for the feedback! It is really very important to me what seems unclear to user, and what info to add.
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Oh ok, thank you for clarification.

During the initial investigation boost::asio appeared to work not very good on MacOS. Problems where on the load higher than 10K concurrent connections.

There was multiple requests to compare networking performance of oatpp to ASIO lately. So I want to make full-scale testing before making statements.

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
good point
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Memory management, and pools.

Memory management is definitely super important and has big impact on the performance. Also there is a memory fragmentation issue that you should keep in mind building server apps. Solving this problems is time consuming and you need to do a lot of experiments in order to tune all this system. So if there is a robust time-proved solution for solving this problems it is definitely worth of considering.

shared_ptr and refcounts - actually it is a compromise (like any other solution). On the one hand you could avoid refcounts, atomics etc. On the other hand you have a framework for the end user. And user may be not so familiar in depth of your framework's thread management and concurrent access to some shared objects.

Also end-user may decide to bring in some other library which for example uses shared_ptr. And what user should do if he has to share some object among std::shared_ptr and your own custom shared-ptr:)?

This is the reason I decided to go with std::shared_ptr (with it's atomic refcounter) as I mentioned in the code-review in the response https://github.com/oatpp/oatpp/issues/15

Now about Ravenbrook MPS pools in particular: It seems to be a robust time-proved solution which may help you to avoid a lot of pain. As for oatpp - oatpp claims to be zero-dependency at the moment. So no external dependencies are considered at the moment. This may be changed at some moment in the future but not for now.

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Have you noticed oatpp ApiClient (retrofit-like client wrapper)? This is another trick oatpp's ObjectMapper layer can do.

The oatpp-consul client is built using oatpp ApiClient. see ApiClient in the oatpp-consul https://github.com/oatpp/oatpp-consul/blob/master/rest/Clien...

example how to do client requests https://github.com/oatpp/oatpp-examples/issues/3

It is also possible to build your own RequestExecutor based on ex. Curl

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
There is a limitation on the header size in the oatpp html parser.

Think I should tweak this.

Thank you for the note!

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Hello, Thank you for the question!

oatpp has been recently tested on: - Linux (Ubuntu 16, 18. CentOS 7.5) - MacOS

Windows support is not currently available. But I would love to add it. If there someone with windows machine and willing to help, I will provide all needed assistance. Windows support issue: https://github.com/oatpp/oatpp/issues/2

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Yeah known issue, I am not a JS master:(
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Did you notice that https://oatpp.io is served by oatpp :)?
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Thanks, this is a really good code-review! I appreciate this!
lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Thank you for the question,

No, I have not tried seastar. But thank you for the tip, I think there might be things for me to point out.

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
I agree. I should schedule to add ASIO vs oatpp benchmark.

However performance is not the only thing oatpp has. Among with other features oatpp provides ObjectMapping layer. ObjectMapping layer enables you to do cool stuff like: - autodocument endpoints see https://medium.com/oatpp/c-oatpp-web-service-with-swagger-ui...

- easily implement custom protocols (I will write article about this later)

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Thank you for the question,

Oat++ provides interfaces to substitute SSL backend. One can easily substitute any SSL backend by implementing two class: - Connection - ConnectionProvider

Currently there is an adapter for LibreSSL https://github.com/oatpp/oatpp-libressl/tree/master/server

But if you need TLS 1.3 one may add GnuTLS adapter for example

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
The idea of the project is to give user something light, something that could cover a set of basic needs when you develop a web-service (Like rest-framework, basic DI-framework, web-client, connection management, object-mapping etc...) and make it highly customizable at the same time.

So when you need to kickoff something from scratch you don't need to do anything more than a git clone starter-project and start coding. And when it comes time for additional requirements you cant easily substitute ex. any SSL backend, any http-client, add http compression etc... And oat++ provides interfaces to configure there things.

See more: Example how to create web-service with swagger-uI and auto-documented endpoints https://medium.com/oatpp/c-oatpp-web-service-with-swagger-ui...

lganzzzo··on Show HN: Oat++ – Zero-dependency C++ framework for high-performance web services
Hello and thank you for the question!

The short answer: - I don't know. - Let Techempower to settle this.

I decided to take on Go(net/http) in the initial benchmarks as it shows good performance and even overperformed c++ solutions that claimed to be more performant (in their tests).

But! There multiple things that can be tuned especially with c++ servers. And there are multiple tests which show different aspects of server's performance. The problem is that currently I have no resources to do all these tests and what is more important - I think such tests should be made by an independent third party.

So I think oat++ should be submitted to Techempower to answer all those questions.

← PreviousPage 2 of 2