このアーキテクチャでは、「Friendsフィード」または「Newsフィード」を実装するシステムであるSubscription-Notificationを使用してキューサーバーを使用することをお勧めします。 優れたスケーラビリティのために選択されたAMQPプロトコルを実装するRabbitMQキューサーバーを交換ブローカーとして使用することが提案されています。 サーバー部分は、 php-rabbit拡張機能( APIの説明 )を使用してPHPで実装されます。
サブスクリプション通知アーキテクチャは、イベント駆動型のアプローチです。 誰かがあなたのイベントを購読しています。 個人ページで変更が発生するとすぐに、新しい写真またはビデオがアップロードされたとき、ブログに書いたとき、ギフトを受け取ったとき、おならをしたとき、つまり イベントが発生した場合、サブスクライバーは通知を通じてそのことをすぐに認識します。
これが「フレンドストリーム」にどのように適合するか:デフォルトでは、すべてのフレンドにイベントの購読を許可します:写真のアップロード、ビデオのアップロード、ブログエントリ、プロファイルの更新、アンケートの作成など。 たとえば、写真のアップロードなどの特定のイベントが発生すると、アップロード時間などのメッセージがキー「photo」とともに個人用Exchange(Exchange)に書き込まれます。
イベントにサブスクライブしているすべてのユーザーは、個人のキューから読み取るこれらのメッセージを受信します。 為替ブローカーの詳細については、記事「AMQP in Russian」をご覧ください。
簡単な例を見ると、すべてがはるかに簡単です。
HabraBrainユーザーにHabraLokh 、 HabraLoserの 2人の友人がいるとします 。 ユーザーHabraLokhとHabraLuserは 、すべてのイベントにサブスクライブしています。 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' );
明らかに、コード例は、「フレンドフィード」、ニュースフィード、広告、または