DEV Community

Mohammad Abdolirad
Mohammad Abdolirad

Posted on

2

Ensuring Service Availability in Modern Infrastructure with Wait4X's TCP Checker

Are you tired of race conditions in your deployment pipelines? Ever run into those pesky "connection refused" errors when your application starts before its dependencies? Today I'll introduce you to Wait4X's TCP checker - a powerful tool for ensuring your services are ready before your application tries to connect.

What is Wait4X?

Wait4X is a lightweight, zero-dependency tool designed to wait for services to be ready before continuing. It's a Swiss Army knife for service readiness checks, supporting multiple protocols and integrations including TCP, HTTP, DNS, and various databases.

The TCP Checker: Simple Yet Powerful

At its core, the TCP checker does one thing extremely well: it attempts to establish a TCP connection to a specified address and port. If the connection succeeds, the service is considered ready; if it fails, Wait4X will retry based on your configuration.

Basic Usage

The simplest way to use Wait4X's TCP checker is:

wait4x tcp localhost:3306
Enter fullscreen mode Exit fullscreen mode

This command will attempt to connect to MySQL running on the default port, retrying until it succeeds or times out.

Advanced Options

Wait4X offers several options to fine-tune TCP checking behavior:

  1. Connection timeout: Specify how long to wait for each connection attempt

    wait4x tcp localhost:8080 --connection-timeout 5s
    
  2. Retry interval: Control how frequently to retry

    wait4x tcp localhost:8080 --interval 2s
    
  3. Exponential backoff: Use smarter retry strategies

    wait4x tcp localhost:8080 --backoff-policy exponential --backoff-exponential-coefficient 2.0
    
  4. Multiple endpoints: Check multiple services in parallel

    wait4x tcp localhost:3306 localhost:6379 localhost:27017
    
  5. Reverse checking: Wait for a port to become free

    wait4x tcp localhost:8080 --invert-check
    

Real-world Use Cases

Docker Compose Orchestration

When working with Docker Compose, you often have dependencies between services. Using Wait4X, you can ensure services start in the right order:

services:
  db:
    image: postgres:13
    ports:
      - "5432:5432"
    # ...

  api:
    build: ./api
    # ...
    depends_on:
      - db
    command: sh -c "wait4x tcp db:5432 && npm start"
Enter fullscreen mode Exit fullscreen mode

CI/CD Pipelines

In CI/CD pipelines, Wait4X ensures tests don't run until services are ready:

# Start services
docker-compose up -d

# Wait for services to be ready
wait4x tcp localhost:3306 localhost:6379

# Run tests
npm test
Enter fullscreen mode Exit fullscreen mode

Kubernetes Init Containers

Wait4X is perfect for Kubernetes init containers:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  # ...
  template:
    spec:
      initContainers:
        - name: wait-for-db
          image: wait4x/wait4x:latest
          command: [ "wait4x", "tcp", "postgres-service:5432", "--timeout", "60s" ]
      containers:
        - name: app
          image: my-app:latest
          # ...
Enter fullscreen mode Exit fullscreen mode

Using Wait4X as a Go Package

For Go developers, Wait4X provides a clean API:

// Create a context with timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

// Create a TCP checker
tcpChecker := tcp.New("localhost:6379", tcp.WithTimeout(5*time.Second))

// Wait for the TCP port to be available
err := waiter.WaitContext(
    ctx,
    tcpChecker,
    waiter.WithTimeout(time.Minute),
    waiter.WithInterval(2*time.Second),
    waiter.WithBackoffPolicy("exponential"),
)
if err != nil {
    log.Fatalf("Failed to connect: %v", err)
}

fmt.Println("Service is ready!")
Enter fullscreen mode Exit fullscreen mode

How it Works Under the Hood

Wait4X's TCP checker uses Go's net.Dialer.DialContext to attempt TCP connections with configurable timeouts. It handles various error cases intelligently, distinguishing between connection refusals, timeouts, and other network issues.

The exponential backoff strategy progressively increases the interval between retries, reducing unnecessary connection attempts while still responding quickly when services become available.

Conclusion

Wait4X's TCP checker solves a common but critical challenge in modern infrastructure: ensuring services are actually ready before dependent applications attempt to connect. By providing a simple, reliable way to check TCP connectivity, Wait4X helps eliminate race conditions, reduce errors, and make your deployments more robust.

Give Wait4X a try in your next project - your deployment pipelines will thank you!


What service readiness problems have you encountered in your infrastructure? Share your experiences in the comments!

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

If this post resonated with you, feel free to hit ❤️ or leave a quick comment to share your thoughts!

Okay