feat: more draft

main
sudo pacman -Syu 2024-01-25 01:25:03 +07:00
parent 2d4701b4c8
commit 1eb0c04c6e
2 changed files with 138 additions and 24 deletions

View File

@ -453,34 +453,99 @@
</ul>
<h2>
<a
id="user-content-system-design"
id="user-content-system-design-concept"
class="anchor"
aria-hidden="true"
tabindex="-1"
href="#system-design"
href="#system-design-concept"
><span aria-hidden="true" class="octicon octicon-link"></span></a
>System Design
>System Design Concept
</h2>
<h2>
<p>Start with basic: getting data from database.</p>
<div class="highlight highlight-source-mermaid">
<pre><span class="pl-k">sequenceDiagram</span>
<span class="pl-k">participant</span> <span class="pl-ent">service</span>
<span class="pl-k">participant</span> <span class="pl-ent">database</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">database</span><span class="pl-k">:</span> <span class="pl-s">get (100ms)</span></pre>
</div>
<p>Getting data from cache first, then database later.</p>
<div class="highlight highlight-source-mermaid">
<pre><span class="pl-k">sequenceDiagram</span>
<span class="pl-k">participant</span> <span class="pl-ent">service</span>
<span class="pl-k">participant</span> <span class="pl-ent">cache</span>
<span class="pl-k">participant</span> <span class="pl-ent">database</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">cache</span><span class="pl-k">:</span> <span class="pl-s">get (5ms)</span>
<span class="pl-k">alt</span> <span class="pl-s">not exist in cache</span>
<span class="pl-s">service -&gt;&gt; database: get (100ms)</span>
<span class="pl-k">end</span></pre>
</div>
<p>
If data is already in cache, we can get it so fast (5ms), nearly instant.
But if not, we hit penalty, must get database after then re-update cache
if need (&gt;105ms). The best case is worth even if hitting penalty
sometimes.
</p>
<p>Basic cache strategy: combine Write Through and Read Through</p>
<div class="highlight highlight-source-mermaid">
<pre><span class="pl-k">sequenceDiagram</span>
<span class="pl-k">participant</span> <span class="pl-ent">service</span>
<span class="pl-k">participant</span> <span class="pl-ent">cache</span>
<span class="pl-k">participant</span> <span class="pl-ent">database</span>
<span class="pl-k">note over </span><span class="pl-ent">service</span><span class="pl-sg">,</span><span class="pl-ent">database</span>: <span class="pl-ent">Read Through</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">cache</span><span class="pl-k">:</span> <span class="pl-s">get</span>
<span class="pl-k">alt</span> <span class="pl-s">not exist in cache</span>
<span class="pl-s">service -&gt;&gt; database: get</span>
<span class="pl-s">service -&gt;&gt; cache: set</span>
<span class="pl-k">end</span>
<span class="pl-k">note over </span><span class="pl-ent">service</span><span class="pl-sg">,</span><span class="pl-ent">database</span>: <span class="pl-ent">Write Through</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">database</span><span class="pl-k">:</span> <span class="pl-s">set</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">cache</span><span class="pl-k">:</span> <span class="pl-s">set</span></pre>
</div>
<h3>
<a
id="user-content-performance"
id="user-content-references-2"
class="anchor"
aria-hidden="true"
tabindex="-1"
href="#performance"
href="#references-2"
><span aria-hidden="true" class="octicon octicon-link"></span></a
>Performance
</h2>
<h2>
<a
id="user-content-security"
class="anchor"
aria-hidden="true"
tabindex="-1"
href="#security"
><span aria-hidden="true" class="octicon octicon-link"></span></a
>Security
</h2>
>References
</h3>
<ul>
<li>
<a href="https://apenwarr.ca/log/20201227" rel="nofollow"
>Systems design explains the world: volume 1</a
>
</li>
<li>
<a href="https://apenwarr.ca/log/20230415" rel="nofollow"
>Systems design 2: What we hope we know</a
>
</li>
<li>
<a
href="https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html"
rel="nofollow"
>How to do distributed locking</a
>
</li>
<li>
<a href="http://antirez.com/news/101" rel="nofollow"
>Is Redlock safe?</a
>
</li>
<li>
<a
href="https://danielw.cn/cache-consistency-with-database#cache-patterns"
rel="nofollow"
>Cache Consistency with Database</a
>
</li>
</ul>
<h2>
<a
id="user-content-damage-control"
@ -491,7 +556,6 @@
><span aria-hidden="true" class="octicon octicon-link"></span></a
>Damage control
</h2>
<p>TODO: Take care incident</p>
<h2>
<a
id="user-content-bonus"

View File

@ -207,16 +207,66 @@ Some tips:
- [Imaginary Problems Are the Root of Bad Software](https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software)
- [Speed up writing Go test ASAP](https://haunt98.github.io/posts-go/2022-12-25-go-test-asap.html)
## System Design
## System Design Concept
## Performance
Start with basic: getting data from database.
## Security
```mermaid
sequenceDiagram
participant service
participant database
service ->> database: get (100ms)
```
Getting data from cache first, then database later.
```mermaid
sequenceDiagram
participant service
participant cache
participant database
service ->> cache: get (5ms)
alt not exist in cache
service ->> database: get (100ms)
end
```
If data is already in cache, we can get it so fast (5ms), nearly instant. But if
not, we hit penalty, must get database after then re-update cache if need
(>105ms). The best case is worth even if hitting penalty sometimes.
Basic cache strategy: combine Write Through and Read Through
```mermaid
sequenceDiagram
participant service
participant cache
participant database
note over service,database: Read Through
service ->> cache: get
alt not exist in cache
service ->> database: get
service ->> cache: set
end
note over service,database: Write Through
service ->> database: set
service ->> cache: set
```
### References
- [Systems design explains the world: volume 1](https://apenwarr.ca/log/20201227)
- [Systems design 2: What we hope we know](https://apenwarr.ca/log/20230415)
- [How to do distributed locking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html)
- [Is Redlock safe?](http://antirez.com/news/101)
- [Cache Consistency with Database](https://danielw.cn/cache-consistency-with-database#cache-patterns)
## Damage control
TODO: Take care incident
## Bonus
- [IntelliJ IDEA Ultimate](https://www.jetbrains.com/idea/download/): Java