FlashMQ is a multi-threaded fast lightweight MQTT broker. It’s written in C++, using mostly POSIX (Linux) APIs, as an event-driven multi-core state machine. This means it aims to scale linearly with the amount of cores in a system, and likewise incur load linear to the amount of clients/messages. Currently, it’s capable of reaching one million messages per second at 1.3 gbit/sec on a single four core server (and play full motion ASCII video at the same time 😉 ), and handle more than four million connections on one server.
Design goals/aspects
- Simple yet powerful (fast and scales well).
- One thread per CPU/core, with clients living in one thread only.
- Event and readiness-change driven.
- Very few dependencies, for ease of deployment and code stability.
- Stable code base. MQTT is simple enough that you don’t need esoteric features or libraries, so using C++ and few external dependencies, it should be able to compile 20 years from now, and work consistently across OS versions.
Current Features
- MQTT 3.1, 3.1.1 and 5.0
- Retained messages
- Wills
- Native HTTP1 websocket support, without external libraries. HTTP2 will not be implemented. There’s no advantage and it’s overly complex. You can always proxy with Nginx if you really want it.
- SSL/TLS.
- TLS x509 client verification.
- HAproxy.
- QoS 0, 1 and 2.
- Authentication with plugin or ‘mosquitto_password_file’.
- Native C++ FlashMQ authentication plugin interface.
- Mosquitto auth plugin version 2 compatibility. This comes with a caveat though: it must be thread safe. Config options exist to perform some serialization, but it’s not a guarantee.
- Intel SSE4.2 (SIMD) instructions for string/topic handling.
- Persistent state (save sessions, subscriptions and retained messages).