GraphSQLでServerlessなマイクロサービステンプレートを発表すること


私を知っている人のために、彼らは私が何よりも2つのものについて話すのが好きであるということを知っています:ServerlessなフレームワークとGraphql.今日、私は開発者がGraphqlでServerlessなマイクロサービスを構築できるように開発しているプロジェクトのスターターテンプレートを発表することに興奮しています.これはNX monoreposを使用して構築され、ボックスの生活の開発ツールの品質の多くを提供します.レポの中で何をしているのか、そしてあなた自身のプロジェクトのために今日それを活用できる方法について話し合いましょう.場合は、コードにジャンプする場合は、することができますfind it on GitHub .

プロジェクト目標


過去数年にわたって、私は複数のServerlessプロジェクトを開発しました、そして、それらはすべて、特にアプリケーション全体のための主要なAPIゲートウェイとしてGraphqlを使用するとき、類似したパターンに従う傾向があります.アプリケーションが成長したので、サービス・アーキテクチャは拡大しなければなりませんでした、そして、私のチームは異なるサービスを維持している困難と多くの困難を発見しました、そして、方法は合理化された方法で一緒に異なったサービスを縫い合わせます.別の問題は、パッケージを通じて地域開発を調整していた.JSONスクリプトはメモリの問題やいくつかの原因のシステムメモリリークを引き起こす.すべてのチームはまた、展開時にバンドルサイズを維持するために深い関数解析を実行する必要がありました.このプロジェクトは、これらの重要な問題を解決し、GraphqlでServerlessなマイクロサービスを構築したいとする人々にとって、一流の開発者の経験(DX)を提供しています.

サービス世代の管理


各プロジェクトでは、常にルートレベルディレクトリserverless.common.yml プラグインの設定を中心に構成され、 serverless-offline plugin . ServerlessのV 3とTypescript構成ファイルの前に、我々はポートを構成して、彼らをアプリケーションに注入しなければなりませんでした.これは多くの理由で面倒でした、しかし、主に、スタックに新しいサービスをつくるとき、それは問題を引き起こしました.開発者は新しいサービスディレクトリを作成し、サービスを足場に作り、グローバル設定を設定しなければならず、それを実装する準備ができたときには、呼び出し時にサービス名を正しく綴らなければならないでしょう.これで最大の問題は、2つのサービスが同時に作成され、ポート構成のマージコンフリクトが発生したときでした.
このテンプレートで、我々はNx monorepo toolchain これは、サービスジェネレータを作成する機能を提供します!このプロジェクトは、伝統的に見られる問題を迅速に解決するサービスジェネレータを搭載している.簡単に実行できます.
yarn workspace-generator service <service name>
次のようになります.
  • 指定した名前の新しいサービスディレクトリを作成する
  • 無制限の設定、テストスイート、リンギング、タイプスクリプト、およびラムダ関数の例
  • NXワークスペースにサービスを登録する
  • Serverlessを更新します.普通.既存の構成に基づいて次の利用可能なポートにサービスタイプとポートマッピングに新しいサービス名を含むTSファイル
  • 例えば、あなたが走るならyarn workspace-generator service my-service , 次の変更が表示されます.
    - export type Service = 'public-api' | 'background-jobs' | 'example-service';
    + export type Service = 'public-api' | 'background-jobs' | 'example-service' | 'my-service';
    export const PORTS: PortConfig = {
      'public-api': {
        httpPort: 3000,
        lambdaPort: 3002,
      },
      'background-jobs': {
        httpPort: 3004,
        lambdaPort: 3006,
      },
      'example-service': {
        httpPort: 3008,
        lambdaPort: 3010,
      },
    + 'my-service': {
    +   httpPort: 3012,
    +   lambdaPort: 3014,
    + },
    };
    
    これは、指定されたinvoke サービスを選択し、どのローカルポートを使用するかを識別します.
    デフォルトの足場は、Serverlessな設定の妥当なデフォルトを試みます.デフォルトを好まない場合は、editing generator default template .

    サービス・オーケストレーションの解決


    最も複雑なバックエンドには、SQSのようなサービスに依存するバックグラウンドジョブワーカーが必要です.残念ながら、これらはローカル環境でサービスをエミュレートするのが難しく、カスタムセットアップが必要です.以前に、私のチームはinitに必要なサービスにスタートスクリプトを拡張しようとします.しかし、ノードプロセスマネージャは、プロセスを正しく管理することはなく、サービスを実行しようとする人にとって、バックグラウンドで実行されているサービスを残し、メモリの問題を引き起こします.
    サービスの大部分が同じシステムサービスに依存するので、私たちは、オフラインのコマンドでサービスを実行する前にすべての必要なプロジェクトサービスを始めるためにDockerを活用することができます.テンプレートをベースにしたテンプレートdocker-compose.yml それは1のインスタンスを意味しますElasticMQ AmazonのSQS APIをエミュレートします.DigodDB、REDIS、またはPostgreSQLのような他のサービスを含むようにDockerイメージを拡張できますyarn infrastructure:build or yarn infrastructure:start それはあなたの最初の実行かどうかに応じて.

    関数解析


    無制限の開発の最も重要な側面の一つは、あなたのバンドルのサイズに目を維持し、ラムダでコールドスタート時間を減らすことです.これを念頭に置いて、テンプレートを利用 serverless-esbuild and serverless-analyze-bundle-plugin ボックスから関数解析を提供する.私は選ぶserverless-esbuild オーバー serverless-bundle いくつかの理由で
  • serverless-bundle 我々が必要としないか、箱から使う機能の多くを提供します
  • esbuild は一般にwebpack 束にして、かなりより少ない構成
  • 個人的に問題があったserverless-bundle 過去の機能解析を使えばread more about here そして、結果としてそれを使うのを嫌がっていました.プラグインは、以来成熟していると私が戦った機能を提供しますが、分析ツールは、彼らが選んだアナライザは私のお気に入りではないので、メリットはありません.
  • このプロジェクトでは、実行できますyarn analyze <service name> --function=<function name> あなたのバンドルのサイズの分析を取得します.例えば、あなたが走るならyarn analyze public-api --function=graphql , 次のように表示されます

    デフォルトサービス


    デフォルトのテンプレートでは、プロジェクト構造を利用する方法を示すためにいくつかのサービスを出荷しました.デフォルトのサービスは以下の通りです.
  • パブリックAPI : GraphSQL APIのセットアップと構造を含んでいます
  • 背景仕事:SQSセットアップとラムダランナーを含みます
  • 例サービス:クロスサービス通信のためのリゾルバ機能と単純なSQSメッセージジェネレータのための例を含みます
  • 他のプロジェクトには、より複雑さがあります、そして、これはあなたのプロジェクトに含めることができるすべての異なる特徴と機能を示すのを始めません.これは、すべての詳細なセットアップを通過することなく、独自のアプリケーションを開発するためのベースラインの十分な生成を意図しています.あなたが他の人に役に立つと思われる機能を参照してください場合は、問題をドロップしたり、レポの要求をプル!

    開発コンソール


    私はRuby on Railsアプリケーションを構築しました.私の好きな特徴の一つはrails console これにより、開発者は直接テストやデバッグに役立つアプリケーションコードと対話することができます.このように、私はこのテンプレートのためにこれを再現したかったです.あなたは走ることができるyarn console <library name> 対話型REPLを取得するには、そのライブラリのコードとインターフェイスできます.私はライブラリの一部としてこれを含んでいて、コード構造の性質のためにサービスでない、そして、あなたがあなたのサービスのラムダ機能と対話しなければならないエントリポイントの欠如.以下はコンソールの動作方法を見ることができます.

    次は何ですか。


    明らかに、ここでたくさんあります、そして、私は絶えずテンプレートを改良して、決してリリースしないためにプラグを差し込んでおくことができました、しかし、それは誰も助けません.私は、テンプレートの上で繰り返して、役に立つ特徴を加えて、CodeBaseをきれいにし続けます.あなたが何か提案があるか、助けたいならばrepos issues and pull requests are open !

    ありがとう!


    私は、このプロジェクトのセットアップを得るために、次の人々に彼らの助けのために特別な感謝を送りたい!

  • sudokar このプロジェクトが分岐した元のNXテンプレートのために.私は率直に言えば、この出発点なしで直面していたいくつかのワークスペース発電機問題を解決できなかった.

  • Jesse Tomchak 重要な問題を通して話して、重要な建築上の決定をするのを手伝ってください.

  • Chris Trześniewski いくつかのクリティカルパスAST構文解析問題を支援します.The serverless.common.ts 自動更新彼の助けなしに可能ではなかっただろう.

  • Tápai Balázs 私が最初にNXを使うことを納得させるために.私は糸のワークスペースを試して、率直に言って、私は何も正常に動作することができなかった.NXは右のコールであり、彼の提案は、私たちのコア機能の多くを変更する必要があっても大きなフィットのために作った!

  • Nacho Vazquez and Dario Djuric 私が戦っていて、私がこのテンプレートのより良い長期解決を考え出すのを手伝っている若干のNX構造決定を援助するために.