PHP-AMQPフレンド向けの新機能

シャーディングのタイプ別にソーシャルネットワークを構築する場合、シャード間でデータを交換する問題が発生します。 この場合の従来のレプリケーションは、さまざまな理由で適切ではありません。 シャーディングの主題はホテルの大きなトピックであり、この記事の主題ではありません。

このアーキテクチャでは、「Friendsフィード」または「Newsフィード」を実装するシステムであるSubscription-Notificationを使用してキューサーバーを使用することをお勧めします。 優れたスケーラビリティのために選択されたAMQPプロトコルを実装するRabbitMQキューサーバーを交換ブローカーとして使用することが提案されています。 サーバー部分は、 php-rabbit拡張機能( APIの説明 )を使用してPHPで実装されます。



サブスクリプション通知アーキテクチャは、イベント駆動型のアプローチです。 誰かがあなたのイベントを購読しています。 個人ページで変更が発生するとすぐに、新しい写真またはビデオがアップロードされたとき、ブログに書いたとき、ギフトを受け取ったとき、おならをしたとき、つまり イベントが発生した場合、サブスクライバーは通知を通じてそのことをすぐに認識します。



これが「フレンドストリーム」にどのように適合するか:デフォルトでは、すべてのフレンドにイベントの購読を許可します:写真のアップロード、ビデオのアップロード、ブログエントリ、プロファイルの更新、アンケートの作成など。 たとえば、写真のアップロードなどの特定のイベントが発生すると、アップロード時間などのメッセージがキー「photo」とともに個人用Exchange(Exchange)に書き込まれます。

イベントにサブスクライブしているすべてのユーザーは、個人のキューから読み取るこれらのメッセージを受信します。 為替ブローカーの詳細については、記事「AMQP in Russian」をご覧ください



簡単な例を見ると、すべてがはるかに簡単です。

HabraBrainユーザーにHabraLokhHabraLoserの 2人の友人がいるとします 。 ユーザーHabraLokhHabraLuserは 、すべてのイベントにサブスクライブしています。 3人目のユーザーであるHabraChaynikが、ブログの更新のみを申し込むことにしたとします。



HabraMozin loginを入力すると、ブローカーにHabraGuru Exchangeが作成されます。 ユーザーが友人のフィードを読むことができるように、キューを作成することも必要です。



$cnn = new APMQConection();

$exchange = new AMQPExchange($cnn);

$exchange->declare('HabraGuru', 'topic',AMQP_DURABLE );

$queue = new AMQPQueue($cnn);

$queue ->declare('HabraGuru', AMQP_DURABLE)







AMQP_DURABLEパラメーターは、再起動時にキュー/交換をリセット(保存)しないようブローカーに指示します。



友情関係が発生すると、 HabraLokhおよびHabraLuserユーザーHabraMozgユーザーのすべてのイベントに自動的にサブスクライブします。



$cnn = new APMQConection();

$queue = new AMQPQueue($cnn, 'HabraLoh');

$queue->bind('HabraGuru', '*' );






そして

$cnn = new APMQConection();

$queue = new AMQPQueue($cnn, 'HabraLuser');

$queue->bind('HabraGuru', '*' );








そして、ユーザーHabraChaynikはユーザーHabraBrainのブログに行き、ブログを気に入って「購読」リンクをクリックしました。 次のコードが実行されます。



$cnn = new APMQConection();

$queue = new AMQPQueue($cnn, 'HabraTeapot');

$queue->bind('HabraGuru', 'blog' );








ユーザーHabraMozgがプレゼンテーション「How Friends 'Ribbon Works」を投稿すると、ダウンロードの最後に、メッセージ$ msgを投稿するコードの次の部分が実行されます。



$msg = json_encode( array('date'=> date('dm-y'), 'type'=> 'presentation' , title => 'FriendLenta. How to.'));

$cnn = new APMQConection();

$exchange = new AMQPExchange($cnn, 'HabraGuru');

$exchange->publish( $msg, 'presentation');






この例では、JSONはデータ交換として使用されますが、これは重要ではありません。csvとxmlの両方を使用できます。



1/2/4/6/12/24時間(設定した人)ごとに1回、kronskriptが作成されます。これは、ユーザーごとに個人用テープを作成します。

$queue = new AMQPQueue(APMQConection(), 'HabraLuser');



while (1){

$res = $queue->get();

if ($res['count']<0) break;

// echo "$i.{$res['msg']}";

// call QueueItemCallBack( $res['msg'] );

// " "

}








HabraBrainユーザーからのメッセージ(タイトル=> 'FriendLenta。How to')は、 HabraLokhユーザーとHabraLuserユーザーによって受信されます 。 また、 HabraChaynikユーザーはこのメッセージを受け取りません。 ただし、ユーザーHabraMozgがブログに " Friends Tape"に関するストーリーを投稿することを決定した場合、コードが実行されます。



$msg = json_encode( array('date'=> date('dm-y'), 'type'=> 'blog' , title => 'How to developed the FriendLenta'));

$cnn = new APMQConection();

$exchange = new AMQPExchange($cnn, 'HabraGuru');

$exchange->publish( $msg, 'blog');








その後、キュー($ queueName = 'HabraTeapot')を読み取ると、 HabraKettleユーザーはメッセージ(タイトル=> 'How to development the FriendLenta')を受信します。 -> bind( 'HabraGuru'、 'blog');



メッセージの購読を中止することにしました-問題ありません:

$cnn = new APMQConection();

$queue = new AMQPQueue($cnn, 'HabraTeapot');

$queue->unbind('HabraGuru', 'blog' )




$cnn = new APMQConection();

$queue = new AMQPQueue($cnn, 'HabraTeapot');

$queue->unbind('HabraGuru', 'blog' )




;



キューサーバーはFIFOの原則(先着順)に従って動作します。 したがって、たとえば、長い休暇の後に、あまりにも多くのメッセージが来た場合、状況が発生する可能性があります。その場合、最後の1000(15,000から)のみをカウントします。 この場合:

-キューの長さ$ len = $ queue-> declare();

-$ len> MAXQUEUELENの場合、$ dummy = $ len-MAXQUEUELEN;

-キューの$ダミー要素を読み取ります(この場合、14,000)。

-残りのMAXQUEUELENプロセス(1,000メッセージ);



どうやらすべてが確実かつ簡単に動作します。 「掲示板」と「ニュースフィード」は同じ原則に基づいて構成されています。

モスクワのすべてのニュースを購読する:



$queue = new AMQPQueue(new APMQConection(), 'HabraGuru');

$queue->bind('HabraGuru', '*.msk' );








モスクワの不動産に関するニュースを購読する:



$queue = new AMQPQueue(new APMQConection(), 'HabraGuru');

$queue->bind('HabraGuru', 'realty.msk' );








すべての不動産ニュースを購読する



$queue = new AMQPQueue(new APMQConection(), 'HabraGuru');

$queue->bind('HabraGuru', 'realty.*' );








不動産広告、「ベビー用品」、車を購読する:



$queue = new AMQPQueue(new APMQConection(), 'HabraGuru');

$queue->bind('HabraGuru', 'realty.notes.spb' );

$queue->bind('HabraGuru', 'children.notes.spb' );

$queue->bind('HabraGuru', 'auto.notes.spb' );








天気を購読する:



$queue = new AMQPQueue(new APMQConection(), 'HabraGuru');

$queue->bind('HabraGuru', 'weathe.spb' );








明らかに、コード例は、「フレンドフィード」、ニュースフィード、広告、または



All Articles