問題タブ [job-queue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - DB テーブルをジョブ キュー (別名バッチ キューまたはメッセージ キュー) として使用する最良の方法
〜50K行のデータベーステーブルがあり、各行は実行する必要があるジョブを表しています。DBからジョブを抽出し、ジョブを実行して結果をdbに戻すプログラムがあります。(このシステムは現在稼働中です)
ここで、複数の処理タスクがジョブを実行できるようにしたいのですが、タスクが 2 回実行されないようにします (これが他の問題を引き起こすのではないというパフォーマンス上の懸念から)。アクセスはストアド プロシージャを介して行われるため、私の現在の方法は、ストアド プロシージャを次のようなものに置き換えることです。
ところで; ワーカーのタスクは、ジョブの取得と結果の送信の間の接続を切断する可能性があります。また、その部分を台無しにしない限り、DBがボトルネックに近づくことさえないと思います(1分あたり〜5ジョブ)
これに問題はありますか?これを行うより良い方法はありますか?
注: 「IPC アンチパターンとしてのデータベース」は、ここでは少しだけ適切です。
- 私はIPCを行っていません(行を生成するプロセスはありません。現在、それらはすべてすでに存在しています)
- そのアンチパターンについて説明されている主な不満は、プロセスがメッセージを待機するときにDBに不要な負荷がかかることです(私の場合、メッセージがない場合、すべてが完了するとすべてがシャットダウンする可能性があります)
mysql - mysql でメッセージング キュー テーブルを実装する最良の方法は何ですか?
このようなものを実装するのはおそらく 10 回目ですが、思いついたソリューションに 100% 満足したことはありません。
「適切な」メッセージング システムの代わりに mysql テーブルを使用することが魅力的である主な理由は、ほとんどのアプリケーションがすでに他のものに何らかのリレーショナル データベースを使用しているからです (これは、私が行ってきたほとんどの作業で mysql を使用する傾向があります)。メッセージング システムを使用します。また、リレーショナル データベースには非常に強力な ACID プロパティがありますが、メッセージング システムにはありません。
最初のアイデアは、次を使用することです。
そして、エンキューは次のようになります。
デキューは次のようになります。
テーブルとエンキューは見栄えがしますが、デキューはちょっと気になります。ロールバックする可能性はどれくらいですか?それともブロックされる?O(1)風にするにはどのキーを使用すればよいですか?
または、私がやっていることよりも良い解決策はありますか?
sharding - ジョブキューイングとデータベースシャーディングに関する優れたリンク/記事はありますか?
誰かが、ジョブキューイングを使用してWebアプリをスケーリングする方法/時期/理由に関する優れたリンクを持っていますか?また、データベースシャーディングに関する記事も役に立ちます:)
grails - Grailsアプリで長時間実行されるジョブのキューを作成するための最良の方法は何ですか?
私はGrailsアプリを持っており、実行時間は最大5分(おそらくそれ以上)で、計算量の多い最適化が行われています。現在、メインのリクエストスレッドでこれらを行っています。つまり、リクエストが戻るまでに5分かかります。それは機能しますが、もちろん使いやすさの観点からは恐ろしいものです。
では、これを非同期的に実装するための最良の方法は何でしょうか?ThreadPoolExecutorが関与する必要があると思いますが、どのように開始してアクセスするのですか?Grailsサービスとしてモデル化できますか?またはジョブ(ただし、これらは定期的なジョブのみを対象としているようです)?
また、仕事のステータスを処理するための最良の方法は何ですか?フラグを介して、またはおそらくDB内のまったく新しいクラスを介して?ブラウザにスピナーを表示し、ステータスが変わるまでポーリングを続けますか?
python - Pythonのジョブキューの実装
Python用の分散ジョブキューを知っていますか/使用していますか?リンクやツールを共有できますか
asp.net - ASP.NET MVC のキューイング ソリューション
Web アプリのキューイングの概念を調べています (つまり、Web 要求サイクルで完了するのではなく、別のワーカーによって完了するために、いくつかの種類のジョブをキューに入れます)。
ASP.NET MVC環境で利用できる、これに対する適切なソリューションが存在するかどうかを知りたいです。
誰かが(良いまたは悪い)経験をしたことがありますか?
ありがとうございました!
アップデート:
明確にするために、着信リクエストをキューに入れることについて話しているのではありません。私が何を意味するのかを説明しようとします...
1) 標準的な状況:
- ブラウザからのリクエスト
- サーバー処理開始
- 長いジョブの開始
- 長い仕事が終わった
- サーバー処理終了
- ブラウザーに返された応答
2)私が調べていること:
- ブラウザからのリクエスト
- サーバー処理開始
- キューに入れられた長いジョブ
- サーバー処理終了
- ブラウザーに返された応答
そして別のプロセスで(おそらく応答が送信された後):
- キューから取得された長いジョブ
- 長いジョブの開始
- 長い仕事が終わった
最初のインスタンスでは、ユーザーはサーバーの応答を長時間待ちましたが、2 番目のインスタンスでは応答が速かったです。
もちろん、これに適した特定のタイプの仕事もあれば、そうでない仕事もあります。
更新 2:
クライアントは、長いジョブの結果ですぐに更新する必要はありません。ユーザーがたまたまページを更新したときはいつでも(もちろんジョブが完了した後)、変更はアプリケーションに表示されます。
スタック オーバーフローで発生するいくつかのことを考えてみてください。アプリケーションの各部分ですぐに更新されるわけではありませんが、これは非常に迅速に発生します。これらのジョブのいくつかはキューに入れられていると思われます。
perl - ジョブ キュー [および Perl/Catalyst] を使用して Web アプリケーションを最適に構築するにはどうすればよいですか?
Catalyst フレームワークを使用して Web アプリケーションを作成しています。TheSchwartzという Job Queue も使用しています。
Web アプリケーション インターフェイス コードから切り離されたアプリケーション固有のコードが必要なため、ジョブ キューを使用したいと考えています。
基本的に、システム全体は次の 3 つの主要コンポーネントで構成されています。
- GUI (Catalyst Web インターフェイス)
- クローラー
- 「攻撃コンポーネント」 (アプリは、他の Web アプリ/サイトで XSS および SQLi の脆弱性を探すために作成されています)
したがって、理論的には、GUI はクローラーのジョブを作成し、それが「攻撃コンポーネント」のジョブを作成します。
現在、Web アプリのコントローラーがジョブ キューにジョブを追加できるように、TheSchwartz オブジェクトをインスタンス化する Catalyst のモデルがあります。
また、必要なアクションを実行できるように、新しいジョブを継続的にリッスン (/データベースをチェック) するジョブ ワーカー スクリプトを作成する必要もあります。現在、TheSchwartz の DB 固有のものは Catalyst のモデルにあり、Catalyst の外部から簡単にアクセスできないと思いますか?
モデルで TheSchwartz ジョブ キューの DB 接続データを複製してから、ジョブ ワーカー スクリプトで複製したくありません。TheSchwartz オブジェクトの作成を Catalyst の外部にある別のクラスでラップし、現在 TheSchwartz オブジェクトをインスタンス化しているモデルでそれを呼び出す必要がありますか? 次に、それをワーカー スクリプトでも使用できます。または、DB データを構成ファイルに格納し、必要に応じて新しい TheSchwartz オブジェクトをインスタンス化する必要があります (Catalyst/ジョブ ワーカー スクリプト内)。
それとも私はこれを考えすぎていますか?
肉付きの良い Web アプリ アーキテクチャの記事へのリンクも役に立つかもしれません (中程度の複雑さの記事を作成したことはありません..)。
乾杯
ajax - Webアプリケーションのタスクの非同期実行
私が開発しているWebアプリケーションは、http要求/応答サイクル中に実行するには長すぎるタスクを実行する必要があります。通常、ユーザーはリクエストを実行し、サーバーはこのリクエストを受け取り、とりわけ、データを生成するためにいくつかのスクリプトを実行します(たとえば、povrayで画像をレンダリングします)。
もちろん、これらのタスクには長い時間がかかる可能性があるため、サーバーは、クライアントに応答を送信する前に、スクリプトの実行が完了するまでハングしないようにする必要があります。したがって、スクリプトの実行を非同期で実行し、クライアントに「リソースはここにありますが、準備ができていません」と指定し、準備ができたときにリソースを取得して表示できるように、おそらくajaxエンドポイントにポーリングするように指示する必要があります。
さて、私の質問はデザインに関連していません(ただし、この点についてのヒントも非常に楽しんでいます)。私の質問は、この問題を解決するためのシステムがすでに存在するので、四角いホイールを再発明しないということです。必要に応じて、プロセスキューマネージャーを使用してタスクを送信し、HTTPエンドポイントを配置して、ajaxクライアントに「保留中」、「中止」、「完了」などのステータスを送信しますが、このタスクのために特別に存在するので、私はほとんどそれを楽しみます。
私はpython+djangoで作業しています。
編集:ここでの主な問題は、サーバーとクライアントがタスクのステータスに関する情報をどのようにネゴシエートして交換する必要があるかではないことに注意してください。
問題は、サーバーが非常に長いタスクの送信とエンキューをどのように処理するかです。つまり、サーバーにLSFでスクリプトを送信させるよりも優れたシステムが必要です。うまくいかないというわけではありませんが、少し多すぎると思います...
編集2:他の答えが得られるかどうかを確認するために賞金を追加しました。pyprocessingを確認しましたが、ジョブの送信を実行して、後の段階でキューに再接続できません。
monitoring - Beanstalkdの統計/モニター/インスペクター
Beanstalkdキューを監視できるアプリを知っている人はいますか?チューブとジョブの統計を表示し、詳細を検査できるものを探しています。
私は言語/プラットフォームについてあまり気になりません。自分で書く前に、そこに何かがあるかどうかを知りたいだけです。
django - 日付ごとにジョブをスケジュールできるジョブ キュー システムはありますか?
Django アプリケーションがあります。
私のモデルの1つは次のようになります。
MyModel のインスタンスを更新するたびに、N 日後にデータをクリーンアップする必要があります。だから私は電話する仕事をスケジュールしたいのですが
今から N 日後。
次のことができるジョブ キューはありますか。
- Django との統合 - 個々のモデル インスタンスのメソッドを呼び出せるようにする
- 今日実行するようにスケジュールされているジョブのみを実行する
- 障害を適切に処理するのが理想的
ありがとう