PostmanEngineeringが100万の同時接続を処理する方法

投稿日:

PostmanのServerFoundationチームは、Bifrostウェブソケットゲートウェイの起源を共有しています

(2020年12月22日)

マーベルシネマティックユニバースでは、Bifrostはの領域間を瞬時に移動できるレインボーブリッジの名前です。神々と人類。同様に、同様に魔法のように、Bifrost Websocketゲートウェイを使用すると、PostmanクライアントはPostmanサービスに即座に接続できます。

スプラッシュ解除

Toni Reed による写真

以前に(Postman Engineeringがマイクロサービスを行う方法)で共有したように、すべてのソフトウェアアーキテクチャは継続的に処理されています。現実の世界で活動するということは、新しい状況に適応するために古い考え方を時々再評価することを意味します。これがソフトウェア設計の自然な進化です。

これは、Postmanのエンジニアが大きくなりすぎたサービスを削ってBifrostWebSocketゲートウェイを開発した方法の話です。

の開発チームPostman

Postmanのほとんどの開発チームは、ドキュメントやバージョン管理などの単一のコアドメインに焦点を当てた部門横断的なチームで働いています。 ドメイン駆動設計の原則に基づいて、各チームはPostmanユーザー向けに内部マイクロサービスとPostman機能を開発します。

ほとんどのエンジニアは分隊、一部はエンジニアリング組織全体で共有されるコンポーネントを構築する機能チームで働いています。 Server Foundationチームは、Postmanの機能チームの一例です。これらのエンジニアは、他のチームが独自の機能を構築、出荷、および監視するために使用するユーティリティを作成します。このチームは、AWSとインフラストラクチャの専門家が常駐する場所でもあります。

Server Foundationチームは、エンジニアリング組織全体で使用されるものを作成および管理するPostmanの機能チームの例です。

Postmanのほとんどのマイクロサービスは疎です結合されているため、他のチームから独立して進化できます。残念ながら、サービスが大きくなりすぎて、一見無関係に見える幅広いサービスを提供することがあります。これらのサービスにより、チームは迅速に反復できますが、肥大化したモノリス、大きな泥だんご、またはこれらの扱いにくい生き物と呼びたいもののように振る舞うようになる可能性があります。

これがPostmanで発生すると、多くのエンジニアがさまざまなチーム間でコードに貢献することになり、更新ごとにすべてのチーム間で慎重に調整する必要があります。

モノリシック同期サービス

大きくなりすぎたPostmanサービスの1つ効率的に管理されることを同期と呼びます。これには、ローカルマシン上のPostmanクライアントのすべてのアクティビティをPostmanサーバーと同期するという困難なタスクがあります。 Postmanでのすべてのユーザーアクションにより、パブリッシュ/サブスクライブパターンに従って、WebSocket接続を介して処理される一連のAPI呼び出しが発生するため、ユーザーとユーザーの間で情報がリアルタイムで流れます。チーム間で。

たとえば、Postmanにログインしてコレクションを更新すると、次のようになります。

  1. Postmanコレクションにパラメータを追加します。
  2. Postmanは、プロファイルとともに保存されているバージョン管理に更新の記録を保持します。
  3. Postmanは、コレクションの閲覧者に最新の情報をリアルタイムで表示します。

同期は元々、コレクションの更新などのデータベーストランザクションを処理することを目的としていました。ただし、昨年の今回は、コレクションに登録しているすべての人に最新バージョンを通知して表示するなど、追加のアクティビティも管理しました。

圧力下で同期

車を組み立てるとき、フレームは他のすべての構造物の主要な支持構造です。コンポーネントが付属しています。フレームの小さな亀裂は大したことではないように思われるかもしれません。おそらく、低速での運転に気付かれない可能性があります。ただし、高速では、ミスアライメントをエスカレートさせる波及効果があります。一見取るに足らない亀裂により、振動が車両の残りの部分全体に増幅され、炎のような残骸にエスカレートします。

「小さなシステムでは見過ごされ、より複雑なシステムでは避けられなくなります。”
Kunal Nagpal 、Postmanのエンジニアリングマネージャー

SyncはPostmanで最も初期のサービスの1つであり、そのモノリシックアーキテクチャにより、チームはPostmanの機能を迅速に出荷できました。時間が経つにつれて、それはますます多くの責任を処理し始めました。今日まで、Syncサービスはエンジニアリング組織全体に広範な影響を及ぼしており、多くのエンジニアは、Syncが予期しない動作をしたり、予定されたダウンタイムが発生したりすると、苦痛を感じます。

2019年、SyncはWebSocket接続とデータベースの両方を処理していました。トランザクション。当時、1,100万人のユーザー間でコラボレーションが増えていたため、Postmanはピーク負荷時に100万の同時接続に近づ​​いていました。

Postmanのほぼすべてのマイクロサービスの基盤として、同期への負担が増大していました。

  • バックプレッシャによるカスケード障害: Syncにデプロイするたびに、接続されているPostmanクライアントが切断されますWebSocketを介して。 100万個のソケットが再接続すると、サーバーリソースが劣化し、切断が増える可能性があります。これにより、予測可能ですが避けられないサージが発生し、回復に6〜8時間かかる場合があります。
  • ユーザーエクスペリエンスへの影響:頻繁には発生しませんでしたが、接続が切断されると、チームワークスペースで最新の更新やアクティビティが表示されるのが時折遅れることになりました。
  • メンテナンスコストが高い:すべてのチームが同期に依存していたため、Postmanのほぼすべてのエンジニアがその方法を学ぶ必要がありました。切断された接続を処理し、新しい接続を開始してから、データ内の競合を調整します。

Server Foundationチームは、Webソケット接続の効率を高め、それらをWebソケット接続とは別に処理したいと考えていました。同期サービス。目的地は明確でしたが、そこにたどり着くまでの道のりは明確ではありませんでした。

「これはソフトウェア設計の自然な進化です。マイクロサービスは機敏に始まりますが、蓄積されるため、分解する必要があります。より多くの機能を導入しようとしていたため、ソケット処理を同期から分離したかったのです。」
Yashish Dua 、ソフトウェアエンジニア郵便配達員

一部の内部サービスが大きくなりすぎて、チーム間の慎重な調整が必要

これが起こったことです

ステップ1:組織の賛同を得ました

取り組む最初の課題は技術的なものではありませんでした。これは、Postmanの最初の野心的な展開ではありませんでした。エンジニアリングは、過去のゴーアラウンドから人々から始めることを学びました。 2019年10月から、Server Foundationのエンジニアは、目標をより広範な組織に伝え、すべての依存サービスのメリットを説明するための一連のレビューを実施しました。

この新しいシステムが成功した場合、接続の切断を処理します。そして余波に対処することはもはや当たり前ではないでしょう。これは、他のエンジニアリングチームが新しいシステムをサポートして移行するための真のインセンティブでした。このオープンなコミュニケーションと調整は、このプロジェクトの期間中継続されます。

ステップ2:未知の未知数を特定しました

エンジニアリングは、彼らが向かっている方向を知っていました。それにもかかわらず、彼らはすべてのシナリオを検討し、基礎となる概念をよりよく理解するための時間。エンジニアは、他の利害関係者との探索セッションをスケジュールして、未知の未知数、既知の既知のものよりも大きなリスクをもたらす可能性のある予測不可能な条件を特定しました。

郵便配達員組織は調査と計画に慣れていますが、プロセスのこの部分この変更の重大な性質のため、通常よりもはるかに長い時間がかかりました。彼らはさまざまなオプションを調査し、補助要件を検討し、2か月の計画を立てました。

ステップ3:BifrostWebSocketゲートウェイを構築しました

Bifrostはで構成されています2つの部分:

  • パブリックゲートウェイ:ゲートウェイはFastifyWebフレームワークとAmazonAWSを使用しますすべてのWebSocket接続を管理する中央メッセージブローカーとしてのElastiCacheforRedis。
  • プライベートAPI :APIまた、Fastifyを低オーバーヘッドのWebフレームワークとして使用して、トラフィックを他の内部Postmanサービスにプロキシします。
Bifrostは、パブリックゲートウェイとプライベートAPI

ステップ4:新しいゲートウェイをテストしました

Postmanのエンジニアが機能を出荷する準備ができたら、彼らは、関連する機能とともに、その機能をテストすることが期待されています。ほとんどすべてのPostman機能がWebSocketに依存しているため、このリリースではすべての機能をテストする必要がありました。さらに、WebSocketの自動テストのフレームワークはPostmanでまだ設定されていなかったため、すべてのテストはBifrostの前に手動で完了しました。

これは困難な道のりでしたが、2020年1月末までに、エンジニアリングには実用的な概念実証がありました。

ステップ5:新しいものに移行しましたゲートウェイ

ElectronアプリやWebなどのすべてのPostmanクライアントは、Godserverという名前の別のコアサービスへの最初のブートストラップ呼び出しに依存しています。このサーバーは、クライアントのアクセスと構成を決定し、エンジニアリングが製品の段階的な展開を制御する方法です。これはすべて事前に決定され、Godserverによって制御されているため、Bifrostゲートウェイへの移行では、Postmanクライアントコードを1回更新する必要はありません。

ServerFoundationチームは、チームの移行手順、必要なコードの変更、および構成について概説しました。適用する。数週間の間に、依存サービスはSyncに依存することからBifrostベースのWebSocket接続の処理に移行し始めました。 Godserverは、Bifrostが負荷を処理し、エッジケースにどのように対応するかを確認するために、ますます多くのトラフィックを新しいWebSocketゲートウェイに転送しました。

「これは、航空機のエンジンを途中で変更するようなものです。フライト。」
Numaan Ashraf 、Postmanのエンジニアリングディレクター

ステップ6:サービスのスケーリング

Bifrostゲートウェイは機能していました!

しかし、ゲートウェイの計画と開発中に、Postmanはさらに100万人ほどのユーザーを獲得しました。そして、他のエンジニアリングチームは、この間、自分の作業を一時停止していませんでした。 バージョン管理ロールベースアクセス制御(RBAC)などの新しいコラボレーション機能が信頼されていました情報をリアルタイムで更新するために、WebSocketに重点を置いています。新しいゲートウェイを真にテストする今後の製品リリースが殺到しました。

Bifrostは、増大する需要をサポートし、WebSocketの処理を拡張する準備ができていました。

  • 水平スケーリング:ほとんどの場合、Postmanサービスは、より大容量のインスタンスにスケーリングするか、フリートにコンピューティングインスタンスを追加することで、使用量の増加に対応します。そのため、Postmanのエンジニアは通常、AWS EC2のサイズと計算能力を高めることで、サービスを up スケールアップします。たとえば、AWS ElasticBeanstalkを使用したインスタンス。ただし、Bifrostの場合、WebSocket処理は out を使用して その他 マシン。その最適な効率は、小さいサイズのインスタンスが多数使用されるときに達成されます。このタイプのハイパーホリゾンタルスケーリングは、クライアントが高いネットワークスループットを必要としないため、Bifrostに適しています。また、各マシンをより少ない接続に制限すると、障害の爆発範囲が制限されます。
  • CPUとメモリの新しい負荷率:ほとんどのPostmanサービスは、CPU、メモリ、レイテンシなどのスケーリングメトリックの1つのディメンションで効果的にスケーリングできます。ただし、Bifrostの場合、メモリとCPUの両方の使用量がさまざまなレベルのスループットでの操作に異なる影響を与えるため、状況は少し微妙になります。これを説明するために、Bifrostは負荷率に基づくカスタムスケーリングメトリックを使用します。負荷率は、カスタムの非線形スケーリングプロファイルを与える多次元計算です。

Postmanエンジニアリングによって行われたアーキテクチャとテクノロジーの決定について詳しく見ていきましょう。

Bifrostアーキテクチャとテクノロジースタック

BifrostシステムゲートウェイとAPIの2つの主要なコンポーネントがあります。この2つの部分からなるアーキテクチャは、システムの安定性とスケーラビリティの秘訣です。

ゲートウェイは、すべてのWebSocket接続の終端点として機能します。商用ゲートウェイは購入可能ですが、長年の最適化で蓄積されたレガシービジネスロジックを維持することが重要でした。 Postmanのエンジニアは、たとえば、プロトコルハンドシェイクを利用したい場合など、WebSocketの処理方法を完全に制御したいとも考えていました。 Bifrostゲートウェイでは、RedisにAmazon ElastiCacheを使用して、リーダーノードとライターノードを使用してRedisキャッシュにクエリを実行できるようにしました。読み取りおよび書き込み操作のためにトラフィックを2つのノードに分割することで、チームはさらにパフォーマンスを最適化できます。

「Bifrostは、すべてのWebSocket接続のゲートウェイです。これは、すべてのPostmanクライアントのプロキシであり、内部Postmanサービスの低レベルのソケット操作を処理する責任があります。」
Mudit Mehta 、 Postmanのソフトウェアエンジニア

Postmanの他のほとんどすべてのサービスは、Node.jsのリアルタイムMVCフレームワークとして Sails を使用しています。 。ただし、Bifrostゲートウェイの場合、エンジニアは、高速で最適化されたメモリ使用量で大量を処理できるパフォーマンスの高いバックエンドフレームワークを必要としていました。繰り返しになりますが、Sailsが提供する高レベルの抽象化の下で、ソケット層をさらに深く掘り下げたいと考えていました。そこで、彼らは Fastify に目を向け、 socketio-adapter ミドルウェアをフォークして自分たちの使用に合わせて最適化しました

Bifrostゲートウェイは、AWS、Redis、Fastifyを使用してWebSocketを処理しました / em>

ゲートウェイに加えて、Bifrostの他のコンポーネントは他のPostmanサービスへのトラフィックをプロキシするプライベートAPIです。これは柔軟なビジネスルールに基づいているため、インバウンドトラフィックを転送する方法と場所について常に再評価されます。

「シンプルなコンポーネント。複雑なロジック。」
Kunal Nagpal 、Postmanのエンジニアリングマネージャー

両方のコンポーネントについて、エンジニアリングチームは自分たちでロールすることにしました。 Bifrostのゲートウェイ部分は頻繁に更新されませんが、チームはWebSocket処理のより深い層で何が起こるかを完全に制御できます。 BifrostのAPI部分は操作の頭脳であり、着信リアルタイムメッセージを標準のHTTP呼び出しに変換します。 SyncおよびBifrostゲートウェイから独立したコンポーネントとしてより迅速に更新することもできます。

その秘密のソースを覚えていますか? Bifrostをこれらの2つの個別のシステムに分離することで、両方の部分をそれぞれの目的に合わせて最適化できます。

旅はまだ終わっていません

すべてのジューシーなエンジニアリングストーリーと同様に、これで終わりではありません。 。ポストマンエンジニアリングの次の予定について、いくつかの崖っぷちを残しておきます。

  • 追加の冗長性を構築する:Redisキャッシュは中央のメッセージブローカーです。 WebSocketの処理は依然として単一障害点に依存しているため、キャッシュがダウンした場合はどうなりますか?
  • 帯域幅とスループットを向上させます:ゲートウェイは現在10倍の同時実行性を処理できますが、Postmanコミュニティは急速に成長しており、エンジニアリングはより多くのコラボレーション機能を構築しています。より多くのWebSocketトラフィックを処理する必要性が急速に高まっています。
  • モノリスの分解を続けます:同期サービスには、コードベース内で絡み合っている他のサービスの寄せ集めが含まれています。ソケット処理をSyncから切り離すと、他のサービスに対するグリップが緩むため、他のサービスをより簡単に切り離すことができるようになります。

これは、Postmanエンジニアリングの動作の舞台裏を垣間見ることができます。塹壕からのより多くの物語をお楽しみに。

🙏🏼KunalNagpal、Yashish Dua、Mudit Mehta、ShamasisBhattacharyaによるテクニカルレビュー。

元々は https://blog.postman.com 2020年12月22日。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です