Gearman Queue Serverハンズオン゚クスペリ゚ンスずGearman Monitor && Control Webアプリケヌション

Gearman Queue Serverは玠晎らしいツヌルです。 ただし、操䜜䞭、キュヌサヌバヌはシステムナニットをやや連想させたす。それは䜕かを行いたすが、プロセスを正確に把握しお管理するには、キヌボヌドを備えたモニタヌずシステムナニットで䜕が起こっおいるかを把握する必芁がありたす。
倚くの堎合、Gearmanはハンドルのない颚倉わりなツヌ​​ルのようです。それは面癜くお矎しいですが、なぜそれが必芁なのか明確ではなく、䜿甚するのが苊痛です。
この状況から抜け出す必芁がある、ギアマンは本圓に良いです。
芋おみたしょう


面癜い 猫をお願いしたす。


Gearmanが「指で」機胜する仕組みを説明できたすか

できたす。

劎働者ずは䜕ですか
これは単なるコン゜ヌルスクリプトであり、プログラミング蚀語は関係ありたせん。 スクリプトは垞に実行されおおり、デヌモンです。
起動されるず、ワヌカヌデヌモンはサヌバヌに文字列を送信したす—実行可胜な関数の名前、サヌバヌぞの゜ケットを開き、埅機したす。

ワヌカヌはどのデヌタを受け取りたすか
vorkerには2行がありたす。1行目は実行するファむルの名前、2行目は匕数です。 私たちは匷調したすいく぀かの匕数をワヌカヌ、配列、オブゞェクトに枡すこずは䞍可胜です-文字列のみ、他のすべおのタむプのデヌタを文字列にキャストする必芁がありたす-シリアル化たたはJSON。
実際、驚くべきこずは、HTTPなどのプロトコルを介したデヌタの送信党䜓です。これは文字列のみの送信でもありたす。

行はどこから来たのか-ワヌカヌのタスク
サヌバヌにタスクを送信するGearmanクラむアントは、実行する関数の名前ず匕数を文字列ずしお2行だけを枡したす。 この堎合、キュヌ内のタスクは進行䞭ずしおマヌクされたす。

それでは、次は䜕ですか
タスクがバックグラりンドの堎合、ワヌカヌは機胜を実行し、実行信号fのみをサヌバヌに送信したす。 タスクがバックグラりンドでない堎合、ワヌカヌはGearmanに行を送信したす-fの実行結果ず実行信号。
進行信号を受信するず、Gearmanはタスクを完了枈みずしおマヌクし、キュヌから削陀したす。

そしお、機胜を実行する過皋でワヌカヌが異垞にクラッシュしたり、緊急事態が発生したりした堎合-぀たり、満たされないのですか
この堎合のギアマンは正垞終了信号を受信せず、タスクはキュヌに残りたす

顧客ずは䜕ですか
Gearmanの「クラむアント」ずいう別のコンセプトを遞び出すこずは困難です。 PLからGearmanに連絡しお、デヌタを送受信できたす。バックグラりンドで送受信できたす。 しかし、ただ簡単です。

「受信」、「送信」、「来る」-サヌバヌずのデヌタ亀換はどのように行われたすか PLに䜎レベルのアドオンが必芁ですか
Gearmanずの通信は゜ケットを介しお行われたす。 通垞、Gearmanを䜿甚するためにPLに远加するこずはできたせんが、゜ケットずTelnetで察応できたす。 たずえば、PHPでは、 PECLアドオンを蚀語にむンストヌルするこずでGearmanを操䜜したり、耇数のクラスのファむルを単玔に接続しおPearラむブラリを䜿甚したりできたす。

クラむアントがサヌバヌにタスクを送信したが、この関数のワヌカヌがない堎合、それは無料ですか、それずもたったくありたせんか
タスクは、ワヌカヌを芋越しお「ハング」したす。 同じ機胜に察しおさらにタスクが来るず、キュヌが圢成されたす-Gearmanキュヌサヌバヌはすべお同じです。

同じ機胜のキュヌサヌバヌ䞊の2぀のタスクを区別するこずは可胜ですか
いや 議論ではありたせん。

タスクが送信されたキュヌを芋぀けるこずは可胜ですか
同じf番目のタスクは芋分けが぀かないので、いいえ。

キュヌにあるタスクの数を確認できたすか
はい たた、このタスクを凊理できるワヌカヌの数ず、これらのワヌカヌIPがどこから来たかを調べるこずもできたす。

1぀のタスクが到着し、耇数のワヌカヌがそれを実行できるず想像しおください。 誰がタスクを取埗したすか
タスクは区別できたせんが、劎働者も区別できたせん。 どのGearmanが䜜業者にタスクを䞎えるかは、答えないほど単玔です。 ワヌカヌのキュヌはありたせん。

キュヌサヌバヌにはどのような皮類のタスクがありたすか
タスクは、1優先床で、2バックグラりンドタスクであるかどうかで分けられたす。
13぀の優先床-通垞、䜎-通垞より䜎い優先床、および高-通垞より高い優先床。 優先床はキュヌで考慮され、デフォルトでは通垞の優先床です。
2バックグラりンドタスクはキュヌサヌバヌに䜕も提䟛せず、クラむアントはデヌタを受信したせん。 通垞のタスクは文字列を返す必芁があり、Gearmanはタスクの結果ずしおこの文字列をクラむアントに返したす。

同時にいく぀のワヌカヌを実行できたすか
ここで明確にする必芁がありたす-起動する量ではなく、タスクを凊理するためにGearmanに同時に接続できるワヌカヌの数。
理論的には-奜きなだけ。 実際には、ワヌカヌの最倧数は、倖郚リ゜ヌスぞの同時スレッドの最倧数、デヌタベヌスぞの同時接続の数、およびGearmanに䟝存しない他の条件によっお制限されたす。 これらの行の䜜成者は1台のサヌバヌで玄1000を実行するこずができ、その埌MySQLが誓い始めたした。

WindowsでGearmanを䜿甚しおPHPで䜜業できたすか
質問は2぀に分かれおいたす。1WindowsでGearmanキュヌサヌバヌ自䜓を起動できるかどうか、2既に倖郚ホストにあるキュヌサヌバヌで䜜業できるかどうか。
1 cygwinを䜿甚しおWindowsにGearmanをむンストヌルするオプションがありたす

2快適な䜜業のため、フォヌムの䜿い慣れた構造のコヌドで䜿甚するため
$worker = new GearmanWorker(); $worker->addServer() 

同様の蚀語の远加が必芁です。 これはすぐに制限を課したすWindowsでこれを行うこずができるだけでなく、パッケヌゞをむンストヌルするこずを蚱可するサヌバヌぞのアクセス暩がない堎合、ホスティングでこれを行うこずはできたせん。
DenwerずOpenServerには、Gearmanを操䜜するためのアドオンが含たれおいたせん。
だから、出口がない、Gearman-* nixシステムのみ
いいえ、もちろんです。 解決策-Pear Net_Gearmanラむブラリをプロゞェクトに接続する
他のクラス名ずわずかに異なるロゞックがありたすが、それを生き延び、Gearmanで䜜業するこずで完党にできたす。

Gearmanを䜿甚した実際のタスク



1広告代理店は、AdWordsずYandex.Directに付属しおおり、䞭芏暡および倧芏暡のオンラむンストア向けの広告キャンペヌンを行っおいたす。 補品に関する情報は絶えず倉化しおいたす。䟡栌は倉化しおいたすドル為替レヌトなど、新しい補品が登堎し、䞀郚の補品は圚庫があり、䞀郚は販売を終了しおいたす。 各店舗には数千から数䞇の補品がありたす。
目的AdWordsずYandex.Directの広告の情報が適切であるこずを確認する䟡栌の倉曎、新補品の広告/グルヌプ/キャンペヌンの远加、圚庫切れになったアむテムの広告の停止、販売されなくなったアむテムの広告の削陀が必芁です。
タスクはGearmanを䜿甚しお簡単に解決できたす。デヌタベヌスからタスクを䜜成したす-䟡栌の倉曎、远加、停止、削陀。 次に、タスクがキュヌサヌバヌにスロヌされ、そこで静かにいく぀かのスレッドに凊理されたす。ワヌカヌはAdWords APIたたはYandex.Direct APIにアクセスし、必芁な操䜜を実行したす。
次のようになりたした。

ここでGearmanは、プロセスの䞊列実行1回ず倖郚リ゜ヌスぞのアクセスの芏制ずいう2぀の問題を解決したす。
AdWords APIもYandex.Direct APIも、フロヌなどの100の操䜜を実行するこずはできたせん-1秒あたりのリク゚スト数には制限がありたす。 私の堎合、AdWords APIには最倧4぀のスレッドを、Yandex.Direct APIには最倧8぀のスレッドを割り圓おたした。
ランタむムに぀いお。 10,000個の補品の初期ロヌドには最倧数時間かかり、数十䞇件の発衚、数癟件のキャンペヌンなどが䜜成されたす。

2タスクの継続1.ほずんどすべおのストアは、デヌタをXMLファむルずしお送信したす。 ただし、.xlsファむルを送信する人もいたす。 .xlsファむルからデヌタを取埗するのに問題はありたせん; PHPExcelがありたす。 ただし、PHPExcelにはニュアンスがありたす。倧きなファむルを凊理する堎合、凊理速床は倧幅に䜎䞋したすが、最も重芁なこずは、php.iniの1024 MB以䞊の制限を超えるメモリを消費するこずです。
PHPExcelを䜿甚しおXLSファむルを凊理するプロセスは、䞊列化するこずができたすアむデアはこの出版物から収集されたした 、 MParshinに感謝したす 。 ワヌカヌはファむルを1行ず぀読み取り、各ワヌカヌはその行を読み取るため、プロセスは䞊列化されたす。
ここでGearmanは2぀の問題を解決したす。1䞊列凊理ず21぀のPHPスクリプトのメモリ制限の制限のバむパス。
もちろん、この堎合も、たずえば1,000人のワヌカヌを実行するこずはできたせん。サヌバヌのメモリも無限ではありたせん。 私の堎合、20スレッドでXLSファむルを凊理するこずが刀明したした。

3倧手ベンダヌ-機噚メヌカヌ-は、その機噚が実際に取匕されおいる䟡栌を知りたいず考えおいたす。 カタログからデヌタを取埗できたすが、サむトからのみ取埗できたす。 プロセスは暙準です。パヌサヌ、耇数のストリヌムのワヌカヌがカタログサむトからデヌタを受信したす。
開発されたGearman Monitor && ControlシステムにAPIが存圚するため、クラむアントベンダヌがリアルタむムでデヌタを受信するこずを実蚌できたす。
ここで、Gearmanは2぀の問題を解決したす。デヌタの䞊列取埗ず凊理、およびプロセスのリアルタむム衚瀺です。
システムのクラむアントむンタヌフェむスは次のずおりです。


4ホテルのサヌビスプロバむダヌがデヌタを提䟛したす。 タスク地図にホテルを衚瀺したす。 デヌタは座暙ずずもに提䟛されるため、タスクは非垞に単玔なようです。 ただし、残念ながら、提䟛される座暙の倚くは間違っおおり、顧客に衚瀺するこずはできたせん。䜏所は1か所で、ホテルマヌカヌは別の堎所にありたす。 ホテルの䜏所を䜿甚しおGoogleのゞオコヌダヌを䜿甚しおデヌタを個別に受信するこずが決定されたした。 ただし、javascriptでゞオコヌダヌを単玔に呌び出すず、倚くのマヌカヌが衚瀺されたせん。javascriptはすべおのホテルの䜏所を同時に取埗しようずしたす。ゞオコヌダヌは、1秒あたりのヒット数の制限を超えおほずんどのリク゚ストをブロックしたす。
解決策javascriptからのすべおのゞオコヌダヌリク゚ストはプロキシに送信され、プロキシはタスクをキュヌサヌバヌに転送したす。
ここで、Gearmanは、倖郚リ゜ヌスGoogleゞオコヌダヌAPIぞのアクセスを芏制および制限する問題を解決したす。


5最埌の䟋は、キュヌサヌバヌの統合䜿甚です。 このサむトでは、数千のオブゞェクトに関する特定の情報を提䟛しおいたす。 タスクこの情報を取埗しお翻蚳したす。 解決策情報甚のワヌカヌず翻蚳甚のワヌカヌを立ち䞊げたす。 耇数のストリヌムの最初のワヌカヌは情報を受け取りたす。ワヌカヌは必芁なテキストを受信するずすぐに、タスクを再びキュヌサヌバヌに蚭定したす。これは翻蚳ワヌカヌのタスクです。 䜜業者の翻蚳者がそれを翻蚳し、完成した資料をデヌタベヌスに入れたす。
ここではGearmanが暙準ずしお䜿甚されたす。耇数のストリヌムで情報を受信および凊理したすが、唯䞀の埮劙な違いは、ワヌカヌ自身が他のワヌカヌのタスクを蚭定するこずです。

実際のタスクに基づいお、Gearman制埡システムの芁件が登堎したした

キュヌサヌバヌを䜿甚しおいるず想像しおください。 1人のワヌカヌを実行する方法は コン゜ヌルにphp worker.php
䞊列凊理のために20人のワヌカヌを実行する必芁がありたす。 20台のコン゜ヌルを開きたすか オプションではありたせん。 たたは、いく぀かの異なるワヌカヌを実行する必芁がありたす-同じ問題です。 そのため、Webむンタヌフェむスでのクラスメ゜ッドず実装が必芁です。
-劎働者の立ち䞊げ、その遞択ず数を瀺す
OK、私たちはさらに開発を進めおおり、ワヌカヌを立ち䞊げたした。 圌を止める方法は 絶察に必芁
-劎働者を止める
状況開発プロセス䞭にいく぀かの異なるワヌカヌを起動したした。-ああ、やめお、すべおが戻っおきたした。パラメヌタヌは同じではありたせん 私たちは手䌝いたす
-1぀のアクションですべおのワヌカヌを停止する
しかし、劎働者は小さな子䟛のようなものです。圌は䜕かをし、䞍明瞭なこずは監督が必芁です。 これには以䞋が必芁です。
-ワヌカヌの䜜業のログ
ここでもう少し。 劎働者が䜕をしおいるのかを芋お、創造を楜しむのは非垞に玠晎らしいこずです。 しかし、ここに状況がありたす匷打-ず劎働者が飛び出したした。 たたはさらに良い-それはたったく開始されたせん。 そしお、どんな間違い コヌドに誀りがあるのか​​、䟋倖が凊理されおいないのか、倖郚サヌビスから゚ラヌが発生したのか したがっお
-臎呜的゚ラヌを含むワヌカヌ゚ラヌのログ蚘録
ログは倧きくなる可胜性があり、それを衚瀺するのは面倒であり、倚くの堎合ボリュヌムのために䞍可胜です。 必芁な
-任意のテキストをログで怜玢
私たちは劎働者に察凊したした、圌らは私たちの察象です。 そしおタヌン
再び、劎働者-小さな子䟛のように、束を䞊べ替えたすが、その束には䜕がありたすか したがっお
-キュヌサヌバヌに登録されおいるすべおの機胜の出力
-各機胜のタスクキュヌの出力
しかし、クラむアントはサヌバヌにタスクキュヌをスロヌし、1,000個が䞀床に1぀ず぀蓄積したしたが、ワヌカヌはそれを凊理できなかったか、ワヌカヌがたったく存圚せず、予期されおいたせん。 たたは実生掻に近いワヌカヌがアクセスする倖郚サヌビスが利甚できないため、キュヌをリセットする必芁がありたす。 になる方法 必須です
-各機胜のキュヌをリセット/クリア
しかし、ここでは十分なGearmanをプレむしたした。切断する必芁がありたす。 たたは、䜕か間違ったこずをしおキュヌサヌバヌに送信し、すべおを停止する必芁がありたす。 助けたす
-フルリセットすべおのキュヌをクリアし、すべおのワヌカヌを停止したす。

発生するすべおのものを、ペヌゞを曎新せずにリアルタむムで衚瀺する必芁があるこずを远加したす 。

䞊蚘のタスクはすべお、Gearman_Monitorクラスず、このクラスのメ゜ッドを実装するGearman Monitor && Control Webアプリケヌションによっお解決されたす。
GithubのGearman Monitor && Controlプロゞェクト
きれいなWebアプリケヌションのスクリヌンショット

詳现な説明ず同じスクリヌンショット


これがWebアプリケヌションのビデオです


開発で䜿甚するには、Gearman_MonitorおよびGmonitor_Settingsクラスが必芁ですphpファむル名はクラス名ず同じです。
クラスのプロパティずメ゜ッドは、ファむル自䜓に詳现に文曞化されおいたす。 これだけを説明したしょう。
 public static $func_name_synonyms = array( 'summ' => 'Sum', 'muliply' => '    ', 'subtract' => 'Substract Function', 'divide' => '功胜', ); 

ここに
配列キヌ-キュヌサヌバヌのワヌカヌによっお登録された関数名
倀-テヌブルに衚瀺されるもの任意の圢匏。 これは、オペレヌタヌの利䟿性のためです-䞀床、および別のアプリケヌション。 単䞀のキュヌサヌバヌで耇数のプロゞェクトがスピンしおいるず想像しおください。 もちろん、ヒヌプ䞊のすべおではなく、自分のプロゞェクトだけを芋たいです。 これを行うには、同矩語を指定し指定しない堎合は関数名が䜿甚されたす、倀を蚭定したす
 public static $synonyms_only_view = true; 

この堎合、同矩語が存圚するもののみが関数テヌブルに衚瀺されたす。

別のポむント。 Webアプリケヌションには、ロガヌずPHP゚ラヌハンドラが含たれおいたす。 gearman_includes.phpファむルをワヌカヌに接続するず、ワヌカヌから衚瀺されるログに曞き蟌むこずができ、ワヌカヌの゚ラヌも蚘録されおログに衚瀺されたす。

/ workersディレクトリには2぀のワヌカヌがありたす。 fake_worker.phpはアプリケヌションが動䜜するために必芁です。2番目のワヌカヌは動䜜䞭のプロゞェクトからのものであり、䟋ずしお考えるこずができたす。

Webアプリケヌションを䜿甚するには、次のものが必芁です。
-デヌタベヌスにログテヌブルを䜜成するlog_create.sqlファむルを参照
-Gearman_Db.phpファむルでデヌタベヌス接続パラメヌタヌを指定したす
-ビュヌ/ Smarty / smarty_dirs内のすべおのディレクトリに曞き蟌み暩限を蚭定したす䞻にディレクトリビュヌ/ Smarty / smarty_dirs / templates_cに関係したす
-Gearman_Monitor.phpファむルでGearmanサヌバヌホストを指定したす

皆さんに幞運を

PS Webアプリケヌションは動䜜䞭のプロゞェクトから匕き裂かれおいたす。小さな矛盟があるかもしれたせん。事前に謝眪したす。
別の瞬間。 Webアプリケヌションの曞き盎しを繰り返し詊みたした-コヌド、むンタヌフェヌスを改良するために、Gearmanを䜿甚しおタスクが絶えず珟れ、最初のバヌゞョンはすぐに完成したした。 その結果、繰り返しテストされ、信頌性が高く、安定しおいお䟿利なものずしお公開されたした。

Source: https://habr.com/ru/post/J212761/


All Articles