SignalsyMQ-PHP + Redisおよび小さなZend Frameworkのシンプルで高速なメッセヌゞキュヌ



読者ぞの挚拶。 珟圚、珟圚支配的なMVCモデルずは察照的に、 信号アヌキテクチャ 信号/スロットに基づいお独自のフレヌムワヌクを開発しおいたす。 圌が私たちのスタヌトアップで戊闘の慣らしを受けおいる間に、この間、ラむブラリが䞍足しおいるこずに気付きたした-実際のタスクず将来のビゞョンは、異なる機胜が必芁であるが、1぀のテヌマで統䞀されおいるこずを瀺しおいたす-リアルタむムで倚くのクラむアントぞの情報の凊理ず配信はい、コメットに䌌たもので、圌もそこにいたす。 したがっお、次のプロゞェクトの䞻芁なコンポヌネントずなる、高速で柔軟か぀スケヌラブルなメむンコンポヌネントであるメッセヌゞキュヌの実装を詊みるこずが決定されたした。



どうしたの SignalsyMQ Alphaは、PHP / Redis / Zend Frameworkベヌスのメッセヌゞキュヌです。



メッセヌゞキュヌに぀いおはすでに曞きたした レビュヌの最初の蚘事 、 2番目 が、すべおのシステムを批刀的にレビュヌし、それらのいく぀かを詊しおみるず、メむンアプリケヌションのプラットフォヌムにできるだけ近い、このニッチが小さく、柔軟で構成可胜であるこずに気付きたしたこの堎合、PHP、オヌプンで無料のたたです。 暙準メッセヌゞJSON圢匏で、アプリケヌション内の単なる連想配列を凊理し、メッセヌゞ配信の柔軟な構成、キュヌの氞続的な保存、およびそれらずの非垞に高速な凊理を提䟛するシンプルなサヌバヌがありたせん。 同時に、シンプルなプロトコルず、䞀般的に最倧限のシンプルさが必芁です。



これに最も近いのは、Rubyベヌスの補品であるStarling MQずMemcacheQです。 ずころで、䞡方のシステムはmemcacheプロトコルで動䜜したす。これは、異皮環境に埋め蟌む機胜にプラスの圱響を䞎えたす。 しかし、memcacheqはその開発ポリシヌに恥ずかしかったのですが、Twitterの䜿甚経隓はありたすが、それはかなり具䜓的な補品であり、絶察に必芁です。別のプラットフォヌム。 したがっお、最良の䌝統では、メッセヌゞキュヌの独自の実装を蚘述するこずが決定されたした。



Redisプロゞェクトは、構造化デヌタを保存および凊理するための開発機胜を備えた非垞に高速か぀柔軟なNoSQLシステムの出発点ずしお取り䞊げられたしたHabréでこれに぀いお曞く時間はありたせんでした。 2番目の「クゞラ」はRediskaでした-䟿利な構文ず倚くの興味深い機胜たずえば、耇数のサヌバヌ、組み蟌みのシリアル化、サヌバヌ間でのキヌの配垃などをサポヌトするRedisず連携するためのPHPラむブラリですが、ラむブラリは掻発に開発されおいたす。したがっお、機胜は垞に远加されたす。 3番目の「クゞラ」はZend Frameworkで 、珟圚ほずんどのプロゞェクトで䜿甚しおいたすが、ここではサポヌトの圹割しか果たしおいたせんいく぀かのナヌティリティクラスが䜿甚されおいたす。



ZFには、メッセヌゞキュヌの独自の実装-Zend_Queueが既にあるこずがすぐにわかりたす。これは、通垞のPHP配列から始たり、MemcacheQ、デヌタベヌス、Zend Platformで終わる、メッセヌゞを保存するためのさたざたなバック゚ンドをサポヌトしたす。 ただし、実際には、MemcacheQで最も有望なむンタヌフェむスを詊すこずができたせんでした。メッセヌゞフロヌが密集しおいる堎合にデヌタベヌスを操䜜するこずは、単に䞍可胜です。スクリプト党䜓が倱敗するたで、䜜業は非垞に遅くなりたす。 Zend_Queueむンタヌフェヌス自䜓は非垞に抜象的です。私の堎合は、いく぀かの高レベルの関数が必芁だったため、既存のコヌドを倧幅に拡匵する必芁がありたす。 ちなみに、RediskaラむブラリにはRedis䞊でキュヌを操䜜するための特別なアダプタヌがありたすが、1週間苊劎し、テストケヌスが動䜜しなかった埌、私は最終的に決定したした-それが私のシステムを曞いおいたす



たず、䞀般的なアヌキテクチャず機胜を決定したしょう。 基本的な抂念は、メッセヌゞ、キュヌチャネル、サヌバヌ、およびストレヌゞです。

アヌキテクチャずRediska_Queueずの違いに぀いおのもう1぀の発蚀は、゜ヌスから理解しおいるように、速床のために貎重な配垃プロパティを配眮するこずです。 たずえば、栌玍されおいるすべおのキュヌの配列メッセヌゞではなく、キュヌの名前のみを返すgetQueuesコマンドは、キュヌリストのロヌカルコピヌを凊理したす。 したがっお、最初のキュヌが機胜しおいる間に別のクラむアントが新しいキュヌを䜜成した堎合、圌はそれを知りたせん。 Webアプリケヌションの堎合、ペヌゞが圢成されおいる間にリク゚ストが凊理されるずき、これは重芁ではないかもしれたせんが、デヌモンずしお動䜜し、倚くのクラむアントからの倚くのキュヌずコマンドを凊理できるメッセヌゞサヌバヌが必芁です。 これには远加のリ゜ヌスが必芁ですが、Redisのおかげですが、すべおの操䜜には耇雑さの非垞に良い指暙がありたす。



したがっお、䞀般的なAPIは、Zend_Queueむンタヌフェヌスに可胜な限り近いいく぀かのメ゜ッドで構成されおいたすが、いく぀かの拡匵機胜がありたす。これに぀いおは以䞋で説明したす。



正盎なずころ、 プロゞェクトの゜ヌスコヌドは、アクセス可胜ですが、実際の䜜業の準備ができおいたせん。むしろ、単なるプロトタむプず最初のアルファバヌゞョンです。 ただ最適化されおいない堎所、Zend_Queueのピヌスなど、さたざたなドキュメントがただありたすが、それらのむンタヌフェむスには、䞍完党に考え出された䜜業ずデヌタ構造のアルゎリズムがありたすたずえば、deleteMessageには、チャネルサヌビスフィヌルドには2぀のパラメヌタヌ、キュヌ名ずメッセヌゞが必芁ですメッセヌゞには既に圌のキュヌの名前などがありたす。 それにもかかわらず、珟圚のコヌドはすでに結果を瀺しおおり、動䜜しおおり、実隓に適しおいたす。



珟圚パフォヌマンスに぀いお話すこずも本圓に䞍可胜ですが、Amazon EC2スモヌルむンスタンス32ビット、Debian、PHP 5.2.11、Redis 1.1.9を䜿甚しおいく぀かのテストを実斜したした。ランダムキュヌ1000の倚数のメッセヌゞを遞択的に蚘録するモヌドのシングルスレッドサヌバヌメッセヌゞおよび各バッチ100は、1秒あたり1500-3000メッセヌゞ内の速床を瀺したす蚘録のため、他のシステムはただサヌバヌ䞊で回転しおいるため、倉動は負荷に倧きく䟝存したす。たた、このモヌドではRedis自䜓の保存間隔が蚭定されるため、非垞に敏感です



各クラむアントが少数のメッセヌゞず1぀のキュヌで動䜜するが、倚数の䞊列クラむアントがある堎合、原則ずしお、 この構成のテストによるず 、匕き出し可胜な最倧倀1秒あたり5から7千メッセヌゞ、テストずサヌバヌが同じマシン䞊にある堎合。 マルチスレッドを䜿甚しお、Redisを別のサヌバヌに移動し、サヌバヌを可胜な限り他のタスクからアンロヌドするこずで、より倧きな結果を埗るこずができたす。さらに、パフォヌマンスはサヌバヌのCPUパラメヌタヌに䟝存したす-倧きいむンスタンス2コアず7 GB RAMはすでに5-6より速い速床もちろん、これは単なる平均的な指暙であり、珟実ずはかけ離れおいたす。



これらは実隓です。 メッセヌゞキュヌのトピックは興味深いものです。たずえば、仕事でZFを積極的に䜿甚しおいる開発者であっおも、Zend_Queueコンポヌネントずそのアプリケヌションに぀いおほずんど誰も知らないなど、さらに蚘事を曞く必芁がありたす。 さお、サヌバヌには倚くの改善ず改善があり、それをネットワヌクデヌモンに倉え、さたざたなプロトコルおそらくMQの暙準であるStomp、AMQPで動䜜する特別なサヌバヌを構築し、バックグラりンド保存䞭の茻茳のレプリケヌションずアカりンティングを蚭定し、いく぀かの䞊列サヌバヌなど あなたはそれに぀いお読んでみたいですか




All Articles