独立したマイクロサービス(RabbitMqバス経由で接続)に基づくシステムを設計しています。コードは(少なくとも最初のコンポーネントについて)python(python2とpython3の両方)で記述されます。ビジネスロジックの一部を実装するモノリスアプリケーションがすでにあります。マイクロサービス、そして拡張。私が心配する1つの質問は:
異なるマイクロサービス間でコードを共有する最良の方法は何ですか。いくつかのマイクロサービスで使用する必要がある共通のヘルパー関数(データ処理、ロギング、構成解析など)があります。
マイクロサービス自体は、個別のプロジェクト(gitリポジトリ)として開発されます。共通ライブラリは、自己完結型プロジェクトとしても開発できます。これらのライブラリをマイクロサービス間で共有するにはどうすればよいですか?
私はいくつかのアプローチを見ます:
続行する方法を決定する前に、提案されたアプローチ、ベストプラクティス、過去の経験についてもう少しお読みしたいと思います。提案やリンクはありますか?
あなたの2番目のオプションは間違いなく行く方法です。一般的なライブラリを分割して、ローカルのPyPiサーバーにインストールします。
オプション1は恐ろしいものです。ライブラリの改善は、それを使用できる他の人に広めるのが難しいためです。
オプション3はオプション1と同様です。
一般的なパターンは、Jenkinsをセットアップして、ライブラリリポジトリのマスターにプッシュすると、pythonビルドを実行し、それをPyPiリポジトリに自動的にアップロードすることです。このビルドスクリプトを作成すると、ライブラリをパッケージ化してPyPiに手動でアップロードすることを心配する必要はありません。このオプションを使用すると、すべてのライブラリの更新をすぐに利用でき、他のマイクロサービスにアップグレードできる可能性があります。
独自のPyPiサーバーの設定はとても簡単です。私は好きです このガイド
Python男ではありませんが、PyPiサーバーが最良のオプションのようです。すばやくグーグルすると、チームのJava jarのNexusリポジトリに類似しているように見えます。
選択した依存関係管理ツールが動作する(読み取りと展開)ことができる何らかの中央リポジトリ(オフィス/チーム)に展開されている限り、これは適切なオプションです。
オプション1は本当に最悪です。依存関係を手動で処理する必要はありません。それは苦痛です。大学でMavenについて知る前に、Gitが複雑すぎると思ったとき、すべてのコードのマージからクラスパスの設定、依存関係の取得まで、すべてを手動で行いました。それは苦痛でした。特に、効率が重要な作業環境では、そのトラブルのほんの一部でさえ、誰にも経験してほしくないのです。
オプション3はおそらく正常に動作しますが、ローカルのPyPiに比べて実際の利点はありません(おそらく設定が簡単である以外は、実際の依存関係管理システムの利点ははるかに優れています)。
まず第一に、モノリスをマイクロサービスに分割することは常に困難になります。理由については、 分散型データ管理-データベースをマイクロサービスにカプセル化 を参照してください。
とは言っても、比較的健全なやり方を行うにはいくつかのレシピがあります。それらの1つは http://12factor.net/ です。つまり、各ライブラリとアプリケーションを個別に維持し、依存関係を明示的に管理する必要があるということです。そのルートを使用する場合は、すべての依存関係を最新のものに更新する単純なコマンドを用意し、各マイクロサービスに対して定期的に実行することを強くお勧めします。本番環境のライブラリのバージョンをロックダウンする適切なリリースプロセスを用意することが重要です。ただし、実際には、really、really依存関係が古くなるような位置になりたくないあなたはそこに何があるのか分からない。
また、バッキングライブラリをできる限りタイトで集中したものにすることに焦点を当てます。簡単に共有できるように、コアライブラリにコンテンツを追加し始めるのは自然な流れです。そうすれば、既存のスパゲッティのボール全体を共有ライブラリーにすばやく引き寄せて、現在持っている混乱に効果的に戻ることができます。したがって、他の方法で過剰修正することをお勧めします。
Pythonパッケージ依存関係ファイルからライブラリを含むプライベートGitHubリポジトリを直接指すことで、サーバーレスに移行できるはずです。PipenvとPoetの両方がこれをサポートしていると思います。