Table of Contents
シングルトンパターンを理解する
シングルトンパターンは、クラスを単一インスタンスに制限する、作成設計パターンで、グローバルアクセスのポイントを提供します。 まず、「4」ブックで正式化し、ソフトウェアシステムで共有リソースを管理するためのコーナーストーンになりました。 パターンは、構成データが本質的にグローバルに存在し、アプリケーションのすべての部分に一貫して維持されるため、構成管理のために特に適しています。 単一インスタンスを強制することによって、シングルトンパターンは、複数の構成オブジェクトの生成を防ぐことができ、それは、非同期動作と非同期化につながる可能性があります。
シングルトンの主な特徴は、インスタンスを取り出し、concurrencyの慎重な処理を行うための、プライベートコンストラクタ、静的方法を含みます。 単一スレッド環境では、単純な怠惰な初期化作業が、分散およびマルチスレッドシステムには、ダブルチェックロック、静的な初期化、またはJavaののような言語固有の構造を使用して、またはC#のを分散およびマルチスレッドシステムがより堅牢なメカニズムを必要とする。 パターンのインスペクティブ/パフォーマンスは、またはパフォーマンスを制限することができます。
分散型システムにおける構成管理の役割
マイクロサービスアーキテクチャ、IoTネットワーク、または産業用制御システムなどの分散エンジニアリングシステムが、正確で同期された構成データに依存します。構成は、データベース接続文字列とAPIエンドポイントから機能フラグと運用パラメータに至るまで、すべてを網羅しています。各ノードまたはサービスが構成の独自のコピーを維持したときに、一貫性が現れ、診断が困難である障害を引き起こします。例えば、生産は、設定ファイルの異なるバージョンを使用して、サイレントなデータやサービスが、データが劣化する原因となる場合があります。
分散構成の課題
分散型環境は、設定のドリフト、ネットワークのパーティション、およびダウンタイムなしで動的更新の必要性を一意に示します。 10 または数百のサービスが同時に変更を再ロードする必要がある場合は、伝統的なファイルベースの構成は、管理不能になります。 さらに、設定ファイルの秘密を一元化し、暗号化されたストレージを上回るようなセキュリティ上の懸念。 シングルトンパターンは、構成データの真理の単一、権威のあるソースを提供することによって、これらの問題に対処します。 しかし、パターンは、プロセスとネットワーク全体で動作するように適応する必要があります。
シングルトンパターンを構成管理に適用
設定管理用のシングルトンを実装する際、通常、耐久性のあるソース(ファイル、データベース、または外部サービスなど)から構成をロードし、メモリ内でキャッシュするクラスを含みます。同じプロセス内のすべてのモジュールとサービスは、静的[]メソッドを呼び出し、すべての同じデータを参照する。この一元化は、更新を簡素化します。設定の変更が、シングルトンインスタンスのみがリフレッシュされる必要がある場合、すべての消費者は、シングルトンのイベントやイベントのメカニズムを露出させると、自動的に新しい値を取得します。
オブジェクト指向言語では、実装はしばしばこのように見えます。
- 直接インスタンス化を防ぐためのプライベートコンストラクタ。
- [ 静的読み書きのみ レイジー<ConfigManager> フィールド(C#)または 揮発性静的インスタンス) をダブルチェックロック(Java)で。
- [] 単一インスタンスを返すパブリック静的プロパティ]。
- []LoadConfiguration()[メソッドは、最初のアクセス時に呼び出されます。
シングルトンのスレッド安全
スレッド安全は、複数のスレッドまたは非同期タスクが同時に設定にアクセスできるため、重要です。最も簡単なスレッドセーフなパターンは、CLR(Common Language Runtime)またはJVMが一度だけ実行する保証である静的イニザを使用することです。 オーバーヘッドをロックする遅延初期化のために、.NETのクラスは、組み込みのスレッドセーフなラッパーを提供します。 Javaでは、シングルトンパターンは、シリアル状態の同時接続を提供し、非正規化が保護されます。 は、すべてのトランジティブな安全を確保するために、すべての変更が行われます。
高度な考慮事項: 分散シングルトンおよび外部ストア
古典的なインプロセスシングルトンは、単一のアプリケーション内で完全に機能しますが、分散システムには、複数のプロセスやサービスを頻繁に共有する一般的な構成を要求します。このような場合、シングルトンパターンは、ノード間でアクセスを調整する分散シングルトンに拡張することができます。これは、通常、etcd、Consul、またはZooKeeperなどの外部設定ストアを使用して、ローカルキャッシュと組み合わせることによって達成されます。ローカルインスタンスは、外部ストアがクロスプロセスの一貫性を確保する一方で、プロセスごとにシングルトンとして機能します。リーダーの選挙アルゴリズムは、時々、競合する時間だけを格納する保証するために使用されることがあります。
クラウドネイティブ構成管理
Kubernetesのような近代的なクラウドネイティブプラットフォームは、ConfigMapsとSecretsを通じて外部設定管理を組み込んでいます。しかし、アプリケーションレベルのシングルトンは、これらの値のキャッシュによって、タイプされた検証されたインターフェイスを提供することによって、まだ役割を担っています。例えば、.NET microserviceは[]Options Pattern]をシングルトン登録設定スナップショットで使用しているかもしれません。これは、[[FLT]の仕組みを一元化した機能で、単一の機能が、単一の機能が統合されます。
外部リンクから信頼できるソースへの外部リンクは、 ] を、シングルトンパターン] のWikipedia記事が、固体の概要を提供します。ただし、 は、 設定サーバーのMartin Fowlerの議論[] は、分散されたコンテキストで詳述します。 実用的な実装ガイドでは、 .NET で構成に関するMicrosoft のドキュメントは、オプションの有効にどのようにパターンを使用するかを示す。
リアルワールドの事例とベストプラクティス
多くのエンジニアリングシステムは、シングルトンベースのコンフィギュレーションマネージャに依存しています。大規模なeコマースプラットフォームでは、単一のコンフィギュレーションサービス(多くの場合、分散キー値ストアによってバックアップ)が機能フラグとA / Bテストパラメータを制御するために使用されます。シングルトンパターンは、このコンフィギュレーションをロードし、メモリにキャッシュするクライアントライブラリに適用されます。新しいビルドがデプロイされると、クライアントライブラリはセントラルサービスからキャッシュをリフレッシュし、すべてのサーバーインスタンスが更新秒を受け取り、コンプリートされた状態が確認できます。このコンフィグは、単一のツールで、単一のツールが、単一のツールで使用されて、単一のツールが無効にできます。
シングルトン構成マネージャに最適なプラクティス
- ]スタートアップで、初期にエラーをキャッチするValidate設定eagerly。 遅延障害は、大惨事である可能性があります。
- []サポート動的リロード]]を再起動しなくても、イベント主導の通知を外部ストアから使用してください。
- [] 専用のシークレットマネージャー(HashiCorp Vault)を使用して、コンフィギュレーション[から秘密を分離し、環境変数または安全なマウントを介してシングルトンにそれらを注入します。
- [] 監査性およびデバッグのためのログ構成変更];タイムスタンプと変更のソースを含みます。
- [ 設定ストアをモック可能にするで単調の単調をテストする。 静的クラスではなく、単調の寿命で依存注射を使用するコンサイダー。
潜在的な落札とザムを回避する方法
シングルトンパターンは、ユニットテストが困難になるグローバル状態を導入するために批判されています。ファイルシステムやネットワークから読み込む構成シングルトンは、モックに本質的に困難です。これを軽減するために、依存関係の反転のようなパターンを採用:インターフェイスを定義します[]]、シングルトンクラスでそれを実装し、IoCコンテナをシングルトンとして登録します。テストは、モックの実装を注入することができます。別の下段は、シングルトンクラスでロックされた設定を解除するという結果のオブジェクトのパフォーマンスです。
最後に、共有リソースごとにシングルトンを使用するテンポを避ける。パターンをオーバーユースすると、コンポーネントがしっかりと結合されるモノリシックなデザインにつながることができます。シングルトンを真にグローバルに予約し、構成などの読み取り管理されたリソースを準備します。頻繁に変更したり、スコープ付け(例えば、パーユーザーまたはパーリクエスト)する必要がある状態については、ファクトリーやプロトタイプなどの他のパターンはより適切です。
コンテンツ
シングルトンパターンは、分散エンジニアリングシステムにおける一貫した構成管理を確実にするための強力なツールです。 構成データへのアクセスを一元化することにより、それは、矛盾を排除し、更新を簡素化し、リソースの効率性を促進します。 しかし、そのアプリケーションは、分散環境の現実性に適応する必要があります:スレッドの安全、外部構成ストア、および構成性。 注意を払って実装するときは、不変なスナップショット、依存の注射、およびイベント主導のリロードを使用して、シングルトンパターンは、クラウド設計と統合する複雑な構成を組み合わせ、および構成を組み合わせるの一貫性を維持するための堅牢な基盤を提供します。