diff --git a/README.md b/README.md
index 2c2f2dbc..b8801fc2 100644
--- a/README.md
+++ b/README.md
@@ -442,7 +442,7 @@ Generally, you should aim for **maximal throughput** with **acceptable latency**
- Source: CAP theorem revisited
+ Source: CAP theorem revisited
In a distributed computer system, you can only support two of the following guarantees:
@@ -465,7 +465,7 @@ AP is a good choice if the business needs to allow for [eventual consistency](#e
### Source(s) and further reading
-* [CAP theorem revisited](http://robertgreiner.com/2014/08/cap-theorem-revisited/)
+* [CAP theorem revisited](https://robertgreiner.com/cap-theorem-revisited/)
* [A plain english introduction to CAP theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem)
* [CAP FAQ](https://github.com/henryr/cap-faq)
* [The CAP theorem](https://www.youtube.com/watch?v=k-Yaq8AHlFA)
@@ -494,7 +494,7 @@ This approach is seen in file systems and RDBMSes. Strong consistency works wel
### Source(s) and further reading
-* [Transactions across data centers](http://snarfed.org/transactions_across_datacenters_io.html)
+* [Transactions across data centers](https://snarfed.org/transactions_across_datacenters_io.html)
## Availability patterns
@@ -583,7 +583,7 @@ If both `Foo` and `Bar` each had 99.9% availability, their total availability in
- Source: DNS security presentation
+ Source: DNS security presentation
A Domain Name System (DNS) translates a domain name such as www.example.com to an IP address.
@@ -607,8 +607,8 @@ Services such as [CloudFlare](https://www.cloudflare.com/dns/) and [Route 53](ht
### Disadvantage(s): DNS
* Accessing a DNS server introduces a slight delay, although mitigated by caching described above.
-* DNS server management could be complex and is generally managed by [governments, ISPs, and large companies](http://superuser.com/questions/472695/who-controls-the-dns-servers/472729).
-* DNS services have recently come under [DDoS attack](http://dyn.com/blog/dyn-analysis-summary-of-friday-october-21-attack/), preventing users from accessing websites such as Twitter without knowing Twitter's IP address(es).
+* DNS server management could be complex and is generally managed by [governments, ISPs, and large companies](https://superuser.com/questions/472695/who-controls-the-dns-servers/472729).
+* DNS services in the past have come under [DDoS attack](https://www.techrepublic.com/article/dyn-ddos-attack-5-takeaways-on-what-we-know-and-why-it-matters/), preventing users from accessing websites such as Twitter without knowing Twitter's IP address(es).
### Source(s) and further reading
@@ -662,7 +662,7 @@ Sites with heavy traffic work well with pull CDNs, as traffic is spread out more
- Source: Scalable system design patterns
+ Source: Scalable system design patterns
Load balancers distribute incoming client requests to computing resources such as application servers and databases. In each case, the load balancer returns the response from the computing resource to the appropriate client. Load balancers are effective at:
@@ -775,7 +775,7 @@ Additional benefits include:
- Source: Intro to architecting systems for scale
+ Source: Intro to architecting systems for scale
Separating out the web layer from the application layer (also known as platform layer) allows you to scale and configure both layers independently. Adding a new API results in adding application servers without necessarily adding additional web servers. The **single responsibility principle** advocates for small and autonomous services that work together. Small teams with small services can plan more aggressively for rapid growth.
@@ -790,7 +790,7 @@ Pinterest, for example, could have the following microservices: user profile, fo
### Service Discovery
-Systems such as [Consul](https://www.consul.io/docs/index.html), [Etcd](https://coreos.com/etcd/docs/latest), and [Zookeeper](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) can help services find each other by keeping track of registered names, addresses, and ports. [Health checks](https://www.consul.io/intro/getting-started/checks.html) help verify service integrity and are often done using an [HTTP](#hypertext-transfer-protocol-http) endpoint. Both Consul and Etcd have a built in [key-value store](#key-value-store) that can be useful for storing config values and other shared data.
+Systems such as [Consul](https://www.consul.io/docs/index.html), [Etcd](https://coreos.com/etcd/docs/latest), and [Zookeeper](https://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) can help services find each other by keeping track of registered names, addresses, and ports. [Health checks](https://www.consul.io/intro/getting-started/checks.html) help verify service integrity and are often done using an [HTTP](#hypertext-transfer-protocol-http) endpoint. Both Consul and Etcd have a built in [key-value store](#key-value-store) that can be useful for storing config values and other shared data.
### Disadvantage(s): application layer
@@ -833,7 +833,7 @@ The master serves reads and writes, replicating writes to one or more slaves, wh
- Source: Scalability, availability, stability, patterns
+ Source: Scalability, availability, stability, patterns
##### Disadvantage(s): master-slave replication
@@ -848,7 +848,7 @@ Both masters serve reads and writes and coordinate with each other on writes. I
- Source: Scalability, availability, stability, patterns
+ Source: Scalability, availability, stability, patterns
##### Disadvantage(s): master-master replication
@@ -897,7 +897,7 @@ Federation (or functional partitioning) splits up databases by function. For ex
- Source: Scalability, availability, stability, patterns
+ Source: Scalability, availability, stability, patterns
Sharding distributes data across different databases such that each database can only manage a subset of the data. Taking a users database as an example, as the number of users increases, more shards are added to the cluster.
@@ -1041,7 +1041,7 @@ Document stores provide high flexibility and are often used for working with occ
- Source: SQL & NoSQL, a brief history
+ Source: SQL & NoSQL, a brief history
> Abstraction: nested map `ColumnFamily>`
@@ -1134,7 +1134,7 @@ Sample data well-suited for NoSQL:
- Source: Scalable system design patterns
+ Source: Scalable system design patterns
Caching improves page load times and can reduce the load on your servers and databases. In this model, the dispatcher will first lookup if the request has been made before and try to find the previous result to return, in order to save the actual execution.
@@ -1205,7 +1205,7 @@ Since you can only store a limited amount of data in cache, you'll need to deter
- Source: From cache to in-memory data grid
+ Source: From cache to in-memory data grid
The application is responsible for reading and writing from storage. The cache does not interact with storage directly. The application does the following:
@@ -1241,7 +1241,7 @@ Subsequent reads of data added to cache are fast. Cache-aside is also referred
- Source: Scalability, availability, stability, patterns
+ Source: Scalability, availability, stability, patterns
The application uses the cache as the main data store, reading and writing data to it, while the cache is responsible for reading and writing to the database:
@@ -1276,7 +1276,7 @@ Write-through is a slow overall operation due to the write operation, but subseq
- Source: Scalability, availability, stability, patterns
+ Source: Scalability, availability, stability, patterns
In write-behind, the application does the following:
@@ -1294,7 +1294,7 @@ In write-behind, the application does the following:
- Source: From cache to in-memory data grid
+ Source: From cache to in-memory data grid
You can configure the cache to automatically refresh any recently accessed cache entry prior to its expiration.
@@ -1326,7 +1326,7 @@ Refresh-ahead can result in reduced latency vs read-through if the cache can acc
- Source: Intro to architecting systems for scale
+ Source: Intro to architecting systems for scale
Asynchronous workflows help reduce request times for expensive operations that would otherwise be performed in-line. They can also help by doing time-consuming work in advance, such as periodic aggregation of data.
@@ -1372,7 +1372,7 @@ If queues start to grow significantly, the queue size can become larger than mem
- Source: OSI 7 layer model
+ Source: OSI 7 layer model
### Hypertext transfer protocol (HTTP)
@@ -1404,7 +1404,7 @@ HTTP is an application layer protocol relying on lower-level protocols such as *
- Source: How to make a multiplayer game
+ Source: How to make a multiplayer game
TCP is a connection-oriented protocol over an [IP network](https://en.wikipedia.org/wiki/Internet_Protocol). Connection is established and terminated using a [handshake](https://en.wikipedia.org/wiki/Handshaking). All packets sent are guaranteed to reach the destination in the original order and without corruption through:
@@ -1428,7 +1428,7 @@ Use TCP over UDP when:
- Source: How to make a multiplayer game
+ Source: How to make a multiplayer game
UDP is connectionless. Datagrams (analogous to packets) are guaranteed only at the datagram level. Datagrams might reach their destination out of order or not at all. UDP does not support congestion control. Without the guarantees that TCP support, UDP is generally more efficient.
@@ -1457,7 +1457,7 @@ Use UDP over TCP when:
- Source: Crack the system design interview
+ Source: Crack the system design interview
In an RPC, a client causes a procedure to execute on a different address space, usually a remote server. The procedure is coded as if it were a local procedure call, abstracting away the details of how to communicate with the server from the client program. Remote calls are usually slower and less reliable than local calls so it is helpful to distinguish RPC calls from local calls. Popular RPC frameworks include [Protobuf](https://developers.google.com/protocol-buffers/), [Thrift](https://thrift.apache.org/), and [Avro](https://avro.apache.org/docs/current/).