他の山の石を使用して翡翠を攻撃し、高速httpを変換して高性能ネットワーク通信を実現できます

序文

あなたの友人が前の記事「boot4go-gateway と nginx パフォーマンス テストの大きな PK」を読んでいるなら、リバース プロキシ パフォーマンス PK で Nginx の Gateway を上回ることができます。標準の http パッケージに基づいた GO 言語を使用しており、Go Fasthttp よりも 10 倍高速です。 Fasthttp に基づいて開発されており、2 倍以上高速です。Fasthttp は、Go 言語における優れたパフォーマンス上の利点で有名です。なぜ fasthttp がこれほど優れたパフォーマンス上の利点を持つのかについては、インターネット上でこの点に関する記事が数多く見つかります。

要するに:

まず、接続要求および接続処理コルーチンごとにプーリングが実行されます。

2 番目に、合理的なオブジェクト プール処理を通じてパフォーマンスを圧縮できます。

3. 冗長なメモリコピーを最小限に抑えます。

ファストネット

http 接続リクエストの処理における上記 3 つの主要な最適化手法により、Fasthttp は Go 標準 Http パッケージの 10 倍のパフォーマンスを達成しましたが、http 層のレイヤー 7 アプリケーション プロトコルのみをサポートしているのは残念です。 TCP プロトコルの上にセッション層プロトコルに基づいた処理パッケージがいくつかあります。このパッケージに基づいてネットワーク通信を開発し、独自のセッション プロトコルのさまざまなクライアント/サーバー通信プログラムを実現し、同様の高い処理を実現できます。例えば、私たちが開発した MQTT サーバーミドルウェア製品では、他のセンサーや IoT 端末から mqtt 経由で送信される Mqtt プロトコルメッセージをサポートするには、独自のサーバーを実装する必要があります。 Mqtt3.1/3.1.1/5.0のプロトコル仕様に準拠しており、実装にあたっては下位通信処理の処理を考慮する必要はなく、全てMqttの3つのバージョンの処理に重点を置いて実装されています。プロトコル フレームと標準的なビジネス処理の統合、これが fastnet がもたらす利点です。

GO 言語のその他のネット ライブラリ

Fastnet プロジェクトの構想と確立の初期段階では、同様の効果を達成するために変換できる Go 言語のオープンソース プロジェクトをいくつか見つけたいと考えており、ネットワーク通信に関連する Go 言語のオープンソース プロジェクトについて調査を行いました。 ;

その中には次の 2 つのタイプがあります。

1: epoll と gnet に代表される Nio 通信のネットワーク通信ライブラリは epoll を実装することで実現され、ネットワーク通信のパフォーマンスと効率は epoll によって最適化されます

2: go-netty に代表される通信ライブラリは、netty の bootstrap/group/channel/eventLoop/eventHandler オブジェクト モードを実装することで実装されており、netty の設計モードを模倣することに重点を置いており、ネットワーク通信のアプリケーションを簡素化することを目的としています。

この2つの方法ですが、

前者のカテゴリは、redis と java によって実装された netty の nio 実装モードに基づいています。ネットワークの最下位層についての知識があまりなく、epoll の一部のコードを実際には理解していない可能性があります。主な理由一部に goc が使用されているということですが、この部分のアセンブリ コードはよくわかりませんし、時間がないので詳しくは開きませんでした。また、etcd のコードを勉強したときに、ネットワーク通信に関しては、epoll を使用していないことが分かり、処理方法は変換にネット ライブラリを直接使用するため、epoll の実装方法は決定的に放棄されました。結局のところ、Hold は存続できません。また、epoll 以外のメソッドを使用するよく知られたプロジェクトもあります。

2 番目のカテゴリでは、主に netty のオブジェクト設計パターンを Java でシミュレートすることにより、開発の効率化を最適化しますが、設計パターンの考慮により、実装では一部のリフレクションや冗長クラスが使用されます (一般的な問題)デザインパターンの)。このメソッドのパフォーマンスは大規模なテスト、特にリフレクションによってテストされますが、Java では主にビジネス プロジェクト向けであるため、CRUD などの業務に比べてリフレクションの影響は完全に無視されます。 Go では、リフレクションと基礎となる通信呼び出しのコード実行効率の悪さは数レベルの差にすぎませんが、大量の同時実行の場合、この差は大幅に拡大します。この点に関して、ここでのオブジェクト モデルから学習し、一般的に使用される Decoder/Encoder を実装し、ツール タイプの API レベルのカプセル化を試みることを検討します。

最終的な Fastnet 実装

これらのネットワーク通信ライブラリの研究に基づいて、Fastnet はそれぞれの利点を総合し、最終的なソリューションとして fasthttp の実装方法を採用することにしました。

1. コルーチンプールを使用して、接続アクセスおよび通信の入出力処理におけるコルーチンリソースを最適化します。

2. オブジェクト プールをできるだけ使用して、より頻繁なリサイクルをプールします。

3. メモリコピーを可能な限り減らす

4. サービスを提供するために一般的に使用されるデコーダーとエンコーダーのツールキット パッケージ化。

結論

いわゆる「他の山の石を使って翡翠を攻撃できる」ように、Fasthttp を借用して高性能の http 通信方式を実現し、fastnet は非常に優れたパフォーマンスのネットワーク通信も実現します。

ファストネットプロジェクトのアドレス

github.com/gohutool/boot4go-fastnet

ダウンロードして使用することを歓迎します

今後の記事では、fastnet と epoll の間の最終パフォーマンス PK を共有する予定です。

おすすめ

転載: blog.csdn.net/inthirties/article/details/126912697