システム設計を勉強する上でのチェックポイント

## 目的

今ままでは、この[システム入門](https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md)というリンクを渡していただけだったのですが、項目が多くどのくらい勉強したら良いか判断しにくいため、勉強した時のチェックポイントを整理しました。
チェックポイントは、仕組みを確認する質問と応用の質問を用意しました。仕組みを勉強した後、応用の事例を勉強することがおすすめです。

## チェックポイント
* 垂直スケーリング・水平スケーリングとは何か？どちらをよく利用するか?それぞれどのような時に利用するか？
    * kubernetesで、垂直スケーリング・水平スケーリングはそれぞれどのように行われているか?
* データベースレプリケーション・データベースパーティションはどのようなものか?
    * BigQueryやSpannerはどのようにデータベースパーティションを行っているか？
* RDBやNoSQLのスケーラビリティはどのように担保されているのか?それぞれの違いは?
    * RDBやNoSQLそれぞれ一つづつ、オープンソースもしくはクラウドサービスの例を上げて、詳細に説明してください。
* Write-through, Write-behindそれぞれどのような意味か?
* Eviction Policyとは何か?
    * Eviction Policyの設定ごとに、適したシステム要件はどのようなものか例を説明してください
* 一貫性と可用性のトレードオフは何か?CAP理論とは何か？
    * Spanner, Auroraはなぜ便利か？どのような仕組みで実装されているか?
* Fault-tolerantとは何か？
* Event Driven Architectureとは何か？
* CQRS(Command and Query Responsibility Segregation)とは何か?
* クライアント,CDN,Webサーバー,データベース,アプリケーションそれぞれ何か？
    * それぞれのレイアでキャッシュはどのような時利用すると便利か?
    * Nginxとは何か？どのような仕組みで動いているか?
* メッセージキューとは何か？どのような時に使われるか?
    * Google pub/subは、どのような仕組みのサービスか？どのような時に利用されるか?一貫性と可用性のトレードオフはどのような選択をしているか?
* 冪等性とは何か?
    * 冪等な更新処理はどのように行えば良いか?

## チェックポイント確認用URL
* [system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md)
* [Scalability, Availability & Stability Patterns(May 2010)](https://www.slideshare.net/jboner/scalability-availability-stability-patterns/79-Node_ring_with_Consistent_HashingFind)
* [How clustering works in BigQuery(Aug 2019)](https://cloud.google.com/blog/products/data-analytics/skip-the-maintenance-speed-up-queries-with-bigquerys-clustering)
* [Cloud Spanner のハイレベルアーキテクチャ解説(July 2018)](https://medium.com/google-cloud-jp/cloud-spanner-%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%AC%E3%83%99%E3%83%AB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A7%A3%E8%AA%AC-fee62c17f7ed)
* [Inside NGINX: How We Designed for Performance & Scale](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)
* [Aurora - クラウド時代のDBアーキテクチャ](https://mrasu.hatenablog.jp/entry/2019/04/29/143206)
* [Idempotent Requests(Stripe)](https://stripe.com/docs/api/idempotent_requests)

## その他参考URL
システム設計関係で勉強になったリンクをいろいろ貼っています。
基礎を知った上で、それぞれの企業がどのようなことを行っているか、クラウドサービスやオープンソースはどんな特徴があるか勉強すると、より理解が深まります。

* まとめ
    * [A pattern language for microservices(the author of Microservices patterns)](https://microservices.io/patterns/)
    * [AWS Well-Architected フレームワーク「信頼性の柱」ホワイトペーパー日本語版(Nov 2019)](https://aws.amazon.com/jp/blogs/news/wa-reliability2019/)
* Tutorial
    * [Build your own event-sourced system using Cloud Spanner (GCP Jun 2019)](https://cloud.google.com/blog/products/databases/build-your-own-event-sourced-system-using-cloud-spanner)
    * [独自の AWS データベースを使って最新のアプリケーションを構築する(Jun 2019)](https://aws.amazon.com/jp/blogs/news/building-a-modern-application-with-purpose-built-aws-databases/)
    * [Architecting with Google Kubernetes Engine専門講座(GCP)](https://www.coursera.org/specializations/architecting-google-kubernetes-engine)
    * [5 Steps for Selecting a High-Performance NoSQL Database (redislabs Jun 2019)](https://redislabs.com/blog/5-steps-selecting-high-performance-nosql-database/)
* 分散トランザクション
    * [Handling Distributed Transactions in the Microservice world](https://medium.com/@sohan_ganapathy/handling-transactions-in-the-microservice-world-c77b275813e0)
    * [Distributed locks with Redis](https://redis.io/topics/distlock)
    * [Avoiding Double Payments in a Distributed Payments System (Airbnb April 2017)](https://medium.com/airbnb-engineering/avoiding-double-payments-in-a-distributed-payments-system-2981f6b070bb)
    * [マイクロサービスにおける決済トランザクション管理(Merpay Jun 2019)](https://tech.mercari.com/entry/2019/06/07/155849)
* 企業の実装事例
    * [Delta: A Data Synchronization and Enrichment Platform(Netflix Oct 2019)](https://medium.com/netflix-techblog/delta-a-data-synchronization-and-enrichment-platform-e82c36a79aee)
    * [Building and Scaling Data Lineage at Netflix to Improve Data Infrastructure Reliability, and Efficiency(May 2019)](https://medium.com/netflix-techblog/building-and-scaling-data-lineage-at-netflix-to-improve-data-infrastructure-reliability-and-1a52526a7977)
    * [Expediting Data Fixes and Data Migrations(Linkedin Jul 2019)](https://engineering.linkedin.com/blog/2019/expediting-data-fixes-migrations)
    * [Reconciling GraphQL and Thrift at Airbnb(May 2018)](https://medium.com/airbnb-engineering/reconciling-graphql-and-thrift-at-airbnb-a97e8d290712)
    * [Building a Kubernetes platform at Pinterest(Aug 2019)](https://medium.com/pinterest-engineering/building-a-kubernetes-platform-at-pinterest-fb3d9571c948)