Elixir & Phoenix: Scalable Backend Development · レッスン

Phoenix Channels入門

Phoenix Channelsのアーキテクチャ、WebSocketの利用方法、リアルタイムアプリケーションにおける役割を理解します。

レッスン 1/411 ステップ

「Phoenix Channels入門」はCoddyKit上の無料Elixir & Phoenix: Scalable Backend Developmentレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはElixir & Phoenix: Scalable Backend Development学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Elixir & Phoenix: Scalable Backend Developmentコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Real-time with Phoenix Channels

Welcome to Phoenix Channels! In this lesson, we'll explore how Elixir and Phoenix enable real-time communication in web applications.

Think of real-time as instant updates: chat messages appearing immediately, live data feeds, or collaborative editing. Channels are Phoenix's elegant solution for building these dynamic features.

The HTTP Challenge

Traditional web applications rely on HTTP (Hypertext Transfer Protocol). HTTP is great for requesting web pages or sending form data, but it has limitations for real-time:

  • Stateless: Each request is independent.
  • Client-initiated: The client always asks the server for data.
  • Polling: To get 'real-time' updates, clients often have to repeatedly ask the server, which is inefficient.

We need a different approach for true instant communication.

Introducing WebSockets

WebSockets are the underlying technology that makes real-time communication efficient. Unlike HTTP, WebSockets provide a persistent, two-way communication channel between a client and a server.

  • Full-duplex: Both client and server can send messages independently at any time.
  • Persistent: Once established, the connection stays open.
  • Lower overhead: Less data sent per message compared to HTTP requests.

This allows for instant, continuous data exchange.

Channels: Elixir's Real-time Layer

Phoenix Channels provide a robust, Elixir-friendly abstraction over raw WebSockets. They integrate seamlessly with the Phoenix framework and leverage Elixir's concurrency model (OTP).

Channels allow you to:

  • Define logical communication rooms (topics).
  • Handle incoming and outgoing messages (events).
  • Manage client connections and authorization.

They simplify building complex real-time features.

Topics and Events Explained

Two core concepts in Phoenix Channels are Topics and Events:

  • Topic: A named channel or 'room' that clients can subscribe to. For example, "room:lobby" or "user:123". Clients only receive messages for topics they've joined.
  • Event: A specific message type sent within a topic. For example, a "new_message" event in a chat room, or a "user_joined" event.

This structure helps organize and route real-time data effectively.

The UserSocket Entry Point

Every Phoenix application with Channels has a UserSocket module. This module acts as the initial gateway for all WebSocket connections.

It's where you define:

  • How clients connect (e.g., authentication).
  • Which topics clients are allowed to join.

Here's a simplified example of UserSocket:

defmodule MyAppWeb.UserSocket do
  use Phoenix.Socket

  ## Channels
  channel "room:*", MyAppWeb.RoomChannel
  channel "user:*", MyAppWeb.UserChannel

  ## Transports
  transport :websocket, Phoenix.Transports.WebSocket
  # transport :longpoll, Phoenix.Transports.LongPoll

  def connect(_params, socket) do
    # Authenticate and assign user to socket
    # For now, let's just allow all connections
    {:ok, socket}
  end

  def id(_socket), do: nil
end

Defining a Channel Module

After connecting via UserSocket, clients can join specific channels. Each channel is defined by its own module, like RoomChannel or UserChannel.

This module handles:

  • The logic for joining a topic.
  • Processing messages sent to that topic.
  • Broadcasting messages to all subscribers of the topic.

Here's a basic RoomChannel definition:

defmodule MyAppWeb.RoomChannel do
  use Phoenix.Channel

  # Handles when a client tries to join a topic
  def join("room:lobby", _params, socket) do
    # You can add authorization logic here
    # For now, let's allow everyone to join the lobby
    {:ok, socket}
  end

  def join("room:private", _params, _socket) do
    # This topic might require authentication
    {:error, %{reason: "unauthorized"}}
  end

  # Handles incoming messages (events) from the client
  def handle_in("new_msg", %{"body" => body}, socket) do
    # Process the message and broadcast it
    broadcast! socket, "new_msg", %{body: body, sender: "guest"}
    {:noreply, socket}
  end
end

Client-side Connection

Clients (like a web browser) use a JavaScript library to connect to Phoenix Channels. They first establish a WebSocket connection and then join specific topics.

This example shows how a JavaScript client would connect to the "room:lobby" topic:

import { Socket } from "phoenix";

let socket = new Socket("/socket", {params: {token: window.userToken}});
socket.connect();

// Now join a specific channel/topic
let channel = socket.channel("room:lobby", {});

channel.on("new_msg", payload => {
  console.log("NEW MESSAGE:", payload.body);
});

channel.join()
  .receive("ok", resp => { console.log("Joined successfully", resp); })
  .receive("error", resp => { console.log("Unable to join", resp); });

// Send a message to the channel
// channel.push("new_msg", {body: "Hello from client!"});

Channel Lifecycle: Connect & Join

It's important to understand the two main stages of a Channel connection:

  • connect/2 in UserSocket: This function is called once when the initial WebSocket connection is established. It's for global authorization (e.g., is this user allowed to use WebSockets at all?).
  • join/3 in a Channel Module: This function is called whenever a client attempts to subscribe to a specific topic (e.g., "room:lobby"). It's for topic-specific authorization.

Think of connect as entering the building, and join as entering a specific room within that building.

Quick Check: Channel Roles

Phoenix Channels use two primary modules to manage real-time communication. Which of the following statements correctly describe the roles of UserSocket and a specific Channel module (e.g., RoomChannel)?

Recap: Channels Unveiled

Great job! In this lesson, you've gained a foundational understanding of Phoenix Channels:

  • We saw how WebSockets overcome HTTP's limitations for real-time.
  • You learned that Phoenix Channels provide an Elixir abstraction for WebSockets.
  • We explored key concepts like Topics and Events.
  • You understood the roles of UserSocket for initial connection handling and specific Channel modules for topic-based communication.

Next, we'll dive deeper into broadcasting messages and handling events!

無料で開始

AI チューターと学ぶ Elixir — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
12
レッスン
48

よくある質問

「Phoenix Channels入門」レッスンは無料ですか?

はい。「Phoenix Channels入門」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Elixir & Phoenix: Scalable Backend Developmentコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Elixir & Phoenix: Scalable Backend Developmentコースには全4レッスンが含まれています。

「Phoenix Channels入門」で何を学びますか?

Phoenix Channelsのアーキテクチャ、WebSocketの利用方法、リアルタイムアプリケーションにおける役割を理解します。 ブラウザで直接実行するハンズオンコードでElixir & Phoenix: Scalable Backend Developmentを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Elixir & Phoenix: Scalable Backend Developmentを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのElixir & Phoenix: Scalable Backend Developmentは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Phoenix Channels入門」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このElixir & Phoenix: Scalable Backend Developmentレッスンでコードを書いて実行できますか?

はい。すべてのElixir & Phoenix: Scalable Backend Developmentレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Phoenix Channels入門
  2. ブロードキャストとPub/Subメッセージング
  3. Presenceとライブデータ更新
  4. Channelの認証と認可
← Elixir & Phoenix: Scalable Backend Developmentに戻る