Skip Navigation
Show nav
Heroku Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
View categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • コマンドライン
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリー
    • 継続的統合
  • 言語サポート
    • Node.js
    • Ruby
      • Bundler の使用
      • Rails のサポート
    • Python
      • Python でのバックグランドジョブ
      • Django の使用
    • Java
      • Maven の使用
      • Java でのデータベース操作
      • Spring Boot の使用
      • Java の高度なトピック
    • PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres Getting Started
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
    • Heroku Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
    • コンプライアンス
  • Heroku Enterprise
    • Private Space
      • インフラストラクチャネットワーキング
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
    • シングルサインオン (SSO)
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Integrating with Salesforce
  • アプリのパフォーマンス
  • Worker dyno、バックグラウンドジョブ、キューイング

Worker dyno、バックグラウンドジョブ、キューイング

日本語 — Switch to English

この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。

最終更新日 2022年01月27日(木)

Table of Contents

  • 使用事例
  • 操作の順序
  • 例
  • プロセスモデル
  • 実装

バックグラウンドジョブ​を使用して、低速なタスクや CPU 使用率の高いタスクを Web アプリのフロントエンドからオフロードすることで、Web アプリのスケーラビリティを大幅に改善できます。これによって、受信 Web リクエストをフロントエンドで迅速に処理できるようになり、リクエストがバックログに溜まってパフォーマンスの問題が発生する確率が下がります。

一般的な Web アプリでは、500 ミリ秒以内にほとんどのリクエストに応答することが理想的です。アプリの応答に 1 秒以上かかることが常態化している場合、バックグラウンドジョブを追加することでアプリのパフォーマンスが向上するかどうか調査することをお勧めします。

この記事では、アーキテクチャパターンとしてのバックグラウンドジョブの概要を説明し、さまざまなプログラミング言語とフレームワークでその概念を実装する例を示します。

使用事例

バックグラウンドジョブは、以下の種類のタスクで特に役立ちます。

  • 外部の API またはサービスとの通信 (Amazon S3 へのファイルのアップロードなど)
  • リソース消費の大きいデータ操作の実行 (画像やビデオの処理など)

操作の順序

バックグラウンドジョブを使用するリクエストの処理手順の概要は以下のとおりです。

  1. バックグラウンドジョブに適しているタスクの実行リクエストが、クライアントからアプリに送信されます。
  2. (Heroku では Web プロセス​と呼ばれる) アプリのフロントエンドがリクエストを受信します。このフロントエンドはタスクをジョブキュー​に追加し、すぐにクライアントに応答します。応答はリクエストの結果が保留中であることを示します。結果をポーリングするためにクライアントが使用できる URL が応答に含まれる場合もあります。
  3. タスクがジョブキューに追加されたことを、(Heroku ではワーカープロセス​と呼ばれる) 別のアプリプロセスが検知します。このプロセスはタスクをキューから取り出して、タスクの実行を開始します。
  4. ワーカープロセスは、タスクを完了したら、タスクの結果を保存します。たとえば、Amazon S3 にファイルをアップロードする場合、ファイルの S3 URL を永続化することがあります。
  5. クライアントは、タスクが完了して結果が得られるまで、定期的にアプリをポーリングします。

例

RSS リーダーアプリの例を考えます。このアプリが提供するフォームでは、読み取る新規 RSS フィールドの URL をユーザーが送信できます。しばらくして、フィードの内容を確認できるページにユーザーが誘導されます。

スケーラブルでないアプローチ

簡単な (ただしスケーラブルでない) 方法でこれを行うには、フォーム送信リクエストの処理と並行して​、サードパーティのサイトからフィードの内容を取得します。

遅延が最小限のインプロセス RSS フェッチ

外部ソースからデータをフェッチするためにかかる時間は、予測がきわめて困難です。数百ミリ秒で済む場合もあれば、数秒かかる場合もあります。フィードのサーバーがダウンしている場合、リクエストが 30 秒以上にわたってハングし、最終的にタイムアウトになる可能性もあります。

高レイテンシーのインプロセス RSS フェッチ

この間アプリのリソースを拘束すると、アプリが他のリクエストを処理できなくなる可能性があり、通常は、ユーザーエクスペリエンスの著しい低下という結果を招きます。この問題は負荷が低い間は顕在化しないこともありますが、アプリの同時ユーザーが複数になるとすぐ、応答時間が不安定になり、H12 やその他のエラーステータス​を返すリクエストも出てきます。これらはスケーラビリティの乏しさの指標です。

スケーラブルなアプローチ

より予測可能でスケーラブルなアーキテクチャにおいては、高レイテンシーまたは実行時間の長い作業は、Web レイヤーから隔てられたプロセスでバックグラウンド処理します。また、ユーザーのリクエストには、作業の進捗状況を示す何らかのインジケータを使用してすぐに応答します。

バックグラウンドに移行した RSS フェッチ

ここでは、Web プロセスとは別に実行され、Web リクエストを処理していない 1 つ以上のバックグラウンドサービスが、そのワークキューから項目を 1 つずつ読み取り、またその作業を非同期的に行います。完了すると、結果は Postgres、Redis、Memcached、または別の永続システムに保存されます。

シーケンス図から判断する限り、クライアント (HTTP) リクエストが以前よりも増加していることから、バックグラウンドのアプローチには何の利点もないように見えます。これは一見もっともらしい考えですが、実際の利点を見落としています。バックグラウンドに送られた作業を取得するためにブラウザで複数のリクエストを実行することが必要かもしれませんが、これらは非常に低レイテンシーで予測可能なリクエストであるという利点があります。実行時間の長いタスクの完了を待機したり、その間にハングしたりするユーザーリクエストを根絶できます。

実行時間の長い作業をバックグラウンドワーカーで処理することには、多くの利点があります。 Web dyno の拘束が回避され、Web dyno が他のリクエストにサービスを提供することを防ぎ、サイトの応答性を維持します。 サイトの負荷に応じてワーカープロセスを個別に監視、制御、スケーリングできるようになりました。現在の作業の進捗状況を知らせるのみであっても、すべてのリクエストに対してすぐに応答が得られれば、ユーザーエクスペリエンスは大幅に改善されます。

プロセスモデル

Heroku では、アプリケーション固有のプロセスモデル​を開発者が指定できます。このモデルには、ワークキューからジョブを取得して処理するバックグラウンドワーカーが含まれることがあります。 次に示すのは、Web プロセスタイプと、バックグラウンドジョブを処理するためのプロセスタイプの両方を備える Clojure アプリケーションの Procfile の例です。

必要であれば、ワーカープロセスタイプには worker​ 以外の名前を付けることができます。web​ プロセスタイプとは異なり、Heroku では worker​ には特に重要ではありません。

web:    lein run -m myapp.web
worker: lein run -m myapp.worker

Web dyno の数は、Worker dyno の数とは無関係にスケーリングできます。

$ heroku ps:scale web=1 worker=5

実装

バックグラウンド自体は単なる概念です。バックグラウンドジョブをアプリケーションで実装するために利用できる、多くのライブラリとサービスがあります。一般的なツールとしては、データベースを基盤にしたジョブフレームワークやメッセージキューがあります。

さまざまな言語でのバックグラウンドワーカー実装の具体的な例には、以下のものがあります。

​言語/フレームワーク ​チュートリアル
​Ruby/Rails
  • ​Sidekiq Getting Started​ (Sidekiq 入門) (GitHub)
​Node.js
  • ​Background Jobs in Node.js with Redis​ (Node.js での Redis を使用したバックグラウンドジョブ)
​Python
  • ​Background Tasks in Python w/ RQ​ (Python での RQ を使用したバックグラウンドタスク)
​Java
  • ​Asynchronous Workers in Java with RabbitMQ​ (Java での RabbitMQ を使用した非同期ワーカー)
​Go
  • ​Background Jobs with Que-Go​ (Que-Go を使用したバックグラウンドジョブ)
​Clojure
  • ​Queuing in Clojure with Langohr and RabbitMQ​ (Clojure での Langohr と RabbitMQ を使用したキューイング)

関連カテゴリー

  • アプリのパフォーマンス
定期的なジョブとカスタムクロックプロセス 定期的なジョブとカスタムクロックプロセス

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Podcasts
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing

Subscribe to our monthly newsletter

Your email address:

  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Heroku Podcasts
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Facebook
  • Instagram
  • Github
  • LinkedIn
  • YouTube
Heroku is acompany

 © Salesforce.com

  • heroku.com
  • Terms of Service
  • Privacy
  • Cookies
  • Cookie Preferences