Bootstrap

libevent高性能服务器,GitHub - 343829084/evpp: 是一个基于libevent开发的现代化C++11高性能网络服务器 A modern C++ network librar...

evpp

68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f5169686f6f3336302f657670702e737667

68747470733a2f2f7472617669732d63692e6f72672f5169686f6f3336302f657670702e7376673f6272616e63683d6d6173746572

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d2532302532302532302532304c696e75782c2532304253442c2532304f53253230582c25323057696e646f77732d677265656e2e7376673f7374796c653d666c6174

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d25323025323042534425323033253230636c617573652d79656c6c6f772e7376673f7374796c653d666c6174

687474703a2f2f7777772e7265706f7374617475732e6f72672f6261646765732f6c61746573742f6163746976652e737667

Introduction 中文说明

evpp is a modern C++ network library for developing high performance network services in TCP/UDP/HTTP protocols.

evpp provides a TCP Server to support multi-threaded nonblocking event-drive server and also a HTTP, UDP Server to support http and udp prococol.

Features

Modern C++11 interface

Modern functional/bind style callback instead of C-style function pointer.

Multi-core friendly and thread-safe

A nonblocking multi-threaded TCP server

A nonblocking TCP client

A nonblocking multi-threaded HTTP server based on the buildin http server of libevent

A nonblocking HTTP client

A nonblocking multi-threaded UDP server

Async DNS resolving

EventLoop/ThreadPool/Timer

Well tested — evpp is well tested with unit tests and stress tested daily in production. It has been used in production and processes 1000+ billions networking communications every day in our production

Easy install — evpp can be packaged as a deb, rpm, tar.gz with a single command for straight forward distribution and integration

And also provides some libraries based on evpp:

evmc a nonblocking async C++ memcached (or membase cluster) client library. This library is currently used in production which sends more than 300 billions requests every day. See evmc readme for more details.

evnsq a nonblocking async C++ NSQ client library. This library is currently used in production which processes more than 130 billions messages every day. See evnsq readme for more details.

NOTE: master is our development branch and may not be stable at all times.

Origin

In our business system, we need to build a TCP long-connection Gateway and other TCP services. When we do a survey of the open sources, we cannot find any appropriate network library for our demands. According to our own business characteristic, an ideal C++ network library must have the features below:

A simple enough C++ interface

Support multi-threads and multi-processes

Based on libevent is preferable for our projects. Given your older applications were based on libevent, it was preferable to have your new framework also be based on it, so as to reduce the overall time/effort/cost to completion. Actually, we do have some older applications which were based on libevent.

As described above, there are not many options to choose from. So we developed one ourself. The design of the interface is highly inspired by muduo and Golang. Let's take some examples to exaplain this:

Duration : This is a time inteval class, with a time unit. It is referenced to the implementation of Duration of the Golang project. We have seen some many cases that the time interval without a unit. For example, what does timeout mean? Seconds, milliseconds or microseconds? We need to read the document carefully, even more, we need to read the implementation codes. Our Duration class has self-explations with the time unit. Additionally std::chrono::duration in the STL of C++11 has the similar implementations, but it is a little bit complicated.

Buffer : This is a memory buffer class. It uses the advantages of the two projects muduo and Golang.

http::Server : This is a HTTP server class with a working threads pool. It is thread-safe to dispatch tasks

We simply use a string with the format of "ip:port" to represent a network address. This is referenced to the design of Golang.

httpc::ConnPool : This is HTTP client connection pool with highly performance. In the future we can add more features to this class : load balance and failover.

In addition, in the implematations we pay seriously attations to thread-safe problems. An event-related resource must be initialized and released in its own EventLoop thread, so that we can minimize the possibility of thread-safe error. In order to achieve this goal we reimplemented event_add andevent_del and other functions. Each call to event_add, we stored the resource into thread local storage, and in the call event_del, we checked it whether it is stored in the thread local storage. And then we checked all the threads local storages to see whether there are resources not destructively released when the process was exiting. The detail codes are here https://github.com/Qihoo360/evpp/blob/master/evpp/inner_pre.cc#L36~L87. We are so harshly pursuit the thread safety to make a program can quietly exit or reload, because we have a deep understanding of "developing a system to run forever and developing a system to quietly exit after running a period of time are totally two different things".

Getting Started

Benchmark

Benchmark Reports

Throughput

The throughput benchmark of evpp is 17%~130% higher than libevent2 and similar with boost.asio and muduo.

Although evpp is based on libevent, evpp has a better throughput benchmark than libevent. That's because evpp implements its own IO buffer instead of libevent's evbuffer.

1b72d7a3e0789ef9d95841596bc69272.png

3ef3c50ef3ffc885e90870b55cebe899.png

Examples

An echo TCP server

#include

#include

#include

int main(int argc, char* argv[]) {

std::string addr = "0.0.0.0:9099";

int thread_num = 4;

evpp::EventLoop loop;

evpp::TCPServer server(&loop, addr, "TCPEchoServer", thread_num);

server.SetMessageCallback([](const evpp::TCPConnPtr& conn,

evpp::Buffer* msg,

evpp::Timestamp ts) {

conn->Send(msg);

});

server.SetConnectionCallback([](const evpp::TCPConnPtr& conn) {

if (conn->IsConnected()) {

LOG_INFO << "A new connection from " << conn->remote_addr();

} else {

LOG_INFO << "Lost the connection from " << conn->remote_addr();

}

});

server.Init();

server.Start();

loop.Run();

return 0;

}

An echo HTTP server

#include

int main(int argc, char* argv[]) {

std::vector ports = { 9009, 23456, 23457 };

int thread_num = 2;

evpp::http::Server server(thread_num);

server.RegisterHandler("/echo",

[](evpp::EventLoop* loop,

const evpp::http::ContextPtr& ctx,

const evpp::http::HTTPSendResponseCallback& cb) {

cb(ctx->body().ToString()); }

);

server.Init(ports);

server.Start();

while (!server.IsStopped()) {

usleep(1);

}

return 0;

}

An echo UDP server

#include

#include

int main(int argc, char* argv[]) {

std::vector ports = { 1053, 5353 };

evpp::udp::Server server;

server.SetMessageHandler([](evpp::EventLoop* loop, evpp::udp::MessagePtr& msg) {

evpp::udp::SendMessage(msg);

});

server.Init(ports);

server.Start();

while (!server.IsStopped()) {

usleep(1);

}

return 0;

}

More examples

Please see the source code in examples.

TODO

An async redis client

Add zipkin tracing support

Add examples : asio chat room

Fix the comments written in mandarin problem

Add benchmark against with boost.asio/cpp-netlib/beast http library/muduo/libevent/libuv ...

In Production

a177de0596eefb965364c5c2a85ddd6d.png

Welcome to join this list :-)

Thanks

Thanks for the support of Qihoo360.

evpp is highly inspired by muduo. Thanks Chen Shuo

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;