ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
WR
realtime · 3 min read

websocket reconnection logic

=====================================================

=====================================================

As a developer working on real-time applications, you're likely familiar with the importance of maintaining a stable connection between clients and servers. However, even with robust infrastructure in place, disconnections can occur due to various reasons such as network congestion, server overload, or client-side issues. In this article, we'll delve into the technique of implementing websocket reconnection logic, ensuring that your application remains resilient in the face of connectivity failures.

Detecting Disconnects


Before diving into the reconnection logic, it's essential to detect when a disconnect occurs. Websocket connections don't provide an explicit event for disconnections, so we need to rely on more subtle indicators.

// TypeScript example using WebSocket API
const ws = new WebSocket('ws://example.com');
ws.onclose = () => {
  console.log('Disconnected from server.');
};

In the above code snippet, we're listening for the close event on the websocket instance. When this event is triggered, it indicates that the connection has been closed.

Exponential Backoff


To avoid overwhelming the server with reconnection attempts, we employ an exponential backoff strategy. This technique involves waiting for increasingly longer periods between reconnection attempts, thus giving the system time to recover from the disconnection.

function reconnect(wsUrl) {
  let retryDelay = 1000; // initial delay in milliseconds
  while (true) {
    try {
      const ws = new WebSocket(wsUrl);
      ws.onopen = () => console.log('Reconnected to server.');
      break;
    } catch (error) {
      console.error('Reconnection attempt failed:', error);
      retryDelay *= 2; // exponential backoff
      setTimeout(() => {}, retryDelay);
    }
  }
}

In this example, we're using a simple while loop to repeatedly attempt reconnections with increasing delay between attempts.

Resume Cursor and Heartbeat Ping


To ensure that the client doesn't lose its position in the stream of events or data, we need to implement a mechanism for resuming the cursor and sending periodic heartbeat pings. This involves maintaining a local state on the client-side and periodically sending updates to the server.

# PowerShell example using WebSocket-Node library
$ws = New-WebSocket -Uri 'ws://example.com'
$cursor = 0
while ($true) {
    $ws.Send("heartbeat")
    if ($ws.ReadyState -eq "open") {
        # Send data or events
        $data = Get-DataFromServer
        $ws.Send($data)
    }
    Start-Sleep -Milliseconds 10000
}

In this PowerShell example, we're using the WebSocket-Node library to establish a websocket connection and periodically send heartbeat pings to the server.

When NOT to Use It


While websocket reconnection logic is essential for real-time applications, there are cases where it's not necessary or even counterproductive. For instance:

  • In applications with low latency requirements, such as live video streaming, it might be more efficient to prioritize connection stability over reconnection attempts.
  • If the application has a small number of users and can tolerate occasional disconnections without significant impact on user experience.

Related Apiary Lessons


For further reading on implementing websocket reconnection logic, consider exploring the following related topics:

Conclusion


Implementing websocket reconnection logic is a crucial aspect of building robust real-time applications. By detecting disconnects, employing exponential backoff strategies, and maintaining a local state for resuming the cursor and sending heartbeat pings, you can ensure that your application remains resilient in the face of connectivity failures.

As the great beekeeper once said, "A hive without a plan is like a flower without nectar – it's just a mess."

Frequently asked
What is websocket reconnection logic about?
=====================================================
What should you know about detecting Disconnects?
Before diving into the reconnection logic, it's essential to detect when a disconnect occurs. Websocket connections don't provide an explicit event for disconnections, so we need to rely on more subtle indicators.
What should you know about exponential Backoff?
To avoid overwhelming the server with reconnection attempts, we employ an exponential backoff strategy. This technique involves waiting for increasingly longer periods between reconnection attempts, thus giving the system time to recover from the disconnection.
What should you know about resume Cursor and Heartbeat Ping?
To ensure that the client doesn't lose its position in the stream of events or data, we need to implement a mechanism for resuming the cursor and sending periodic heartbeat pings. This involves maintaining a local state on the client-side and periodically sending updates to the server.
What should you know about when NOT to Use It?
While websocket reconnection logic is essential for real-time applications, there are cases where it's not necessary or even counterproductive. For instance:
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room