GithubHelp home page GithubHelp logo

hpohl / uwebsockets Goto Github PK

View Code? Open in Web Editor NEW

This project forked from unetworking/uwebsockets

1.0 3.0 0.0 894 KB

Highly scalable WebSocket server & client library

License: zlib License

CMake 0.88% C++ 93.32% JavaScript 2.87% Batchfile 0.38% QMake 0.42% Makefile 1.49% Meson 0.65%

uwebsockets's Introduction

`µWS` is one of the most lightweight, efficient & scalable WebSocket server implementations available. It features an easy-to-use, fully async object-oriented interface and scales to millions of connections using only a fraction of memory compared to the competition. While performance and scalability are two of our top priorities, we consider security, stability and standards compliance paramount. License is zlib/libpng (very permissive & suits commercial applications).

Note: master is a WIP currently, always use a released version in production. I'm working on a new release with HTTP support but will need some time (latest release is WebSocket only)

  • Autobahn tests all pass.
  • Significantly outperforms WebSocket++, libwebsockets, Beast, Crow, Gorilla, Kaazing Gateway, ws and Socket.IO in every tested dimension (see benchmark table below).
  • Outperforms Node.js itself by 5x in HTTP requests/second when run as a Node.js module.
  • Linux, OS X & Windows support.
  • Valgrind / AddressSanitizer clean.
  • Built-in load balancing and multi-core scalability.
  • SSL/TLS support & integrates with foreign HTTPS servers.
  • Permessage-deflate built-in.
  • Node.js binding exposed as the well-known ws interface (uws is at least 20x faster and 20x more scalable).

npm version

Benchmarks table - validate

Implementation User space memory scaling Connection performance Short message throughput Huge message throughput
Beast 1.0.0 b17 µWS is 7x as lightweight 👍 µWS is 4x as performant µWS is 22x as performant µWS is 3x as performant
libwebsockets 2.0 µWS is 11x as lightweight µWS is equal in performance 👍 µWS is 6x as performant µWS is 4x as performant
Crow [Sep 21] µWS is 13x as lightweight µWS is 2x as performant µWS is 12x as performant unable to measure
Gorilla e8f0f8a µWS is 46x as lightweight µWS is 3x as performant µWS is 5x as performant 😮 data missing
ws v1.1.0 + binary addons µWS is 47x as lightweight µWS is 18x as performant µWS is 33x as performant µWS is 2x as performant
Kaazing Gateway Community 5.0.0 µWS is 62x as lightweight µWS is 15x as performant µWS is 18x as performant unable to measure
Socket.IO 1.5.1 µWS is 62x as lightweight µWS is 42x as performant 👎 µWS is 61x as performant 👎 data missing
WebSocket++ v0.7.0 µWS is 63x as lightweight 👎 µWS is 4x as performant µWS is 3x as performant 👍 µWS is 2x as performant 👍

Benchmarks are run with default settings in all libraries, except for ws which is run with the native performance addons. These results were achieved with the native C++ server, not the Node.js addon. Expect worse performance and scalability when using Node.js (don't worry, the Node.js addon will run circles around ws).

HTTP benchmarks

Implementation Requests per second
Node.js (ExpressJS) 10k
Node.js (vanilla) 30k
Node.js (µWS) 150 - 200k
NGINX 70k
µWS 250k
h2o probably a bit faster than µWS

Experimental HTTP 1.1 benchmark using wrk. All servers are single threaded and serve a static page with no PHP, database queries or similar. µWS has experimental HTTP support in master but not in the latest release.

Built with µWS

Usage

C++

µWebSockets is a high performance C++ library with optional bindings to Node.js. It is greatly recommended investing in a proper C++ implementation if performance and memory scalability is considered critical for the solution in whole. The C++ interface has been designed for simplicity and only requires you to write a few lines of code to get a working server:

#include <uWS.h>

int main()
{
    uWS::Hub h;

    h.onMessage([](uWS::WebSocket<uWS::SERVER> ws, char *message, size_t length, uWS::OpCode opCode) {
        ws.send(message, length, opCode);
    });

    h.listen(3000);
    h.run();
}

Node.js

We built µWS with the existing Node.js infrastructure in mind. That's why we target the widespread ws interface, allowing us to seamlessly integrate with already existing projects. You simply swap require('ws') with require('uws'):

var WebSocketServer = require('uws').Server;
var wss = new WebSocketServer({ port: 3000 });

function onMessage(message) {
    console.log('received: ' + message);
}

wss.on('connection', function(ws) {
    ws.on('message', onMessage);
    ws.send('something');
});
Deviations from ws

There are some important incompatibilities with ws though, we aim to be ~90% compatible but will never implement behavior that is deemed too inefficient:

  • Binary data is passed zero-copy as an ArrayBuffer. This means you need to copy it to keep it past the callback. It also means you need to convert it with Buffer.from(message) if you expect a Node.js Buffer.
  • webSocket._socket is not a net.Socket, it is just a getter function with very basic functionalities.
  • webSocket._socket.remote... might fail, you need to cache it at connection.
  • webSocket acts like an EventEmitter with one listener per event maximum.
  • webSocket.upgradeReq is only valid during execution of the connection handler. If you want to keep properties of the upgradeReq for the entire lifetime of the webSocket you better attach that specific property to the webSocket at connection.
Consider these projects

µWS is already the default engine in recent versions of deepstream.io and SocketCluster.

I would stay away from these projects

You can enable uws in Socket.IO using something like this:

var io = require('socket.io')(80);
io.engine.ws = new (require('uws').Server)({
    noServer: true,
    perMessageDeflate: false
});

You can set 'uws' as transformer in Primus:

var primus = new Primus(server, { transformer: 'uws' });

Installation

Node.js developers

  • Node.js 4.x, 5.x & 6.x supported (Windows version requires Node.js 6.4.0+)
  • Linux, Mac OS X & Windows supported
  • gcc >= 4.8.0 and make (or compatible) are required to build from source. This translates to Visual Studio >= 2015 on Windows and Clang >= 3.3 on macOS.

On installation, the module will be attempted to be build from source. If that fails, it will attempt to fall back to prebuilt modules which are provided for most platforms. If that fails too, uws will throw on require.

C++ developers

Dependencies

First of all you need to install the required dependencies. On Unix systems this is typically done via package managers, like homebrew in the case of OS X or dnf in the case of Fedora Linux. On Windows you need to search the web for pre-compiled binaries or simply compile the dependencies yourself.

  • libuv 1.3+
  • OpenSSL 1.0.x
  • zlib 1.x
  • CMake 3.x

Compilation

Obviously you will need to clone this repo to get the sources. We use CMake as build system.

  • git clone https://github.com/uWebSockets/uWebSockets.git && cd uWebSockets
  • cmake .

Now, on Unix systems it should work by simply running make. Run [sudo] make install as you wish.

Windows, in all its glory

If you are running Windows you should now have a bunch of Visual Studio project files and one solution file. Open the solution file, now you need to make sure the header include paths and library paths are all set according to where you installed the dependencies. You might also need to change the names of the libraries being linked against, all according to the names of the installed library files. You know the drill.

uwebsockets's People

Contributors

agauniyal avatar benv avatar capaj avatar chemhack avatar deckerrj avatar devsnek avatar dkelson avatar florianbellazouz avatar hpohl avatar kapouer avatar lb-- avatar lordmajestros avatar lpinca avatar not-implemented avatar peters avatar qwename avatar silverwind avatar unetworkingab avatar utensil avatar vinniefalco avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.