Giter Club home page Giter Club logo

babl's Introduction

Babl WebSocket Server

Code Alerts Code Quality Build Status

Babl is a high-performance, scalable web-socket server designed for use in low-latency applications.

Built from the ground up to provide blazing fast execution speeds, Babl will comfortably handle high-throughput, large session-count workloads without slowing down.

Using an event-driven reactive programming model, your application code is executed in an allocation-free, lock-free event-loop for maximum efficiency and mechanical sympathy.

Documentation

babl's People

Contributors

babl-ws avatar ccnlui avatar dependabot[bot] avatar epickrram avatar isolgpus avatar tonytamwk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

babl's Issues

PingAgent ignores zero-data ping-packets

The websocket standard allows for ping-packets with no data. But since the PingAgent uses 0 to determine that it doesn't need to send a pong it essentially ignores it. There is a related issue that encodeData() in the FrameEncoder processes zero-length packets with zero frames and thereby ignores them.

why do you websocket

Hi, why do you use Websocket, why don't you use Rsocket to increase performance. And can you share me some factors to achieve High Performance app ?

DETACHED mode and DEVELOPMENT mode

Hi,

This is more a comment than a report for any issue.

I did start babl server by using the programmatic approach. Initially, I was starting with the PerformanceMode.DEVELOPMENT to create the WebSocket server. Then I did try to add the AdditionnalWork but without success, until I debug the code and see that PerformanceMode.DEVELOPMENT deactivate the babl.server.deployment.mode=DETACHED and redefine it as DIRECT.

I'm now using DETACHED mode with PerformanceMode.LOW and it seems ok.

JDK 17 Support?

I'm exploring this library and it seems like I was not able to build the project with JDK 17 or JDK 11. I also had problems when I tried to import it as a library.

I'd really appreciate some pointers on how to build this project locally, and what I should look into in order to make it compatible with JDK 17.

2 problems I've encountered so far:
problem 1: cannot build project with JDK 17 (or JDK 11)

error with JDK 17

$ ./gradlew --version
------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------
Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0
Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          17.0.2 (Eclipse Adoptium 17.0.2+8)
OS:           Mac OS X 12.3.1 aarch64

$ ./gradlew build
> Task :generateCodecs
> Task :compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.ClassNameCollector (in unnamed module @0x3b811c26) cannot access class com.sun.tools.javac.code.Symbol$TypeSymbol (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.code to unnamed module @0x3b811c26

error with JDK 11

$ ./gradlew --version
------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------
Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0
Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          11.0.14.1 (Eclipse Adoptium 11.0.14.1+1)
OS:           Mac OS X 12.3.1 x86_64

> Task :checkLicenseMain FAILED
No matching header format found for build/generated-sources/java/sbe-schema.sbeir

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkLicenseMain'.
> License violations were found: build/generated-sources/java/com/aitusoftware/babl/codec/RemoveSessionFromTopicEncoder.java, ...

problem 2: cannot run project with JDK 17 when imported as library
Sample broadcast server that broadcasts to every connected client 1 msg / second, which resulted in the following exception while running with JDK 17. But the same code works with JDK 11.

Program:

try (SessionContainers containers = BablServer.launch(config))
{
    containers.start();
    streamServer.broadcast.createTopic(42);
    final String TOPIC_ONE_MSG = "TOPIC_ONE";
    final UnsafeBuffer topicOneMsg = new UnsafeBuffer(TOPIC_ONE_MSG.getBytes(StandardCharsets.UTF_8));
    while (true)
    {
        streamServer.broadcast.sendToTopic(42, ContentType.TEXT, topicOneMsg, 0, topicOneMsg.capacity());
        Thread.sleep(1);
    }
}

Exception:

Exception in thread "main" java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
        at com.aitusoftware.babl.websocket.FrameEncoder.<init>(FrameEncoder.java:49)
        at com.aitusoftware.babl.websocket.FrameEncoder.<init>(FrameEncoder.java:94)
        at com.aitusoftware.babl.websocket.SessionFactory.get(SessionFactory.java:67)
        at com.aitusoftware.babl.websocket.SessionFactory.get(SessionFactory.java:32)
        at com.aitusoftware.babl.pool.ObjectPool.<init>(ObjectPool.java:43)
        at com.aitusoftware.babl.websocket.SessionContainer.<init>(SessionContainer.java:128)
        at com.aitusoftware.babl.websocket.BablServer.initialiseServerInstance(BablServer.java:252)
        at com.aitusoftware.babl.websocket.BablServer.launch(BablServer.java:140)

Web socket client

Hi! I see that there is a basic web socket client for testing purposes in the project. It would be good to see the proper low latency web socket (wss) client in one of the future releases. Are there any plans for it?

Configuring The Application class

How do I configure my application class on startup? Right now I can it on the classpath but I'd like to put it somewhere else and pass a file location in on startup.

ask about this picture

Hi, why need you to build the Network like this, what is business logic, receiver and sender, thanks
xoa2

Unsafe operation causes InternalError on ARM (RPI 4)

Running WS server on the following system:

Raspberry Pi 4 Model B 8GB
OS: Ubuntu Server 20.04 (64 bit)

Exception in thread "main" java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
	at com.aitusoftware.babl.monitoring.MappedSessionContainerStatistics.<init>(MappedSessionContainerStatistics.java:52)
	at com.aitusoftware.babl.websocket.SessionContainer.<init>(SessionContainer.java:125)
	at com.aitusoftware.babl.websocket.BablServer.initialiseServerInstance(BablServer.java:252)
	at com.aitusoftware.babl.websocket.BablServer.launch(BablServer.java:140)

The same program works perfectly from my Dell XPS laptop, running Ubuntu 18.04 with the following cpu:

eliquinox@eliquinox-XPS-15-9560:~$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  2
Core(s) per socket:  4
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
Stepping:            9
CPU MHz:             800.022
CPU max MHz:         3800.0000
CPU min MHz:         800.0000
BogoMIPS:            5599.85
Virtualisation:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            6144K
NUMA node0 CPU(s):   0-7

I am willing to test any suggestions.

Performance degrades when broadcast payload size increases

Issue:
I'm trying to understand why performance drops so much when I increased broadcast payload size from 30 bytes to 100 bytes.

The babl server is very simple: it polls an external aeron subscription in the additionWork agent (applicationWork pattern), broadcasts every message that it receives to 1 topic. There is 1 websocket client listening on the topic.

Why I think its babl server?
I think I'm misconfiguring babl, but I'm not sure.

I tried testing with the same websocket client, while using another websocket library like java-websocket. And I was able to measure ~1ms latency with 30 bytes and 100 bytes payload.

I also tried testing the same babl server and websocket client on two different servers on google cloud. Very similar results...

Test results below, I'd appreciate any feedback. Thank you.

Benchmark setup:
1 websocket client
15000 msg / sec
broadcast every message to 1 topic

Results - payload size: 30 bytes

2022/05/18 20:47:36 warm up 20 seconds...
trades: 5000 quotes: 10000 quotes latency us (p50 p95 p99): 1088 1140 1187 trades latency us (p50 p95 p99): 1084 1136 1194
trades: 5000 quotes: 10001 quotes latency us (p50 p95 p99): 1088 1140 1183 trades latency us (p50 p95 p99): 1084 1136 1189
trades: 5001 quotes: 10001 quotes latency us (p50 p95 p99): 1088 1142 1350 trades latency us (p50 p95 p99): 1084 1137 1355
(...)

Results payload size: 100 bytes

2022/05/18 20:52:43 warm up 20 seconds...
trades: 4995 quotes: 9990 quotes latency us (p50 p95 p99): 12703 22559 23439 trades latency us (p50 p95 p99): 12671 22527 23455
trades: 4966 quotes: 9932 quotes latency us (p50 p95 p99): 12703 22559 23439 trades latency us (p50 p95 p99): 12671 22527 23455
trades: 4968 quotes: 9936 quotes latency us (p50 p95 p99): 12695 22559 23439 trades latency us (p50 p95 p99): 12663 22527 23439
(...)

babl properties:

babl.server.bind.address=0.0.0.0
babl.server.connection.backlog=20
babl.server.deployment.mode=DETACHED
babl.server.directory=/dev/shm/babl
babl.server.instances=1
babl.server.listen.port=8080
babl.server.poll.mode.enabled=false
babl.server.poll.mode.session.limit=5
babl.server.session.monitoring.entry.count=4096
babl.server.session.poll.limit=200
babl.server.validation.timeout=10000000000
babl.server.validation.validator=com.aitusoftware.babl.websocket.AlwaysValidConnectionValidator
babl.performance.mode=HIGH
babl.session.buffer.decode.max.size=131072
babl.session.buffer.decode.size=1024
babl.session.buffer.max.size=16777216
babl.session.buffer.receive.size=1024
babl.session.buffer.send.size=65536
babl.session.frame.max.size=65536
babl.session.ping.interval=5000000000
babl.session.pong.response.timeout=30000000000
babl.socket.receive.buffer.size=65536
babl.socket.send.buffer.size=65536
babl.socket.tcpNoDelay.enabled=false
babl.proxy.application.adapter.poll.limit=200
babl.proxy.application.stream.base.id=5000
babl.proxy.back.pressure.policy=CLOSE_SESSION
babl.proxy.driver.dir=/dev/shm/aeron
babl.proxy.driver.launch=false
babl.proxy.server.adapter.poll.limit=150
babl.proxy.server.stream.base.id=6000
babl.server.idle.strategy=BACK_OFF
babl.application.idle.strategy=BUSY_SPIN

How to create websocket server endpoints?

How would you implement a server endpoint?

For example, client would connect to ws://localhost:8080/myendpoint, instead of just ws://localhost:8080.

I assumed I'd have to implement this function myself inside onSessionConnected, but the Session object doesn't seem to provide any information on the client's request, I was hoping to be able to get the request's path/endpoint/query etc...

How can this be done?

Thank you.

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.