All Projects → Qihoo360 → Evpp

Qihoo360 / Evpp

Licence: bsd-3-clause
A modern C++ network library for developing high performance network services in TCP/UDP/HTTP protocols.

Programming Languages

C++
36643 projects - #6 most used programming language
c
50402 projects - #5 most used programming language
CMake
9771 projects
shell
77523 projects
go
31211 projects - #10 most used programming language
python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Evpp

Libhv
🔥 比libevent、libuv更易用的国产网络库。A c/c++ network library for developing TCP/UDP/SSL/HTTP/WebSocket client/server.
Stars: ✭ 3,355 (+17.72%)
Mutual labels:  http-server, libevent, evpp
Firefly
Firefly is an asynchronous web framework for rapid development of high-performance web application.
Stars: ✭ 277 (-90.28%)
Mutual labels:  high-performance, http-server
Dubbogo
a golang micro-service framework compatible with alibaba dubbo
Stars: ✭ 258 (-90.95%)
Mutual labels:  tcp-server, http-server
Zaver
Yet another fast and efficient HTTP server
Stars: ✭ 673 (-76.39%)
Mutual labels:  high-performance, http-server
twjitm-core
采用Netty信息加载实现长连接实时通讯系统,客户端可以值任何场景,支持实时http通讯、webSocket通讯、tcp协议通讯、和udp协议通讯、广播协议等 通过http协议,rpc协议。 采用自定义网络数据包结构, 实现自定义网络栈。
Stars: ✭ 98 (-96.56%)
Mutual labels:  tcp-server, udp-server
cs
开箱即用的基于命令的消息处理框架,让 websocket 和 tcp 开发就像 http 那样简单
Stars: ✭ 19 (-99.33%)
Mutual labels:  tcp-server, http-server
Swoft
🚀 PHP Microservice Full Coroutine Framework
Stars: ✭ 5,420 (+90.18%)
Mutual labels:  tcp-server, http-server
aioudp
Asyncio UDP server
Stars: ✭ 21 (-99.26%)
Mutual labels:  async-functions, udp-server
Netcoreserver
Ultra fast and low latency asynchronous socket server & client C# .NET Core library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K connections problem solution
Stars: ✭ 799 (-71.96%)
Mutual labels:  tcp-server, http-server
Sylar
C++高性能分布式服务器框架,webserver,websocket server,自定义tcp_server(包含日志模块,配置模块,线程模块,协程模块,协程调度模块,io协程调度模块,hook模块,socket模块,bytearray序列化,http模块,TcpServer模块,Websocket模块,Https模块等, Smtp邮件模块, MySQL, SQLite3, ORM,Redis,Zookeeper)
Stars: ✭ 895 (-68.6%)
Mutual labels:  high-performance, http-server
Mofuw
mofuw is *MO*re *F*aster, *U*ltra minimal *W*ebserver.
Stars: ✭ 107 (-96.25%)
Mutual labels:  high-performance, http-server
Mgx
🌈 A high performance network framework written in c++ (support tcp and http)
Stars: ✭ 15 (-99.47%)
Mutual labels:  tcp-server, http-server
CSharpServer
Ultra fast and low latency asynchronous socket server & client C# library with support TCP, SSL, UDP protocols and 10K connections problem solution
Stars: ✭ 101 (-96.46%)
Mutual labels:  tcp-server, udp-server
ev
Lightweight event-loop library based on multiplexing IO
Stars: ✭ 15 (-99.47%)
Mutual labels:  tcp-server, nonblocking
network
exomia/network is a wrapper library around System.Socket for easy and fast TCP/UDP client & server communication.
Stars: ✭ 18 (-99.37%)
Mutual labels:  tcp-server, udp-server
Cppserver
Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K connections problem solution
Stars: ✭ 528 (-81.47%)
Mutual labels:  tcp-server, http-server
yastack
YAStack: User-space network-stack based on DPDK, FreeBSD TCP/IP Stack, EnvoyProxy
Stars: ✭ 90 (-96.84%)
Mutual labels:  high-performance, libevent
rockgo
A developing game server framework,based on Entity Component System(ECS).
Stars: ✭ 617 (-78.35%)
Mutual labels:  tcp-server, udp-server
Cowboy
Small, fast, modern HTTP server for Erlang/OTP.
Stars: ✭ 6,533 (+129.23%)
Mutual labels:  high-performance, http-server
Netty Rest
Yet another high performance REST server based on Netty
Stars: ✭ 107 (-96.25%)
Mutual labels:  high-performance, http-server

evpp

Github release Build status Platform License Project Status: Active – The project has reached a stable, usable state and is being actively developed.

Introduction 中文说明

evpp is a modern C++ network library for developing high performance network services using TCP/UDP/HTTP protocols. evpp provides a TCP Server to support multi-threaded nonblocking event-driven server and also a HTTP, UDP Server to support HTTP and UDP protocols.

Features

  1. Modern C++11 interface
  2. Modern functional/bind style callback instead of C-style function pointer.
  3. Multi-core friendly and thread-safe
  4. A nonblocking multi-threaded TCP server
  5. A nonblocking TCP client
  6. A nonblocking multi-threaded HTTP server based on the buildin http server of libevent
  7. A nonblocking HTTP client
  8. A nonblocking multi-threaded UDP server
  9. Async DNS resolving
  10. EventLoop/ThreadPool/Timer
  11. 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
  12. 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:

  1. 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.
  2. 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:

  1. A simple enough C++ interface
  2. Support multi-threads and multi-processes
  3. 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 explain this:

  1. Duration : This is a time interval 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.
  2. Buffer : This is a memory buffer class. It uses the advantages of the two projects muduo and Golang.
  3. http::Server : This is a HTTP server class with a working threads pool. It is thread-safe to dispatch tasks
  4. We simply use a string with the format of "ip:port" to represent a network address. This is referenced to the design of Golang.
  5. 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 implementations 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 and event_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

Please see Quick Start

Benchmark

Benchmark Reports

The IO Event performance benchmark against Boost.Asio : evpp is higher than asio about 20%~50% in this case

The ping-pong benchmark against Boost.Asio : evpp is higher than asio about 5%~20% in this case

The throughput benchmark against libevent2 : evpp is higher than libevent about 17%~130% in this case

The throughput benchmark against Boost.Asio : evpp and asio have the similar performance in this case

The throughput benchmark against Boost.Asio(中文) : evpp and asio have the similar performance in this case

The throughput benchmark against muduo(中文) : evpp and muduo have the similar performance in this case

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.

Examples

An echo TCP server

#include <evpp/tcp_server.h>
#include <evpp/buffer.h>
#include <evpp/tcp_conn.h>

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 <evpp/http/http_server.h>

int main(int argc, char* argv[]) {
    std::vector<int> 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 <evpp/udp/udp_server.h>
#include <evpp/udp/udp_message.h>

int main(int argc, char* argv[]) {
    std::vector<int> 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

  1. An async redis client
  2. Add zipkin tracing support
  3. Add examples : asio chat room
  4. Fix the comments written in mandarin problem
  5. Add benchmark against with boost.asio/cpp-netlib/beast http library/muduo/libevent/libuv ...

In Production

Qihoo

Welcome to join this list :-)

Thanks

Thanks for the support of Qihoo360.

Thanks for libevent, glog, gtest, Golang, LevelDB, rapidjson projects.

evpp is highly inspired by muduo. Thanks Chen Shuo

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].