DEV Community

Radu Mihai Diaconu
Radu Mihai Diaconu

Posted on

πŸš€ Sockudo: Blazing-Fast, Pusher-Compatible WebSockets with Rust!

Sockudo: A High-Performance WebSockets Server in Rust

Sockudo Banner

Hey Devs! πŸ‘‹

Are you looking for a high-performance, memory-efficient, and scalable WebSockets server that plays nicely with your existing Laravel Echo or Pusher client setup? Say hello to Sockudo! πŸŽ‰

Sockudo is a brand-new WebSockets server written entirely in Rust πŸ¦€, designed from the ground up to be a robust and seamless replacement for services like Pusher, especially if you're in the Laravel ecosystem. It leverages Rust's incredible performance, memory safety, and concurrency features to deliver a top-notch real-time communication solution.

πŸ”₯ Why Sockudo? What's Under the Hood?

Sockudo isn't just another WebSocket server; it's packed with features to make your real-time applications shine:

  • Full Pusher Protocol Compatibility: Drop-in replacement! Works seamlessly with Laravel Echo and other Pusher client libraries (JavaScript, Node.js, PHP, and more!).
  • Built with Rust: Get the speed, safety, and concurrency benefits of Rust for a high-throughput, low-latency experience.
  • Modular Architecture: Need to swap out components? Sockudo's design makes it easy.
  • Horizontal Scaling Out-of-the-Box: Built-in adapters for Redis, Redis Cluster, and NATS mean you can scale as your application grows.
  • Flexible App Management: Supports memory, MySQL, and DynamoDB backends for managing your application configurations.
  • Rich Channel Support: Public, private, presence, and even encrypted private channels are all supported.
  • Webhooks: Keep your application in the loop when channels become occupied or vacated. You can configure event types like member_added, member_removed, and subscription_count.
  • Performance Monitoring: Integrated Prometheus metrics endpoint (/metrics) to keep an eye on active connections, message stats, memory usage, and more.
  • Rate Limiting: Protect your server from abuse with configurable rate limiting (supports Redis).
  • Caching: Memory and Redis cache providers to speed things up.
  • Authentication: Secure your channels with robust subscription verification and user authentication.

πŸ› οΈ The Tech Stack

Sockudo leverages a modern and powerful stack:

  • Core: Rust
  • Scaling Adapters: Redis, Redis Cluster, NATS
  • App Management Backends: In-Memory, MySQL, DynamoDB
  • Caching: In-Memory, Redis
  • Metrics: Prometheus
  • Queueing (for webhooks, etc.): Redis, SQS

πŸš€ Quick Start - Get Up and Running!

Want to take Sockudo for a spin? It's easy:

Prerequisites:

  • Rust (1.85 or newer)
  • Redis (optional, for scaling)

Clone & Build:

git clone https://github.com/RustNSparks/sockudo.git cd sockudo cargo build --release 
Enter fullscreen mode Exit fullscreen mode

Run!:

./target/release/sockudo 
Enter fullscreen mode Exit fullscreen mode

This will start Sockudo with the default in-memory configuration.

βš™οΈ Configuration - Tailor It to Your Needs

Sockudo is super flexible. You can configure it via a config.json file or using environment variables.

Here's a glimpse of what a config.json might look like for app management and adapter setup:

{ "app_manager": { "driver": "memory", // Or "mysql", "dynamodb" "array": { // Used if driver is "memory" "apps": [ { "id": "demo-app", "key": "demo-key", "secret": "demo-secret", "max_connections": "1000", // Can be a string or number "enable_client_messages": true, "max_client_events_per_second": "200" // Can be a string or number } ] } }, "adapter": { "driver": "redis", // Or "nats", "local" "redis": { "requests_timeout": 5000, "prefix": "sockudo", "redis_pub_options": { "url": "redis://127.0.0.1:6379" }, "redis_sub_options": { "url": "redis://127.0.0.1:6379" } } }, "port": 6001, // Default WebSocket port "metrics": { "enabled": true, "port": 9601 // Default metrics port } } 
Enter fullscreen mode Exit fullscreen mode

(For all available options, check out options.rs in the project!)

Or, use environment variables for quick setup:

export PORT=6001 export ADAPTER_DRIVER=redis export REDIS_URL=redis://127.0.0.1:6379 ./target/release/sockudo 
Enter fullscreen mode Exit fullscreen mode

πŸ’œ Laravel Integration? Smooth as Butter!

If you're a Laravel developer, you'll feel right at home. Just update your Laravel Echo configuration in resources/js/bootstrap.js:

// resources/js/bootstrap.js import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, wsHost: import.meta.env.VITE_PUSHER_HOST ?? window.location.hostname, wsPort: import.meta.env.VITE_PUSHER_PORT ?? 6001, // Point to Sockudo's port forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'http') === 'https', disableStats: true, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', // Sockudo uses 'mt1' as a default or your app ID }); 
Enter fullscreen mode Exit fullscreen mode

And your .env file:

BROADCAST_DRIVER=pusher VITE_PUSHER_APP_ID=demo-app # Your Sockudo App ID VITE_PUSHER_APP_KEY=demo-key # Your Sockudo App Key VITE_PUSHER_APP_SECRET=demo-secret # Your Sockudo App Secret VITE_PUSHER_HOST=localhost VITE_PUSHER_PORT=6001 VITE_PUSHER_SCHEME=http VITE_PUSHER_APP_CLUSTER=mt1 # Or your Sockudo App ID 
Enter fullscreen mode Exit fullscreen mode

🀝 Works with Your Favorite Pusher Clients

Since Sockudo is Pusher-compatible, you can use standard Pusher client libraries in JavaScript, Node.js, PHP, etc., by simply pointing them to your Sockudo server instance.

Example (JavaScript):

const pusher = new Pusher('demo-key', { // Your Sockudo App Key wsHost: 'localhost', wsPort: 6001, enabledTransports: ['ws', 'wss'], disableStats: true, forceTLS: false, }); const channel = pusher.subscribe('my-channel'); channel.bind('my-event', function(data) { console.log('Received event:', data); }); 
Enter fullscreen mode Exit fullscreen mode

πŸ“ˆ Ready to Scale?

Sockudo is built for growth:

  • Horizontal Scaling: Easily configure the Redis or NATS adapter.
  • App Management: Use MySQL or DynamoDB for robust, production-ready app credential management.

πŸ”— Dive Deeper & Contribute!

Sockudo is an open-source project licensed under AGPL 3.0. We're excited to see how the community uses and improves it!

  • ⭐ Star us on GitHub: RustNSparks/sockudo
  • πŸ“– Check out the full documentation: sockudo.app
  • πŸ€” Got questions or feedback? Open an issue on GitHub!

If you're looking for a performant, modern, and highly compatible WebSocket server, especially if you're working with Rust or Laravel, give Sockudo a try. We think you'll love the speed and efficiency!

Top comments (0)