4-building-real-time-applications-with-go-and-websocket-in-fastapi.html

Building Real-Time Applications with Go and WebSocket in FastAPI

In today's fast-paced digital world, real-time applications have become essential for delivering instant updates and enhancing user experiences. From chat applications to live notifications, the demand for real-time functionality is skyrocketing. This article will guide you through building real-time applications using Go and WebSocket within the FastAPI framework. We will explore definitions, use cases, and provide actionable coding examples to help you implement these technologies effectively.

What is FastAPI?

FastAPI is a modern, fast (high-performance) web framework for building APIs with Python based on standard Python type hints. It is easy to use and comes with automatic interactive API documentation. FastAPI is particularly well-suited for building real-time applications due to its asynchronous capabilities, which allow for handling multiple connections simultaneously.

Understanding WebSocket

WebSocket is a protocol that enables full-duplex communication channels over a single TCP connection. This means that both the server and the client can send messages to each other independently, making it a perfect choice for real-time applications. Unlike traditional HTTP requests, where the client always initiates communication, WebSocket allows for persistent connections.

Use Cases for Real-Time Applications

  1. Chat Applications: Enable users to send and receive messages instantly.
  2. Live Notifications: Update users with real-time notifications (e.g., social media alerts, news feeds).
  3. Collaborative Tools: Allow multiple users to work on documents in real-time.
  4. Gaming: Provide real-time interactions between players.

Setting Up Your Environment

Before diving into coding, ensure you have the following installed: - Python 3.6+: FastAPI requires Python 3.6 or higher. - Go: Install Go to leverage its powerful concurrency model. - FastAPI: You can install FastAPI and its dependencies using pip:

pip install fastapi uvicorn
  • WebSocket Library: FastAPI has built-in support for WebSockets, so no additional library is needed.

Building a Real-Time Application with FastAPI and WebSocket

Let's create a simple real-time chat application using FastAPI and WebSocket. This example will demonstrate how to manage WebSocket connections and handle incoming messages.

Step 1: Create the FastAPI Server

Create a new file named main.py and add the following code:

from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
from fastapi.routing import WebSocketRoute

app = FastAPI()

html = """
<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket Chat</title>
    </head>
    <body>
        <h1>WebSocket Chat</h1>
        <textarea id="chat" cols="30" rows="10" disabled></textarea><br>
        <input id="message" type="text" placeholder="Type a message...">
        <button onclick="sendMessage()">Send</button>

        <script>
            const ws = new WebSocket("ws://localhost:8000/ws");
            const chat = document.getElementById("chat");

            ws.onmessage = function(event) {
                chat.value += event.data + '\\n';
            };

            function sendMessage() {
                const message = document.getElementById("message").value;
                ws.send(message);
                document.getElementById("message").value = '';
            }
        </script>
    </body>
</html>
"""

@app.get("/")
async def get():
    return HTMLResponse(html)

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message received: {data}")

Step 2: Running Your FastAPI Application

Open your terminal and run the FastAPI application using Uvicorn, which is an ASGI server:

uvicorn main:app --reload

This command starts your FastAPI app on http://localhost:8000. You can access the chat interface by navigating to this URL in your web browser.

Step 3: Testing Your WebSocket Chat Application

  1. Open multiple browser tabs pointing to http://localhost:8000.
  2. Type messages in one tab and send them. You should see the messages appear in all connected tabs.

Integrating Go for Real-Time Functionality

While FastAPI handles WebSocket connections efficiently, integrating Go can enhance performance, especially for CPU-bound tasks. Below is a basic example of how to create a concurrent WebSocket server in Go.

Step 1: Setting Up a Go WebSocket Server

Create a new file named go_server.go with the following code:

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func main() {
    http.HandleFunc("/ws", handleConnections)
    fmt.Println("Go WebSocket server started on :8080")
    http.ListenAndServe(":8080", nil)
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()

    for {
        messageType, msg, err := conn.ReadMessage()
        if err != nil {
            fmt.Println(err)
            break
        }
        fmt.Printf("Received: %s\n", msg)
        if err := conn.WriteMessage(messageType, msg); err != nil {
            fmt.Println(err)
            break
        }
    }
}

Step 2: Running Your Go WebSocket Server

Run the Go server using the command:

go run go_server.go

This will start the server on http://localhost:8080. You can modify the FastAPI client to connect to this Go WebSocket server by changing the WebSocket URL in the JavaScript code.

Conclusion

Building real-time applications with Go and WebSocket in FastAPI offers a powerful combination for developers looking to create responsive and interactive web experiences. By leveraging FastAPI’s asynchronous capabilities alongside Go's concurrency, you can handle multiple connections efficiently while delivering real-time updates to your users.

Key Takeaways

  • FastAPI is ideal for building APIs with real-time capabilities.
  • WebSocket allows for persistent connections that facilitate real-time communication.
  • Integrating Go can enhance performance in CPU-bound tasks, making your applications more robust.

With these tools and techniques, you are now equipped to start building your own real-time applications. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.