高性能の長いポーリングチャット

背景



画像 Laravelには、700〜1000人のリアルタイムトラフィックを持つサイトがあります。 以前は、サイトはサードパーティのチャットを使用していました。 彼はWebSocketsを使用しました。



ある時点で、チャット開発者が高負荷のためにサポートを拒否するまで、すべてが順調でした。 その瞬間から、代替チャットシステムの検索が始まりました...



技術の選択


現在、Opera12やIE8などの古いブラウザを使用している人はいないと言われますが、そのような人々はまだかなりいるので、 Long Pollingを選択することにしました。



最初は、サイトは共有ホスティングでホストされていたため、非常に多くの制限がありました。 ただし、ホスティングは負荷を処理しました。 喜んだ。 そして、唯一可能なチャットの実装は、PHPでの長いポーリングでした。



実装



言葉から行為へ


画像








原則は明確でシンプルです。 Ajaxは、メッセージを読み取るサーバーにリクエストを送信します。 要求の期間、またはサーバーからの応答は、誰かがメッセージを追加したかどうかによって異なります。 つまり、要求の後、新しいメッセージがあるかどうかを確認するサイクルが開始され、新しいメッセージがある場合はサイクルが中断され、新しいメッセージと共に応答が返されます。 応答を受信した後、要求が繰り返されます。 などなど。



PHPでこのようなことを実装するのはそれほど簡単ではありません。 私は私の人生の合計約3時間の実装に費やしました。



問題


ただし、 MVP(Minimum Viable Product)ステージのままにしました。 そして、結局のところ、無駄ではありませんでした。 本番サイトで機能をテストすると、単にクラッシュしました。 工作員は1〜2分以内に満杯になり、サーバーを消滅させました。



少し考えて、それがサーバーだと判断しました。 そして、しばらくしてからサイトはVPSに移動しました。 構成が弱く、RAMが1GBしかないことをすぐに言います。 ただし、VPSチャットでは3〜4分続きました。 すでに良い。



その結果、長い間インターネットを発掘した後、PHPでチャットを書くのは10人以上の負荷があれば意味がないことに気付きました。



次の2つのオプションがあります。



  1. nodeJSを配置し 、Webソケットでチャットを作成する
  2. 他の何かにサービスを書く


そして、私が選んだのは何だと思いますか? もちろん、2番目のオプション、そうでなければ私はこの記事を書きません。



画像 サーバーアプリケーション、特にクロスプラットフォームのC ++ \ C実装はそれほど多くないため、特にSyが苦手なので、 Lazarusを選択しました。 彼がFPHTTPServerのようなコンポーネントとアプリケーションの実装例を持っているのは良いことです。

また、手元にLinuxがないことを予約します。 Windowsですべてのアプリケーションを作成します。 別のシステムでアプリケーションを再コンパイルするのは、つばを吐くときだと確信していました。 結局のところ、モットーも言っています! 「一度書く-どこでもコンパイル!」 しかし、ラップトップに2つのシステム(win7 + linux mint)があれば成功しました。



winでアプリケーションをコンパイルしたら、機能をローカルでチェックしました。 すべてが時計のように機能しました。 それにもかかわらず、それは単純なexe-shnikであり、さらに何かを望んでいました-apacheのような通常のサービスを書くこと。 Lazarus-これはDelphiではありませんが、非常によく似ています。 まず、無料です。製品の品質に関する疑念が自動的に高まります。 そして、第二に、しかし、第三に、それでもn番目の量-これに関連するすべての不便。 Lazarusフォーラムの質問のほとんどは未回答のままです。 これはとても悲しいです。 「キャッチできないエラー」などのポップアップエラーを含むアプリケーションのデバッグと同様。 しかし、幸いなことに、週の終わりに、PHPで記述された機能の類似物を3時間で完成させました。



象に満足して、Linuxでアプリケーションをコンパイルすることにしました。 サーバーにrootとしてログインし、apt-get-install lazarusコマンドを実行した後、Lazarusをすばやくインストールし、ソースをコピーし、インターネットで以前に発見されたlazbuild -r project.lpiコマンドを使用して、アプリケーションをコンパイルしました。 唯一、本当に、最も成功した最速のステージでした。



すでに実際の負荷でチャットの作業を確認した後、自分のアイデアが正当化されていることに気付きました。 チャットは機能しましたが、サーバーの負荷はそれほど増加しませんでした。 喜んだ。 これで、Windowsに戻って、改良版であるサービス(デーモン)の作業を続けることができました。 予想どおり-時間は少し遅れましたが、すべてがWindowsで機能しました。



画像








Linuxでは、プロジェクトはコンパイルされませんでした。 コンパイル時に、 インターフェイスユニットが見つからなかったことを示すエラーが発行されました。 とても奇妙でした。 Lazarusフォーラムでは、明確な回答は表示されませんでした。 多くの人はそれを再インストールしたときにそれが機能することを書いただけです。 ただし、再インストールは役に立ちませんでした。 最終的に、LazarusのバージョンがLinuxのバージョンとは異なることに気付きました。 リポジトリの更新に失敗しました。 より正確には、リポジトリは更新されましたが、Lazarusは同じバージョンのままです。



次に、wgetを使用してインストールパッケージをダウンロードしようとしました。 その結果、エラー177が発生しました(正確な番号はもう覚えていません)。 別の感情が飛び散った後、私は問題がリンクのある種のシンボルにあることに気付きました。 インストールパッケージをMS OneDriveにアップロードし、短いリンクを作成した後、ファイルを正常にダウンロードしました。



次に、古いlazarusを削除し、新しいバージョンをインストールしました。 そして、コンパイラは何と言ったと思いますか? もちろん! 理解できない間違い!



インターネットで答えを見つけるという過去の苦い経験に基づいて、私はLazarusの設定を勉強し始めました。 問題は簡単であることが判明しました-何らかの理由で、Lazarusをインストールするときに、configsで新しいフォルダーを作成しませんでした。 Daptyは以前のバージョンから残っていますが、apt-get remove --purgeで古いlazarusを削除しました。 さて、古い構成を保存し、フォルダーを削除して、Lazarus IDEを再コンパイルしようとしました。 魔法のように、その後configフォルダーが作成され、最終的にLinux用のデーモンをコンパイルすることができました。



勝利! かどうか?


画像 サービスアプリケーションは正常にコンパイルされましたが、今はどのように起動できますか?



ご想像のとおり、サービス開始時にエントリを作成する単純なスクリプトは機能しませんでした。 さらに、未回答の問題を含むフォーラム投稿を再び見つけました。



インターネットをさらに1時間掘り下げた後、 start-stop-daemonを使用してサービスを開始する方法を見つけました。 最終的に、Lazarusの例で投稿された起動スクリプトのコードが機能することを実感しましたが、それは端末から実行した場合のみです。 そうしないと、「一部のファイルが見つかりませんでした」などのエラーが発生します。



フィニッシュライン


サービスを通じてダイモンを開始/停止する際の問題はまだ解決していません。 それにもかかわらず、私は完了した仕事に満足していました。 さらに、チャットは4時間1000の接続に耐えることができました。 残念ながら、サーバーの構成により、サーバーの動作時間が長くなりませんでした。 ただし、「チャットを表示」ボタンを使用してこの問題を解決しました。 その結果、チャットの負荷は本当に必要なユーザーのみに与えられました。



All Articles