Webシステムを開発するとき、
「他の人が更新した内容をすぐ画面へ反映したい」
「チャット機能を作りたい」
「通知をリアルタイムで表示したい」
「ダッシュボードを自動更新したい」
といった要件が出てくることがあります。
そのとき候補になる技術の一つがWebSocketです。
WebSocketを利用すると、ブラウザとサーバーの接続を維持し、サーバー側からクライアントへデータを送信できます。
例えば、
担当者Aが案件を更新
↓
サーバーで更新完了
↓
担当者Bの画面へ更新イベントを送信
↓
一覧画面を自動更新
という仕組みを作れます。
しかし、リアルタイム更新が必要だからといって、すべての機能へWebSocketを導入する必要はありません。
例えば、
「1分以内に更新されれば問題ない」
という業務であれば、一定間隔でデータを取得するポーリングでも十分な場合があります。
WebSocketを導入すると、
- 接続管理
- 再接続
- 認証・権限
- サーバー負荷
- スケールアウト
- エラー処理
など考慮すべき項目も増えます。
そのため重要なのは、
リアルタイム更新ができるかではなく、何秒以内に情報が反映される必要があるのか
を整理することです。
この記事では、WebSocketによるリアルタイム更新が向いている機能、ポーリングやSSEとの違い、業務システムへ導入するときの判断基準と設計ポイントを解説します。
WebSocketとは
WebSocketとは、ブラウザとサーバー間で双方向通信を行うための仕組みです。
一般的なWeb APIでは、
ブラウザ
↓ リクエスト
サーバー
↓ レスポンス
ブラウザ
という形で、基本的にはブラウザ側から通信を開始します。
一方、WebSocketでは接続を維持するため、
ブラウザ
↕
サーバー
のように双方向でデータを送受信できます。
そのため、サーバー側で何か起きたときに、
新しいデータがあります
とブラウザへ通知できます。
これを利用してリアルタイム更新を実現します。
WebSocketでできるリアルタイム更新の例
例えば案件管理システムを3人で利用しているとします。
担当者Aが、
案件A
ステータス:対応中
を、
案件A
ステータス:完了
へ変更したとします。
通常のWeb画面では、担当者Bがページを更新しなければ変更に気付けない場合があります。
WebSocketを利用すると、
担当者Aが更新
↓
サーバーへ保存
↓
WebSocketで更新イベント送信
↓
担当者Bのブラウザが受信
↓
一覧画面を更新
という動作にできます。
画面をリロードしなくても最新情報が表示されるのが特徴です。
WebSocketが向いている機能
リアルタイム性が重要な機能ではWebSocketが有力な選択肢になります。
1.チャット
代表的な利用例です。
例えば、
ユーザーA
「確認しました」
と送信すると、
ユーザーBの画面へすぐ表示
する必要があります。
数十秒後に表示されるチャットでは使いにくいため、高いリアルタイム性が求められます。
2.リアルタイム通知
例えば、
新しい問い合わせ
↓
担当者へ通知
承認依頼
↓
承認者へ通知
という機能です。
画面を開いている利用者へ即座に知らせたい場合、WebSocketを利用できます。
3.複数人で同時利用する管理画面
例えば、
- 問い合わせ管理
- 案件管理
- 受付管理
- 在庫管理
- 配車管理
などです。
複数人が同じデータを更新する場合、
他の人が変更した内容をすぐ表示したい
という要件があります。
4.リアルタイムダッシュボード
例えば、
本日の注文:125件
現在対応中:12件
未対応問い合わせ:5件
という管理画面です。
データが頻繁に変わる場合、自動更新によって最新状況を確認できます。
5.在庫状況
複数拠点や複数担当者が同時に在庫を操作する場合、
在庫10個
↓
担当者Aが2個出庫
↓
在庫8個
↓
他の画面にも反映
という仕組みが考えられます。
ただし、在庫の正確性そのものはWebSocketだけで保証するものではありません。
データベース更新や排他制御なども別途必要です。
6.予約・座席状況
例えば予約システムで、
残り1席
↓
ユーザーAが予約
↓
満席
となった場合です。
他の利用者の画面にも満席状態を反映できます。
ただし、WebSocketによる表示更新と、二重予約を防ぐサーバー側の処理は別問題です。
7.処理進捗の表示
例えば大量ファイルを処理するシステムで、
処理開始
↓
20%
↓
50%
↓
80%
↓
完了
という進捗をリアルタイム表示する場合です。
帳票生成、AI処理、動画変換、データ取込などで利用できます。
8.オンライン状態の表示
例えば、
田中:オンライン
佐藤:オフライン
という表示です。
チャット・コールセンター・共同作業システムなどで利用されます。
WebSocketが不要なケースも多い
WebSocketは便利ですが、すべての業務システムで必要ではありません。
例えば、
- 顧客マスタ管理
- 社員名簿
- 契約書管理
- 月次レポート
- マニュアル管理
など、数秒単位の更新が必要ないシステムでは過剰になる場合があります。
例えば顧客情報が、
10:00に変更
↓
10:01に他ユーザーへ反映
でも業務上問題がないのであれば、WebSocketを使わなくても十分な可能性があります。
リアルタイム更新を判断するときは「何秒まで許容できるか」を考える
WebSocket導入判断で重要なのは、
リアルタイムにしたい
という曖昧な要求を、そのまま要件にしないことです。
例えば、
チャット
1秒以内。
問い合わせ一覧
5〜10秒程度でも問題ない。
経営ダッシュボード
1〜5分でも問題ない。
月次集計
画面再表示時に最新なら問題ない。
など、業務によって必要な更新速度は異なります。
まず、
情報が何秒遅れたら業務上困るのか
を確認します。
WebSocket・ポーリング・SSEの違い
リアルタイム更新にはWebSocket以外の方法もあります。
代表的なのが、
- ポーリング
- SSE
- WebSocket
です。
ポーリングとは
ブラウザ側から定期的にサーバーへ問い合わせる方式です。
例えば、
5秒ごとに、
新しいデータがありますか?
とAPIへアクセスします。
イメージは、
ブラウザ
↓
5秒後
↓
API取得
↓
5秒後
↓
API取得
です。
メリット
- 実装が比較的シンプル
- 通常のHTTP APIを利用できる
- 接続管理が複雑になりにくい
デメリット
データが変わっていなくても定期的にAPIへアクセスします。
例えば利用者1,000人が5秒ごとにAPIへアクセスすると、リクエスト数が増えます。
SSEとは
SSEはServer-Sent Eventsの略で、サーバーからブラウザへ継続的にデータを送る方法です。
基本的には、
サーバー
↓
ブラウザ
という一方向通信です。
例えば、
- 通知
- AI生成結果のストリーミング
- 処理進捗
- 更新イベント
など、主にサーバーからクライアントへ情報を送りたい場合に利用できます。
WebSocket
WebSocketは双方向通信です。
ブラウザ
↕
サーバー
の両方向で継続的にメッセージをやり取りできます。
例えばチャットなら、
ユーザーA送信
↓
サーバー
↓
ユーザーB
という通信を頻繁に行うため向いています。
WebSocket・SSE・ポーリングの比較
| 方法 | 通信 | 実装難易度 | リアルタイム性 | 主な用途 |
|---|---|---|---|---|
| 通常API | 必要時のみ | 低い | 低い | 一般的なCRUD |
| ポーリング | 定期取得 | 低〜中 | 中 | 一覧更新 |
| SSE | サーバー→クライアント | 中 | 高い | 通知・進捗 |
| WebSocket | 双方向 | 中〜高 | 高い | チャット・共同操作 |
WebSocketを使うかどうかは、
双方向通信が本当に必要なのか
という点から判断できます。
「リアルタイム更新=WebSocket」ではない
よくある誤解が、
リアルタイムにしたいからWebSocket
とすぐ決めることです。
例えば、
AI処理の結果を少しずつ画面へ表示する
だけであれば、サーバーからクライアントへの一方向通信で十分な場合があります。
また、
30秒に一度一覧を更新すれば十分
ならポーリングでも問題ありません。
つまり、
必要なリアルタイム性から通信方式を選ぶ
ことが重要です。
WebSocket導入を判断する5つの質問
リアルタイム更新を検討するときは、次の質問を整理すると判断しやすくなります。
1.数秒遅れると業務上困るか
困らないならポーリングでも十分な可能性があります。
2.サーバーから即座に通知する必要があるか
必要ならSSEやWebSocketを検討します。
3.双方向で頻繁に通信するか
チャットなど双方向通信が多いならWebSocketが向いています。
4.同時接続ユーザーはどのくらいか
100人なのか、10万人なのかでインフラ設計が変わります。
5.接続管理の複雑さを許容できるか
リアルタイム性によるメリットが、開発・運用コストを上回るか確認します。
WebSocketを業務システムへ導入する基本構成
例えば案件管理システムなら、
ブラウザA
↓
API
↓
データベース更新
↓
更新イベント発行
↓
WebSocketサーバー
↓
ブラウザB・Cへ通知
という構成です。
ブラウザ側はイベントを受信すると、
案件一覧を再取得
または、
受信データを画面へ直接反映
します。
更新イベントを受けたらAPIを再取得する方法
比較的シンプルなのは、
WebSocket
↓
「案件123が更新された」
というイベントだけ送る方法です。
その後ブラウザが、
GET /projects/123
などで最新情報を取得します。
メリットは、
WebSocketで送るデータを最小限にできること
です。
既存APIも再利用できます。
更新内容そのものをWebSocketで送る方法
例えば、
{
“type”: “PROJECT_UPDATED”,
“projectId”: 123,
“status”: “completed”
}
のような更新データを送信し、そのまま画面へ反映する方法もあります。
通信量を減らせますが、
- データ整合性
- キャッシュ
- 更新順序
- 権限
などをより慎重に考える必要があります。
WebSocketで重要な「接続切れ」
WebSocketは接続を維持する仕組みですが、接続は永遠に続くわけではありません。
例えば、
- Wi-Fi切断
- スマートフォンの通信切替
- PCのスリープ
- サーバー再起動
- ネットワークエラー
などで切断されます。
そのため、
接続
↓
切断
↓
再接続
という処理を考える必要があります。
再接続時に最新データを取得する
例えば、
10:00 WebSocket切断
↓
10:01 他ユーザーが案件更新
↓
10:02 再接続
となった場合です。
切断中の更新を受信できていない可能性があります。
そのため再接続時には、
現在の最新状態をAPIから取得する
処理を入れる方法があります。
WebSocketイベントだけを唯一のデータ源にしないことが重要です。
WebSocketはデータベースではない
WebSocketはデータをリアルタイムで伝える通信手段です。
正式なデータは、
- PostgreSQL
- MySQL
- その他のデータベース
などへ保存します。
例えば、
案件更新
↓
DB保存
↓
成功
↓
WebSocket通知
という順番です。
先にWebSocket通知して、その後DB保存に失敗すると、
画面では更新されたように見える
のに、
実際には保存されていない
という状態になりかねません。
リアルタイム更新でもDB側の排他制御は必要
例えば在庫が1個残っているとします。
ユーザーA
→ 購入
ユーザーB
→ 同時に購入
した場合、
WebSocketで在庫表示をリアルタイム更新していても、二重購入を自動的に防げるわけではありません。
必要なのは、
- トランザクション
- ロック
- 条件付き更新
- 一意制約
など、データベース側の整合性設計です。
WebSocketはあくまで、
変更を素早く他ユーザーへ伝える仕組み
です。
WebSocketの認証をどう考える?
WebSocketでも通常のWebシステムと同様に、
誰が接続しているのか
を確認する必要があります。
例えば、
一般ユーザー
→ 自分の所属組織のイベントのみ
管理者
→ 全体イベント
という制御です。
接続できた人へすべての更新イベントを配信してはいけません。
WebSocketでも権限管理が必要
例えば顧客管理システムで、
営業部A
と、
営業部B
が存在するとします。
営業部Aの顧客更新イベントを、営業部Bのユーザーへ配信する必要はありません。
そのため、
- organization_id
- user_id
- role
- room
- channel
などを利用して配信対象を制御します。
Room・Channelという考え方
WebSocketライブラリやサービスによって名称は異なりますが、
特定ユーザーだけが参加するグループ
を作ることがあります。
例えば、
organization:123
というルームに、
会社123の利用者
だけ参加させます。
案件123の画面なら、
project:123
というルームを作る方法もあります。
すると、
案件123更新
↓
project:123へ配信
とできます。
マルチテナントSaaSでは配信先分離が重要
BtoB SaaSでは、
企業A
企業B
企業C
が同じシステムを利用することがあります。
WebSocketでも、
企業Aの情報
↓
企業Aユーザーのみ
へ配信する必要があります。
API側では適切に権限制御していても、WebSocketイベントで他社データを送ってしまえば情報漏えいになります。
そのため、
通常APIと同じレベルで認可を設計すること
が重要です。
WebSocketで大量接続を扱う場合の注意点
WebSocketでは、利用者がシステムを開いている間、接続を維持します。
例えば、
同時利用者10人
→ 10接続
同時利用者10,000人
→ 10,000接続
というイメージです。
そのため、大規模サービスでは、
- 同時接続数
- メモリ
- CPU
- ネットワーク
- ロードバランサー
- スケールアウト
などを考える必要があります。
小規模な業務システムでは問題にならないこともありますが、将来の利用人数を確認します。
サーバーを複数台にすると設計が変わる
例えば、
WebSocketサーバーA
WebSocketサーバーB
へユーザーが分散している場合です。
ユーザーA
→ サーバーA
ユーザーB
→ サーバーB
となっていると、サーバーAだけでイベントを発行してもユーザーBへ届かない可能性があります。
そこで、
- Redis Pub/Sub
- メッセージブローカー
- マネージドリアルタイムサービス
などを利用し、複数サーバー間でイベントを共有する構成を検討します。
WebSocketを自前運用する必要はない
リアルタイム通信が必要だからといって、
WebSocketサーバーをゼロから構築
する必要はありません。
利用するクラウドやサービスによっては、
- リアルタイムデータベース
- Pub/Sub
- WebSocket管理サービス
- リアルタイム通信サービス
などを利用できます。
小規模な開発では、インフラ運用まで含めて比較することが重要です。
WebSocket導入の具体例|問い合わせ管理
例えば複数人で問い合わせ対応を行います。
現在:
担当者Aが問い合わせを担当
↓
担当者Bの画面には未対応のまま
↓
ページ更新
↓
対応中へ変わる
リアルタイム化すると、
担当者Aが担当開始
↓
DB更新
↓
WebSocketイベント
↓
担当者Bの画面も「対応中」
となります。
これにより二重対応を減らせる可能性があります。
WebSocket導入の具体例|在庫管理
複数担当者が同時に入出庫を登録する場合です。
担当者A
→ 商品Aを10個出庫
↓
在庫更新
↓
WebSocket
↓
他担当者の在庫一覧更新
とします。
ただし先ほど説明した通り、在庫数の整合性はDB側で保証します。
WebSocket導入の具体例|管理ダッシュボード
例えばコールセンターで、
待機問い合わせ:12件
対応中:8件
完了:120件
という状況を表示するとします。
問い合わせ状況が変わるたびに更新イベントを送れば、管理者がページを更新しなくても状況を確認できます。
WebSocket導入の具体例|AI処理
AIによる長時間処理では、
処理開始
↓
データ抽出中
↓
AI処理中
↓
結果保存中
↓
完了
と進捗を表示したい場合があります。
双方向通信が必要でなければSSEなどでも実現できます。
そのためAI処理だから必ずWebSocketというわけではありません。
WebSocket導入の具体例|チャット
チャットではWebSocketが特に向いています。
ユーザーA
↓ メッセージ
サーバー
↓
ユーザーB
という通信を何度も繰り返します。
さらに、
- 既読
- 入力中
- オンライン状態
- 新着メッセージ
などもリアルタイム化できます。
このような機能では双方向通信のメリットが大きくなります。
【コピペ用】WebSocket導入判断シート
対象機能
機能名:
利用人数:
同時利用人数:
リアルタイム要件
更新許容時間:
1秒以内:
5秒以内:
30秒以内:
1分以内:
手動更新でも可:
通信
サーバー→ブラウザ:
ブラウザ→サーバー:
双方向通信:
更新頻度
1秒あたり:
1分あたり:
1時間あたり:
候補
通常API:
ポーリング:
SSE:
WebSocket:
データ
更新対象:
対象ID:
organization_id:
user_id:
接続管理
再接続:
接続切れ:
最新データ再取得:
権限
ユーザー単位:
部署単位:
組織単位:
管理者:
インフラ
同時接続数:
サーバー台数:
Pub/Sub:
外部サービス:
WebSocketを実装するときのデータ例
例えばイベントを次のように設計します。
type: PROJECT_UPDATED
projectId: 123
organizationId: 10
updatedAt: 2026-07-30T10:00:00
クライアントは、
PROJECT_UPDATED
を受信したら、
projectId = 123
のデータを再取得します。
イベント名を整理しておくと管理しやすくなります。
例えば、
PROJECT_CREATED
PROJECT_UPDATED
PROJECT_DELETED
MESSAGE_CREATED
NOTIFICATION_CREATED
などです。
イベント名を画面単位で作りすぎない
例えば、
PROJECT_LIST_REFRESH
PROJECT_DETAIL_REFRESH
DASHBOARD_PROJECT_REFRESH
のように画面ごとのイベントを大量に作ると、画面追加のたびにイベントが増えます。
それより、
PROJECT_UPDATED
という業務イベントを発行し、それぞれの画面が必要に応じて反応する設計の方が再利用しやすくなります。
リアルタイム更新でもキャッシュ戦略を考える
React Queryなどのデータ取得ライブラリを利用している場合、
WebSocketイベント受信
↓
対象Queryをinvalidate
↓
API再取得
という構成にできます。
リアルタイム通信とキャッシュ管理を分離できるため、比較的整理しやすい設計です。
WebSocketから直接すべての画面状態を書き換える必要はありません。
WebSocketでよくある失敗
失敗1|リアルタイムという理由だけで導入する
数十秒遅れても問題ない業務なら、ポーリングで十分な場合があります。
必要な更新速度から判断します。
失敗2|WebSocketを正式データとして扱う
イベントを受信できなかった場合にデータがずれます。
正式データはDBに保存します。
失敗3|再接続を考えていない
ネットワーク切断は必ず起こる前提で設計します。
失敗4|切断中の更新を考えていない
再接続時に最新データを取得します。
失敗5|権限管理をしていない
接続ユーザー全員へすべてのイベントを配信しないようにします。
失敗6|他社データを配信してしまう
マルチテナントではorganization単位などで配信を分離します。
失敗7|WebSocketだけで在庫競合を防ごうとする
データ整合性はデータベース側でも保証します。
失敗8|サーバー複数台を考えていない
スケールアウト時にはサーバー間のイベント共有が必要になる場合があります。
失敗9|イベントを細かく作りすぎる
業務上のイベント単位で整理します。
失敗10|リアルタイム更新が多すぎて画面が落ち着かない
データが頻繁に変化すると、利用者が操作しにくくなる場合があります。
必要に応じて更新頻度をまとめることも検討します。
リアルタイム更新では画面UXも重要
技術的にリアルタイム更新できても、画面が突然変わると利用者が困ることがあります。
例えばユーザーが一覧を読んでいる途中に、
行の順番が突然変更
すると操作しにくくなります。
そのため、
「新しいデータがあります。更新」
と表示して、ユーザー操作で反映する設計もあります。
リアルタイム通信を使うことと、
画面を即座に書き換えること
は別です。
編集中データの競合も考える
例えば、
ユーザーA
→ 顧客情報編集
同時に、
ユーザーB
→ 同じ顧客情報編集
した場合です。
Aが保存
↓
Bが古い内容で保存
↓
Aの変更が上書き
される可能性があります。
WebSocketで、
「他のユーザーがこのデータを編集中です」
と表示する方法もあります。
ただし、本質的な競合対策として、
- version番号
- updated_at
- 楽観ロック
などを利用する方法も検討します。
WebSocket導入前に考えたいコスト
リアルタイム更新には利用者体験を改善できるメリットがあります。
一方で、
- 開発
- テスト
- インフラ
- 監視
- 障害対応
のコストも増えます。
例えば通常APIなら、
リクエスト
↓
レスポンス
だけを確認すればよいケースでも、WebSocketでは、
- 接続
- 切断
- 再接続
- イベント
- 重複
- 順序
- 権限
までテストする必要があります。
そのため、
リアルタイム化による業務改善効果が、複雑性に見合うか
を判断します。
WebSocketに関するよくある質問
リアルタイム更新には必ずWebSocketが必要ですか?
必要ありません。
数秒〜数十秒ごとの更新でよければポーリング、サーバーからの一方向通知ならSSEなども候補になります。
WebSocketとポーリングはどちらがよいですか?
更新頻度とリアルタイム性によります。
利用人数が少なく、10〜30秒間隔の更新で問題ないなら、ポーリングの方がシンプルな場合があります。
WebSocketとSSEはどう違いますか?
WebSocketは双方向通信、SSEは主にサーバーからブラウザへの一方向通信です。
チャットのような双方向通信ならWebSocket、進捗通知などサーバーから送るだけならSSEも検討できます。
WebSocketを使うと在庫の二重更新を防げますか?
WebSocketだけでは防げません。
在庫更新時の競合はデータベースのトランザクションなどで管理し、WebSocketは更新結果の通知に利用します。
WebSocketで通知機能を作れますか?
可能です。
システムを開いているユーザーへ新着通知をリアルタイム表示できます。
ただしログアウト中のユーザーにはメールやプッシュ通知など別の方法も検討します。
WebSocket接続が切れたらどうなりますか?
クライアント側で再接続処理を実装します。
また、切断中に更新を取り逃している可能性があるため、再接続時に最新データを取得する設計が重要です。
小規模な業務システムでもWebSocketを使えますか?
利用できます。
ただし、業務上リアルタイム性が必要かを先に判断します。
実装可能であることと、導入する価値があることは別です。
hiro-dev-labではリアルタイム機能を含むシステム設計から相談できます
hiro-dev-labでは、WebSocketを実装すること自体ではなく、本当にリアルタイム更新が必要なのかを整理する段階から相談できます。
例えば、
- 現在の業務フロー整理
- リアルタイム更新が必要な機能の整理
- WebSocket導入判断
- ポーリングとの比較
- SSEとの比較
- チャット機能
- リアルタイム通知
- ダッシュボード更新
- 在庫・予約状況更新
- 処理進捗表示
- 権限を考慮したイベント配信
- マルチテナント設計
- 再接続・エラー処理
- 要求整理
- 業務要件・機能要件整理
- Webシステム設計・開発
などです。
例えば、
他の担当者が更新した内容をすぐ画面へ反映したい
問い合わせの二重対応を防ぎたい
チャット機能をWebシステムへ追加したい
WebSocketとポーリングのどちらがよいか分からない
という場合でも、
業務 → 必要な更新速度 → 通信方向 → 利用人数 → 実装方法
の順番で整理できます。
まとめ|WebSocketは「リアルタイムにできるか」ではなく「リアルタイムである必要があるか」で判断する
WebSocketを利用すると、
- チャット
- リアルタイム通知
- 在庫更新
- 予約状況
- ダッシュボード
- 共同作業
などをリアルタイムに更新できます。
しかし、
「画面をリアルタイムにしたい」
というだけで導入する必要はありません。
まず、
- 何のデータを更新するのか
- 他ユーザーへ何秒以内に反映する必要があるのか
- サーバーから通知する必要があるのか
- 双方向通信が必要なのか
- 同時利用者は何人か
- 接続切れ・再接続をどう扱うか
- 誰へイベントを配信するのか
を整理します。
例えば、
チャット
→ WebSocket
処理進捗
→ SSEも候補
一覧を30秒ごとに更新
→ ポーリング
画面を開き直したときだけ最新でよい
→ 通常API
というように使い分けられます。
WebSocketを導入した場合も、
DB更新
↓
更新成功
↓
イベント発行
↓
他ユーザーへ通知
という流れを基本にし、WebSocketそのものを正式データとして扱わないことが重要です。
また、
- 再接続
- 権限管理
- マルチテナント
- 同時接続
- データ競合
まで考える必要があります。
リアルタイム通信は便利ですが、その分システムは複雑になります。
そのため、
「WebSocketを使えるから使う」のではなく、「数秒の情報遅延が業務上の問題になるから使う」
という判断が重要です。
「リアルタイム更新を入れるべきか迷っている」
「WebSocketとポーリングのどちらが適しているか分からない」
という場合は、まず対象機能について「何秒までの遅延なら業務上許容できるか」を整理するところから始めてみてください。