1.何
マイクロサービスアーキテクチャとは、システム全体が独立して存在し、相互に呼び出される多くの異なるサブシステムで構成されることを意味します。典型的なマイクロサービスシステムには、次のコンポーネントがあります。
- レジストリ
- 構成センター
- ゲートウェイ
- 個々のサブモジュール
2、使用シナリオ
データ量は数千万、訪問数は数千万
3.利点
- 再利用性、コードのコピーの排除
- 複雑さの拡大を防ぐための焦点
- 公共図書館のカップリングの分離と排除
- 高品質、SQLの安定性と保証
- 拡張しやすく、データベースの結合を排除
- 高効率、発信者のR&D効率を向上
4、粒度
- 統合サービス層
- 1つのサブビジネス、1つのサービス
- 1つのデータベース、1つのサービス
- 1つのインターフェース、1つのサービス
ベストプラクティスは、サブビジネスごとに1つのサービスです。
5、高可用性
- 高可用性であるかどうかを知る方法:オンラインでマシンをシャットダウンすると、オンラインサービスはダウンしません
- 方法論:クラスタリング(冗長性)+自動フェイルオーバー
- 特定の手順:
a。リバースプロキシレイヤー:リバースプロキシの冗長性、VIP +キープアライブ
b。サイトアプリケーションレイヤー:サイトアプリケーションレイヤーの冗長性、nginx自動認識
c。サービスレイヤー:サービスレイヤーの冗長性、サービス接続プール自動認識サービスレイヤーの存続
d。キャッシュレイヤー:キャッシュレイヤーの冗長性、キャッシュクライアント+キャッシュレイヤーのセンチネル検出メカニズム
e。データベースの読み取り:データベーススレーブノードは冗長であり、データベース接続プールはデータベースが利用可能かどうかを自動的に検出します
f。データベースの書き込み:データベースマスターノードは冗長です私、VIP + Keepalived
6、高い並行性
- 内容:システムが多くのリクエストを同時に並行して処理できるように設計されています。概念には、応答時間、QPS、TPS、同時ユーザー数などが含まれます。
- 方法:スケールアップ、スケールアウト
- 特定の手順:
a。リバースプロキシレイヤー:DNSポーリング
b。サイトアプリケーションレイヤー:nginxリバースプロキシ
c。サービスレイヤー:サービスレイヤー接続プール
d。データレイヤー:データレベルのセグメンテーション(データ範囲またはデータhaに応じて)水平方向に拡大するギリシャの方法)
7、負荷分散
-
内容:通常、複数の操作ユニットにリクエスト/データを[均等]に割り当てて実行します。
-
方法:
同種環境では、「均一な」
異種環境に重点を置き、「負荷と容量のマッチング」に重点を置きます -
同種環境でのロードバランシングの特定の手順:
同種環境でのロードバランシングの実装には、基本的に追加のサポートは必要ありません。高並行性と高可用性インフラストラクチャの実現:
a。クライアントからリバースプロキシDNSポーリングが完了している;
b。サイトへのリバースプロキシがnginxによって完了している;
c。サービスからサイトへの接続が接続プールによって完了している;
d。データ層へのサービスが、データ層フレームワークのクライアントによって提供される接続プールによっても完了している。
同型であるため、均衡戦略は単純であり、ポーリング法とランダム法の両方を実装できます。 -
異機種混在環境では、負荷分散の特定の手順:
静的ウェイト:内容
:静的ウェイトと均一負荷分散戦略はほとんど同じです。3台のマシンを想定すると、構成負荷が1:1:1の場合、それは負荷分散なので、次のことができます。ロードバランシングは、静的な重み付けの特殊なケースと見なされます。
利点:高速でシンプル、
欠点:静的、リアルタイムで変更できない、過負荷保護を実装できない動的な重み:内容
:重みはサービスの処理能力に応じて動的に変更されます。重みのサイズは、このマシンにルーティングされる負荷の確率を反映しています。
方法:
a。サービスの処理能力を識別します。正常に戻ると、機能に問題がないことを示し、タイムアウトにより、電流に耐えられないことを示しますフロー;
b。動的な重みの設計:成功するには小さなポイントを追加し、失敗すると大きなポイントを減らす;
利点:異機種環境でのサービスの処理機能を動的に反映し、機能に一致する
負荷を割り当てることができる。短所:負荷には追加の開発が必要 -
過負荷保護:
何:サービスが過負荷になると、いわゆる「雪崩」が発生する可能性があります。サービスのトラフィックは処理能力のピークに達し、その後トラフィックが増加し、正常に処理されたリクエストが急落し、サービスは利用不可の状態になります。
方法:
a。静的メソッド:
静的オーバーロードはフローしきい値を設定することで、これを超えるとリクエストがなくなります。b。動的モード:
動的過負荷保護と動的負荷分散戦略は類似しています。- 接続はサービスを表し、スコアは処理能力を表します
- 成功には小さなスコアを、失敗には大きなスコアを追加します
- 重大な境界(1回の連続した障害など)のあえぎ(減少した流れ、短時間)
- 死亡状態(2回以上の連続した障害など)呼吸(フローなし、長時間)
過負荷保護が特定のノードに実装されている場合、そのノードによって最初に処理された要求は他のノードに転送されます。すべてのノード(つまりクラスター全体が過負荷の場合、要求は破棄されるため、クラスターの過負荷保護戦略は特定のノードの戦略とは異なり、一方が失われて他方が転送されます。
接続プール
- 内容:短い接続(使用後に閉じられる)と比較して、接続プールはメンテナンス用のプールです。複数の接続が必要な場合、それらは必要に応じてプールから削除され、使用後にプールに入れられます。プール内の接続は再利用できますの。
- 理由:接続が毎回確立されると、接続が要求の送受信に使用され、接続が閉じられます。同時実行性の高いシナリオが発生した場合、接続の確立と閉じがボトルネックになります。
- How:
a. 核心接口:初始化;拿连接;放回连接
/*数据结构很简单,总共是两个数组,一个是表示所有真正连接的数组,还有一个是第三行出现的一个lock数组,
lock数组的作用即是表征下标对应的连接的状态,当前是否被占用。*/
init() {
for i to N {
Array DBClientConnection[i] = new()
Array DBClientConnection[i] -> connect()
Array lock[i] = 0
}
}
/*拿连接的过程也非常简单,首先就是遍历锁数组,如果为0,那么设置锁为1,返回连接即可*/
GetConnection() {
for i to N {
if(Array lock[i] == 0) {
Array lock[i] = 1
return Array DBClientConnection[i]
}
}
}
/*放回连接只需要把lock设置为0就可以了*/
FreeConnection(c) {
for i to N {
if(Array DBClientConnection[i] == c) {
Array lock[i] = 0
}
}
}
b. 其他考虑因素:
1) 复杂度还可以优化为O(1)
2) 连接的可用性检测,如果连接失效了,需要重新连接,并替换原来的连接
3) 如果下游服务器故障,失效连接要剔除掉,以实现故障的自动转移,从而实现高可用
4) 如果下游有新增的节点,需要动态扩充连接池,以实现服务自动发现,从而实现扩展性。可以通过监控配置文件的方式(比如MD5,),如果改变则重新载入;或者通过配置中心回调
5) 要保证连接选取的概率,实现负载均衡。可以通过轮询,随机,静态权重,动态权重等方式实现基于连接池的负载均衡
参考
- 高可用:https://www.jianshu.com/p/dcb73d907342
- 高并发:https://www.jianshu.com/p/be66a52d2b9b
- 负载均衡1:https://www.jianshu.com/p/41f437542ffc
- 负载均衡2:https://blog.csdn.net/Sunsscode/article/details/107693303