フロントには、主にマイクロサービスの概念を理解するために、知識SpringCloudを学ぶためにしばらく時間がかかったし、マイクロコンポーネントのシリーズを使用して実装サービスの着陸をSpringCloud。これらのコンポーネント自体が基本的な動作は以上になります続く、シンプルであり、それはまたSpringbootの恩恵を受けて学ぶことは私たちに多くの利便性をもたらしました。実用的なアプリケーションでは、いくつかの穴に実行するかもしれませんが、限り、私たちは基本的な原則を把握するように解決することができます。
また、1はSpringCloudで、解決策は、2つが含まれるマイクロサービスの前で話した、もう一つはダボ+飼育係がある、のはダボ+飼育係は、マイクロサービスを実装学びましょう。
最初の研究マイクロサービスでは、マイクロサービスの概念を理解して、前のサービスおよびマイクロモノマーアプリケーションの長所と短所を比較して、マイクロは、その最も重要なサービスの2、主要な技術的なサービスポイントを達成するために話を聞きました管理とサービスの間の通信。
ダボ+飼育係のマイクロサービスを実装するために、我々はこれら二つの技術の点を解決しなければならない、ダボは、サービス間の通信を実現することができるRPC通信フレームワークです。ZooKeeperのは、メインフレームを管理するための分散コーディネーションサービスです。分散環境では、調整および管理サービスは、複雑なプロセスです。
まず、
それは我々が最初の調整技術を配布しているものを学ばなければならない、飼育係は、分散協調技術であると言います。分散協調技術は、主に「ダーティデータ」の影響を防ぐため、彼らは秩序ある重要なリソースのいくつかの種類にアクセスすることを可能にする、複数のプロセス間で分散環境との間の同期制御を解決するために使用されます。
我々は分散ロックを必要とする理由まず、我々は、簡単な例を理解する必要があり、我々は、複数のサーバーを展開する場合、そのようないくつかのクリアデータをやっなどの一般的なシステム上のいくつかの定期的なタスクは、この時点でこれを実行する各サーバーは、そこにあります定期的なタスク、そうでない場合は、ロック機構は、その原則に従って、このタスクのタイミングが複数回実行されるので、それは非常に可能性がダーティデータです。
これは、時限タスクであるため、定期タスクを指し、それは同じ時間を入力するためにバインドされ、これは高い並行性を必要としない、我々はまた、検討する必要があります。もう一つは、特定の方法が、何度もアクセスし、同時に複数のノード上のプロセスが存在します、分散環境では、大きな可能性の高い同時実行で、我々は同時に、同じことができることを確実にするための方法を必要とします実行のスレッドは、スタンドアロン環境では、Javaは実際には、並行処理に関連するAPIの多くを提供していますが、分散型のシナリオにおけるAPIは、何もすることはできません。それは単にJavaのアピ分散ロックする機能を提供していません。だから、分散ロックの実装のための様々なプログラムがあります。
私たちは、ロックがどのようにの一種である配布する必要がありますか?(この方法でロックする、例えば、リソースロック共感)
-
アプリケーションクラスターが分散配置で保証することができ、同じ方法は、同時に機械のスレッド上で実行することができます。
-
リエントラントロックする場合は、このロック(デッドロックを回避するため)
-
このロックは、最良のブロッキングロック(この事業は考慮する必要があるかどうかではない)であります
-
そこロックを取得非常に利用可能であり、ロック機能を解除します
-
より良い性能のロックを取得し、ロックを解除
分散ロックの実装いくつかのオプションがあります。
-
Memcached:使用memcachedの
add
コマンドを。このコマンドは、アトミック操作であり、のみにkey
するための不在add
成功し、それはスレッドがロックされていることを意味します。 -
Redisの:MemcachedのとRedisのは、使用と同様
setnx
のコマンド。また、このコマンドは、アトミック操作であり、唯一の中key
にするための不在set
成功します。 -
飼育係:ロックと分散キューを実現する一時的な順序を使用して飼育係ノード。飼育係は、当初の設計、分散ロック・サービスを実現することです。
-
チャビー:Googleの会社は粗粒分散ロック・サービス、パクシコンセンサスアルゴリズムの基本的な利用を実現します。
分散ロックの基本的な原則の第二に、実現
3つの基本機能があることを、ロックを達成するために:ロック、アンロック、ロック・タイムアウトを、我々は単に分散ロックの基本的な原則を紹介するRedisの方法を実現するには、次のコードは、擬似コードです。
2.1ロック
Redisの操作が最も簡単に使用することであるロック達成setnx
の鍵は、ビジネス名に従って名前を付けることができますコマンドを、基本的なモデルは、我々は、特定の商品の在庫をロックするなど、名前空間+対応するパラメータである、我々は在庫のIDを使用することができますそれは、彼らは方法はありませんが、我々は、例えば、そこに2つの方法があり、在庫の処理を必要とする、さまざまな方法で同じロックを追加することができ、実際に、引数としてロックされたが、我々は同じ名前空間とパラメータを使用していますまた、ロックすることができます。
setnx(lock_sale_商品ID、1)
私たちは、キーがすでに存在する場合は、設定方法、他のスレッドがロックされていることを示す行った場合、キーが存在しない場合は、待機する必要があり、ロックが失敗したつかむ、それがロックを取得することを意味し、この方法は、正常に動作します。
2.2のロックを解除
他のスレッドが入ることができるようにロック手順があるので、それはプロセスのロックを解除する必要がありますが、タスクを実行するスレッドが、私たちは、ロックを解除する必要があります。最も簡単な方法は、ロックの解除を実行することでdel
命令を。削除キーたら、その後、他のスレッドが正常にロックされ得ることができます。
デル(lock_sale_製品ID)
2.3ロックアウト
それは何をロックタイムアウトを意味するのでしょうか?スレッドは、タスクの実行中にロックされます場合は、明示的にロックを解除するには遅すぎ、ハングアップし、このリソースは常に(ロックされますデッドロックを)、他のスレッドは、もはやでも来て考えることはできません。そのため、明示的にリリースされていない場合でも、ロックは一定時間後に自動的に解放されなければならないことを確実にするためにタイムアウトを設定する必要があります。これは、timeoutパラメータなので、追加の命令の必要性をサポートしていません。setnx
key
setnx
有効期限が切れる(lock_sale_商品ID、30)
それは全体の擬似コードです:
場合(setnx(lock_sale_商品IDは、1)== 1 ){ 期限切れに(lock_sale_商品IDは、 30 ) してみてください{ 行う何かを...... } 最後に{ デル(lock_sale_商品ID) } }
2.4問題
Redisのは、基本的な分散ロックは、この考えに従っている実装が、ここでいくつかの問題があります。
setnx
そして、expire
非アトミック
我々はタイムアウトを制御するためのjavaコマンドを使用している場合は、タイムアウトのロックではなくアトミック操作を設定し、ロックのプロセスがハングアップした場合、それはコードを実行しないであろう、この時間はタイムアウトを設定していること、そしてこのロックはなることはありません解決策は、これは明らかに受け入れられません。
ソリューション:直接残業期間に、setコマンドを使用して、この問題は自動的に解決するために残業をRedisのことですので、問題のJavaプロセスがあっても、自身がロックを解除することができるのRedis。
セット(lock_sale_商品ID、1,30、NX)
誤って削除
成功した一つのスレッドがロックされ、30秒のタイムアウト時間が、これによる方法自体の実装にはない30秒以上がロックを与えるために、実行、自動ロック解除の期限が切れ、その後、スレッドBを完了するために、比較的遅いされた、スレッドA実行は、それは、アンロックロックを削除するタスクを実行し、終了したが、今回は、我々は解決策が自分をロックされていない知っているが、誤っているロックスレッドBは、スレッドBのロックを削除しました。
解決策:あなたはロックされたときのように、現在のスレッドのIDを置くことができvalue
、および削除する前に確認しkey
、対応するがvalue
、自分のスレッドIDではありません。
そのロックコード:
ストリングスレッドID = にThread.currentThread()のgetId()
セット(キー、スレッドID、 30、NX)
コードのロックを解除:
もし(スレッドID .equals(redisClient.get(キー))){ デル(キー) }
同時の可能性
メソッドの実行時間が長すぎる場合は、上記の説明では、あるだろうことが可能であることが可能で、複雑ますが、有効期限が設定されている場合は、あまりにも長い間、彼はロックスレッドが理由もなくかもしれ取得いくつかの時間のためにそこに待っています。
分散ロックを達成するため、完成のRedisを理解し、私たちは、飼育係を学ぶために、今、分散ロックの感情的な理解を持っています
三、飼育係の知人
ApacheのZooKeeperのは、自分自身と堅牢な同期化技術を通じて共有データを維持する間の調整のために、クラスタ(ノードのグループ)で使用されるサービスです。ZooKeeperの自体は、分散アプリケーションを作成するためのサービスを提供する分散アプリケーションです。
次のように提供さZooKeeperの一般的なサービスは以下のとおりです。
-
ネームサービス-名前では、クラスタ内のノードを識別します。これは、しかし、唯一のノードに対して、DNSに似ています。
-
構成管理-最近のノードを追加し、最新のシステム構成情報。
-
クラスタの管理-リアルタイムでクラスタとノードの状態にノードを残す/入社。
-
選挙アルゴリズム-リーダーの連携を目的としてノード選出。
-
ロックと同期サービス-ロックデータは、データの修正中。このメカニズムは、(ApacheのHBaseのような)他の分散アプリケーションに接続したときに自動的にフェイルオーバーすることができます。
-
データ信頼性の高いレジストリ一つまたは複数のノードでオフ場合でもデータを得ることができます- 。
分散アプリケーションは、多くの利点を提供し、彼らはまた、いくつかの複雑で解決が困難な課題を投げます。ZooKeeperのフレームワークは、すべての課題を克服するための完全なメカニズムを提供します。使用したレース条件やデッドロックフェイルセーフ同期方法の処理のために。もう一つの主要な欠点は、使用したデータの矛盾、ZooKeeperのある原子分解能を。
次のZooKeeperを使用することの利点は次のとおりです。
-
単純な分散協調プロセス
-
同期-サーバ・プロセス間の相互に排他的とコラボレーション。このプロセスは、Apache HBaseの構成管理を支援します。
-
注文したニュース
-
シリアル化-特定の規則に従ってデータを符号化します。一貫性のあるアプリケーションの実行を確認してください。この方法は、マップリデュースのスレッドで実行キューを調整するために使用することができます。
-
確実
-
アトミック-完全な成功または完全な障害が発生するが、トランザクションがの一部ではないデータ転送。
3.1飼育係全体のアーキテクチャ
のは、以下のチャートを見て、飼育係の全体的なアーキテクチャを理解してみましょう:
-
-
サーバー(サーバー):サーバー、ノードのZooKeeper当社の人口、およびすべてのサービスをクライアントに提供します。クライアントがアクティブであるためにサーバーを伝えるために確認コードを送信します。
-
アンサンブル:ZooKeeperのサーバグループ。ノードの最小数は、所望のアンサンブルを形成するために3です。
-
リーダー:サーバー・ノード、接続された任意のノードに障害が発生した場合、自動回復。サービスの開始時にリーダーが選出されます。
-
3.2飼育係のデータモデル
飼育係のデータモデルは似ているのですか?それはだけでなく、非常に多くのファイルシステムのディレクトリのように、多くの木々の間のデータのようなものです。
ZooKeeperのノードと呼ばれるのznode 。各ノードは、一意のパスのznodeを有するようにパスで区切られた各名前で識別のznode、及び(/)の配列は、この階層構造は、わずかに異なる情報を同じ名前空間明確な分離を行います。
それを含む要素があることのznode?
-
-
ACL:アクセスのznodeレコードは、それが誰か、何がこのIPノードにアクセスすることができます。
-
STAT:のznodeは等トランザクションID、バージョン番号、タイムスタンプ、サイズなど、様々なメタデータを含みます データ長に格納されるデータの総量は、のznodeです。あなたは、データの1メガバイトまで保存することができます。
-
znodeタイプ
znodeは、永続的な(永続的)ノード、シーケンス(シーケンシャル)ノードと一時的(一時的)ノードに分割されます。
-
永続ノードが-でも、この特定のznodeのクライアントの切断の作成後に、永続的なノードがまだ存在しています。デフォルトでは、特に断りのない限り、全てのznodeは永続的です。
-
一時的なノード-アクティブなクライアントは、一時的に有効であるノード。クライアントは、ZooKeeperのコレクションで切断された場合、一時的にノードが自動的に削除されます。そのため、一時的なノードが子を許可しません。その充填位置に一時的にノードが削除されている場合は、次の適切なノード。暫定リーダーノードは、選挙で重要な役割を果たしています。
-
注文ノード-ノードの順序は、永続的または一時的であることができます。新しいノードは、元の名前のセットのznodeパスに追加の10ビットシリアル番号によって配列、ZooKeeperのように作成されるのznode。例えば、パスを有する場合/ myappのはのznodeシーケンシャルノードを作成し、次にパスがZooKeeperの変わり/ myapp0000000001 0000000002に、次のシーケンス番号。二つの連続ノードが同時に作成された場合、それはデジタルを使用して、各のZooKeeperのznodeのために同じにはなりません。オーダーノードロックと同期で重要な役割を果たしています。
znodeサポート業務および露出したAPI:
- 作成/パスデータを:データはのznodeという名前のデータの/パスを作成することです。
- /パスを削除:のznodeの名前/パスを削除します。
- 存在/パス:のznodeの名前/パスをチェック
- setDataメソッド/パスデータ:データのznodeのデータの名前/パスを設定します。
- getData /パス:データのznodeの名前/パスを返します。
- GetChildrenメソッド/パス:戻り値のすべて/パスは、すべての子どものノードリストノード
3.3時計
モニタリングは、クライアントが変更する設定のZooKeeperの通知を受信することができるシンプルなメカニズムです。クライアントは、特定のウォッチのznodeを読んだ時に提供することができます。時計は変更が通知登録されたクライアントへの任意のznode(クライアントレジストリ)を送信します。
znodeの変更はのznodeの変化に関連付けられているデータを修正する子かのznodeです。一度だけ時計トリガ。クライアントが再び気づくしたい場合は、別の読み出し動作によって行われなければなりません。接続セッションの有効期限が切れると、クライアントがサーバーから切断されます、関連の時計も削除されます。
次のように具体的な相互作用は、次のとおりです。
クライアントが呼び出すgetData
メソッドのwatch
パラメータをtrue
。サーバは要求を受信し、データノードを返し、時計のznode路に挿入され、ウォッチャーリストは、ハッシュテーブルに対応します。
znodeのウォッチが削除されている場合は、サーバーはすべてのウォッチャー、のznode対応するクライアントの非同期通知を見つけて、キー値を、対応するハッシュテーブルを削除するには、ハッシュテーブルを検索します。
基本的な考え方は、これらの飼育係は、次の基本的な原則にさらに、および一貫飼育係飼育係分散ロックが達成される達成するための方法を学ぶことです。