PHP メッセージ キューの実装とアプリケーション
ご存知のとおり、Web サイトをデザインするとき、ユーザーへの「大量のテキスト メッセージ」、「注文システムの大量のログ」、「フラッシュ セールのデザイン」などに遭遇することがあります。サーバーはこの種の瞬間的なメッセージを処理できません。この状況を確実に確保する必要があります。システムを通常かつ効果的に使用するには、「メッセージ キュー」の助けが必要です。この記事では主にメッセージ キューの概念について学習します。
主に以下の知識を理解します:
1.キューとは何ですか、そしてそれは何ができるのですか?
2. アライメントの適用シナリオは何ですか?
3. キューを使用してサービスを分離するにはどうすればよいですか?
4. Redis キューを使用して高圧を解消するにはどうすればよいですか?
5.プロフェッショナルアライメントシステムRabbitMQの使い方は?
主な内容をまとめると以下の通りです
@メッセージキューの概念、原理、シナリオ
@デカップリング事例:キュー処理順序システムと分散システム
@トラフィックピークカット事例:Redisのリスト型でフラッシュセールを実装
@RabbitMQ : より専門的なメッセージ システム実装ソリューション
1. メッセージ キューを理解する
1.1 メッセージ キューの概念
本質的に、メッセージ キューは、キュー構造を持つ、つまりメッセージの後にあるミドルウェアです。はこのミドルウェアに配置されます。直接返すことができ、システムによる即時処理は必要ありません。別のプログラムがデータを読み取って、順番に 1 つずつ処理します。
つまり、非常に同時並行性が高くて時間がかかる状況に遭遇したときに、すぐに処理結果を返す必要がない場合には、メッセージキューを使うことでそういった問題を解決することができます。
1.2 コア構造
はビジネスシステムによってキューに入れられ、メッセージは 1 つずつメッセージキューに挿入され、挿入が成功すると、成功した結果が直接返されます。メッセージ システムを処理する将来。 のレコードが 1 つずつ取り出されて処理され、デキュー プロセスが完了します。
1.3 アプリケーションシナリオ
データの冗長性: たとえば、注文システムは将来的に厳密なデータ変換と記録を必要とし、メッセージキューはこれらのデータをキューに永続的に保存することができ、その後、注文とその後の処理プログラムが存在します。処理後、このレコードを削除して、各レコードが処理できるようにします。
システムの分離: メッセージング システムの使用後、エンキュー システムとデキュー システムが分離されます。つまり、ある日クラッシュする限り、他のシステムの通常の動作には影響しません。
トラフィックのピークカット: たとえば、フラッシュセールやラッシュセールでは、キャッシュと組み合わせてメッセージキューを使用できます。これにより、瞬間的なアクセス量に効果的に耐えることができ、サーバーが過負荷になってクラッシュが発生するのを防ぐことができます。
非同期通信: メッセージ自体をキューに入れてから直接返すことができます。
スケーラビリティ: たとえば、注文キューは注文を処理するだけでなく、他のビジネスでも使用できます。
ソート保証: データが特定の順序で処理されることを保証するために、シングルインとシングルアウトなど、一部のシナリオは製品の順序で処理する必要があります。
上記はメッセージ キューの一般的な使用シナリオです。もちろん、メッセージ キューは単なるミドルウェアであり、他の製品と組み合わせて使用できます。
1.4 一般的なキュー実装の長所と短所
キューメディア
1. mysqlなどのデータベース(信頼性が高く、実装が簡単、速度が遅い)
2. Redisなどのキャッシュ(単一メッセージの場合は高速)パケットが大きすぎる 効率が悪い)
3. RabbitMq などのメッセージングシステム(専門性が高く、信頼性が高く、学習コストが高い)
メッセージ処理トリガーメカニズム
1. 無限ループでの読み取り: 実装が簡単、回復できない障害発生時の時間; (比較 フラッシュ販売、比較的集中化された集中的な運用と保守に適しています)
2. スケジュールされたタスク: 圧力は均等に分散され、処理上限が現在一般的な処理トリガー メカニズムです。 (唯一の欠点は、間隔とデータに注意する必要があることです。前のタスクが完了せずに次のタスクが再び開始されるまで待たないでください)
3. デーモンプロセス: php-fpm と php- に似ています。 cg、シェルの基本が必要です
2. デカップリングのケース: キュー処理「注文システム」と「流通システム」
プログラムのデカップリングについて簡単に説明します: プログラムのデカップリングは、あなたの妻と母親を防ぐことです誰を救うかという問題(ニヤニヤ)
注文プロセスについては、「注文システム」と「配送システム」の 2 つのシステムを設計できます。オンラインで買い物をするときに、注文後に送信すると、背景に商品が配送されているのが見えるのを誰もが見たことがあると思います。このとき、「配信システム」が関与する必要があります。
アーキテクチャを行う際に「注文システム」と「納品システム」を一緒に設計すると、いくつかの問題が発生します まず、注文システムについては、システムへの負担が大きくなりますが、「納品システム」は、これらの圧力に対する何らかの即時対応が必要です。
第二に、注文システムの障害が配送システムの障害を引き起こし、両方のシステムの通常の動作に同時に影響を与えることは望ましくありません。したがって、私たちはこれら 2 つのシステムを分離したいと考えています。 2 つのシステムが分離された後は、中間の「キュー テーブル」を介して 2 つのシステム間で通信できるようになります。
2.1 アーキテクチャ設計
1. まず、注文システムがユーザーの注文を受け取り、注文を処理します。
2. 次に、これらの注文情報がキューテーブルに書き込まれます。このキューテーブルが 2 つのシステム間の通信の鍵となります。
3. 分散システムによって定期的に実行されるプログラムは、処理のためにキューテーブルを読み取ります。
4. 配信システムによる処理後、処理されたレコードにマークが付けられます。
2.2 プログラムの流れ
3. トラフィックのピークカットのケース: Redis のリスト型はフラッシュセールを実装します
Redis はメモリに基づいており、その速度は非常に高速です。 Redis は耐久性があるため、定期的にデータをハードディスクに書き込むため、停電を心配する必要がありません。さらに、Redis は 5 つのデータ型を提供します。 . (文字列、二重リンクリスト、ハッシュ、セット、順序付きセット)
一般に、フラッシュセールの場合、急いで購入する場合、および価格が瞬時に高くなって列に並ぶ必要がある場合には、redis が適しています。上。
3.1 redisのデータ型におけるリスト型
redisのリストは二重連結リストとなっており、先頭からでも末尾からでもデータを追加することができます。
* LPUSH/LPUSHX: (/existing) リストの先頭に値を挿入します
* RPUSH/RPUSHX: (/existing) リストの末尾に値を挿入します
* LPOP: 最初の値を削除して取得しますリストの要素の値を取得します
* RPOP: リストの最後の要素を削除して取得します
* LTRIM: 要素を指定された範囲内に保ちます
* LLEN: リストの長さを取得します
* LSET: の値を設定しますリスト要素をインデックスで取得
* LINDEX: インデックスでリスト内の要素を取得
* LRANGE: リストの指定範囲内の要素を取得
3.2 アーキテクチャ設計
シンプルな構造のフラッシュキルプログラム設計。
1.フラッシュセールに参加したユーザーを最初に記録し、その時間を記録します。
2. ユーザーの ID を Redis リストに保存し、キューに入れます。最初の 10 ユーザーのみが正常に参加できると規定されている場合、リストの数が十分な場合は、データを追加し続けることはできません。この方法では、redis リストの長さはわずか 10 になります
3. 最後に、データへの負荷を軽減するために、redis 内のデータをデータベースにゆっくりと書き込みます
3.3 コードレベルの設計
1. ユーザーがフラッシュセールを開始するとき、フラッシュキルプログラムのリクエストをRedisに書き込みます(uid、time_stamp)。
2. フラッシュセールに成功できるのは10名と規定されている場合、Redisに保存されているデータの長さを確認し、上限を超えていれば直接破棄します。
3. 最後に、Redis に保存されている 10 個のデータが無限ループで処理され、ゆっくりとデータが取得され、mysql データベースに保存されます。
フラッシュ販売領域はデータベースに多大な負荷を与えます。そのような設計がないと、MySQL での書き込みのボトルネックが発生します。 Redis でキュー リストを使用し、フラッシュ セール リクエストを Redis に入力します。最後に、ウェアハウス プログラムを通じてデータをデータベースにゆっくりと書き込みます。これにより、トラフィックのバランスが取れ、mysql に影響がなくなります。 。 プレッシャーが強すぎる。
IV. RabbitMQ
ここでは、RabbitMQ のいくつかの使用法について説明します。アーキテクチャは非常に複雑で、プログラムがリアルタイムでキューを読み取るか、1 つ以上のキューを同時に操作する複数の送信プログラムがあり、この場合、これらのプログラムを別のマシンに分散させたいと考えています。 Redis キューの使用はやや不十分です。この時点で何をすべきでしょうか? 問題をより適切に解決できる、より専門的なメッセージ キュー システムを導入する必要があります。
4.1 RabbitMQのアーキテクチャと原則
特徴:AMQPの完全な実装、クラスターの簡素化、永続性、クロスプラットフォーム
RabbitMQSの使用
1. RabbitMQのインストール(rabbitmq-server、php-amqplib)
2. プロデューサーはメッセージをメッセージチャネルに送信します
3. コンシューマーはメッセージを処理します
ワークキュー
アイデア: プロデューサーはそれをメッセージシステムに送信し、メッセージシステムはタスクをメッセージキューにカプセル化し、複数のコンシューマーに同じキューを使用します
これはプロデューサーとコンシューマー間の分離を解決するだけでなく、次のことも行うことができます。コンシューマーとタスクの共有を実現し、サーバーへの負荷を軽減します。
5. まとめ
上記は主に、メッセージ キューの概念、原則、シナリオを学習することに焦点を当てています。デカップリングのケースとピーククリッピングのケース、および RabbitMQ の簡単な使用法を理解します。
6. 質問
redisとメッセージサーバーの選択の最大の違いは何ですか。
Redis はリクエストを 1 つずつ処理します。Redis は同期ブロッキングを使用し、もう 1 つは非同期を使用します。 -ブロッキング。
一般的なキュー実装の長所と短所
キューメディア:
Mysql: 信頼性が高く、実装が簡単、速度が遅い
Redis: 高速だが、単一の大きなメッセージパッケージでは効率が低い
メッセージシステム: 強力なプロ意識、信頼性、学習高コスト (例: RabbtiMQ)
メッセージ処理のトリガー メカニズム:
無限ループ読み取り: 実装が簡単、失敗した場合は時間内に回復できません
スケジュールされたタスク: 圧力は均等に分散され、上限があります。処理能力の限界。 (最大の欠点:測位タスクの時間間隔と処理されるデータを正確に把握する必要がある。前のタスクが完了する前に次のタスクが開始されたとはみなせない。)
デーモンプロセス:PHP-FPMに類似および PHP-CGI、シェルの知識が必要です
関連する推奨事項:
以上がPHP メッセージ キューの実装とアプリケーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
