インタビュアーがスウレの応用シナリオを聞いてきて、戸惑いました!

アプリケーションシナリオの概要

  • ハードウェア機器(ロケーション機器)との通信
  • IMシステム(ライブページでのチャット通信に使用)

シナリオ1-位置データとリアルタイム出力のリアルタイム収集(たとえば、Didiドライバーの運転トラック)

説明:

すべての測位機器をリアルタイムで受け取り、リアルタイムの実績を地図上に表示する必要があります

注意点:

最初のポイント:

web1サーバーに接続しているユーザー1、2、3、web1は、情報をブロードキャストするときにユーザー1、2、3のみをブロードキャストでき、web2に接続しているユーザー4、5、6はブロードキャストできません。シーンがチャットしているとすると、ユーザー1はメッセージを送信します。web1のみサーバーユーザーは表示できますが、web2ユーザーは受信できません

ここに写真の説明を挿入

2番目のポイント:メッセージの周波数制御。例:100デバイス、100ユーザー、100デバイスは1秒あたり1つのデータをアップロードします。これは、各ユーザーにリアルタイムでブロードキャストする必要があります。つまり、100 * 100 = 1W回/秒なので、要約できます。すべてのユーザーなどに毎秒データをブロードキャストします。

データ送信のフローチャート:

ビジネスロジックを含まず、web1、web2で受信したメッセージを集約し、web1、web2にブロードキャストしてから、ユーザーにブロードキャストします。

シナリオ2-位置決めデバイスのみを収集してストレージに配置する

説明:ポジショニングデバイスによってアップロードされたすべてのデータをデータベースに保存する必要があります。7つのデバイス、1秒あたり1つのデータ、swooleのタスク機能の個人的な使用(非同期タスクをtask_workerプールに投稿します。この機能は非ブロッキングであり、ワーカープロセスの数は同じです)構成可能)次に、インターフェイスメソッドを呼び出して保存します

サーバーメモリアラームの問題

理由:swoole_server-> task関数にあります

公式の紹介によると、タスクの最下層は、フルメモリでIOを消費しないUnixソケットパイプ通信を使用します。単一プロセスの読み取りおよび書き込みパフォーマンスは100万/秒に達する可能性があり、異なるプロセスは通信に異なるチャネルを使用するため、マルチコアを最大限に活用できます。

ただし、ネットワークの遅延により、タスクがプログラムインターフェイスを呼び出す場合、追加されたタスクが消費されたタスクよりも大きいと、メモリ使用量が増え続け、サーバーのメモリがいっぱいになります。

解決策:メッセージは、着信タスクの頻度を制御します。時間と、独自のビジネスシナリオに応じて遅延できるかどうかを定義できます。1秒以内にすべてのデータを収集してから、プログラムインターフェイスを呼び出します(要約する場合は個人使用のredis)。できれば直接呼び出します。に保存し、インターフェースを呼び出す必要はありません

完全ではない単純なコードスニペット(初心者が理解できるように、公式Webサイトのデモも同様です)

function __construct($config) 
{
    
    
    $this->config = $config;


    $this->serv = new Swoole\Server($config['server']['host'], $config['server']['port']);
    // 连接redis
    $this->redis = new Predis\Client($config['redis']);
    $this->storage = new Storage($this->config);

    $this->serv->set([
        'worker_num'      => $this->config['server']['workerNum'],   //工作进程数量
        'daemonize'       => $this->config['server']['daemonize'], //是否作为守护进程
        'task_worker_num' => $this->config['server']['taskWorkerNum'],
    ]);
    $this->serv->on('connect', function ($serv, $fd){
    
    
        $this->onConnect($fd, $serv);
    });
    
    $this->serv->on('receive', function ($serv, $fd, $from_id, $data)  {
    
    
        $this->onReceive($fd, $serv, $data);
    });

    $this->serv->on('Close', function($server, $fd) {
    
    
        $this->onClose($fd, $server);
        
    });
    $this->serv->on('Task', function($server, $task_id, $from_id, $data) {
    
    
        $this->onTask($server, $task_id, $from_id, $data);
        
    });
    $this->serv->on('Finish', function($server, $task_id, $data) {
    
    
        $this->onFinish($server, $task_id, $data);
        
    });

    $this->serv->start();
}

public function onTask($serv, $task_id, $from_id, $data){
    
    
    // insert 方法是通过接口入库
    $this->storage->insert($data);
}
public function onReceive($fd, $serv, $data)
{
    
    
    $this->storage->writeLog('message:'.$data);
    $data = $this->formatData($data, $fd);
    $serv->task($data);
}
public function onClose($fd, $serv) 
{
    
    
    // writeLog 方法是写入log
    $this->storage->writeLog('close fd:'.$fd);
}
public function onFinish($serv, $task_id, $data)
{
    
    
    return '';
}

シーン-IMシステム

公式github:webimシステムを参照してください
公式wiki:swooleフレームワークwiki

利点:

  • データベースのモデルクラス、データベースのORMインターフェイスをカプセル化します
  • Redisパッケージ、マルチインスタンスアクセスを実現できます
  • フレームワークには、ログなどの一般的に使用されるメソッドがいくつかあります(私はログのみを使用します)
  • webimには公式にデモがあり、参照できます

害:

  • ドキュメントは特に不完全であり、単純な実装には長い時間がかかります

注意してください、迷子にならないでください

さて、みなさん、上記はこの記事の全内容です。ここで見ることができるのはすべて才能です。さっきも言ったように、PHPには技術的なポイントがたくさんあります。多すぎるので、書くのは本当に不可能で、書いた後はあまり読まないので、必要に応じてここでPDFとドキュメントに整理します。できる

クリックしてシークレットコードを入力してください:PHP +「プラットフォーム」

ここに写真の説明を挿入

ここに写真の説明を挿入


学習内容の詳細については、[Comparative Standard Factory]の優れたPHPアーキテクトチュートリアルカタログをご覧ください。給与が確実に上がるように読むことができます(継続的な更新)

上記のコンテンツは、すべての人に役立つことを願っています。多くのPHP担当者は、上級者になると常に問題やボトルネックに直面します。ビジネスコードを書きすぎると、方向性がわかりません。どこから改善を始めればよいかわかりません。これに関する情報をまとめました。ただし、これらに限定されません。分散アーキテクチャ、高スケーラビリティ、高パフォーマンス、高同時実行性、サーバーパフォーマンスチューニング、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql最適化、シェルスクリプト、Docker、マイクロサービス、Nginxなど。多くの知識ポイント、高度な高度な乾物は、誰とでも無料で共有でき、必要な人は私のPHPテクノロジー交換グループに参加できます

おすすめ

転載: blog.csdn.net/weixin_49163826/article/details/108803510