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)