posts-go/docs/2023-03-05-incident.html

132 lines
4.3 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.7.0/github-markdown.min.css"
/>
<title>haunt98 posts</title>
</head>
<style>
.markdown-body {
box-sizing: border-box;
min-width: 200px;
max-width: 980px;
margin: 0 auto;
padding: 45px;
font-family:
Shantell Sans Normal,
Rec Mono Casual,
SF Pro,
Inter,
sans-serif;
font-weight: 500;
}
.markdown-body pre {
font-family:
Berkeley Mono,
IBM Plex Mono,
SF Mono,
Jetbrains Mono,
monospace;
}
@media (max-width: 767px) {
.markdown-body {
padding: 15px;
}
}
</style>
<body class="markdown-body">
<h2>
<a href="index.html"><code>~</code></a>
</h2>
<div class="markdown-heading">
<h1 class="heading-element">Incident come and go</h1>
<a
id="user-content-incident-come-and-go"
class="anchor"
aria-label="Permalink: Incident come and go"
href="#incident-come-and-go"
><span aria-hidden="true" class="octicon octicon-link"></span
></a>
</div>
<p>This is collect of all incidents I created in the past :(</p>
<div class="markdown-heading">
<h2 class="heading-element">Service starts with empty port</h2>
<a
id="user-content-service-starts-with-empty-port"
class="anchor"
aria-label="Permalink: Service starts with empty port"
href="#service-starts-with-empty-port"
><span aria-hidden="true" class="octicon octicon-link"></span
></a>
</div>
<p>Because all configs is read from file.</p>
<p>
But the port config is empty -&gt; So when service inits, it use that
empty port somehow.
</p>
<p>
<strong>Solution</strong>: For some configs, make sure to failed first if
it's empty.
</p>
<div class="markdown-heading">
<h2 class="heading-element">Race condition of series of APIs</h2>
<a
id="user-content-race-condition-of-series-of-apis"
class="anchor"
aria-label="Permalink: Race condition of series of APIs"
href="#race-condition-of-series-of-apis"
><span aria-hidden="true" class="octicon octicon-link"></span
></a>
</div>
<p>For example I have 2 APIs:</p>
<ul>
<li>API upload: allow user to upload image</li>
<li>API submit: submit data to server</li>
</ul>
<p>
API upload is slow, it takes 10s to finish. API submit is fast, only takes
2s.
</p>
<p>
The problem is submit use data from upload too. When user calls API
upload, image is stored in cache. When user calls API submit, it use
whatever image is stored in cache.
</p>
<p>It's when the fun begins.</p>
<p>
Imagine user Trong already upload image. So he is ready to submit. But for
the same time, he re-call API upload to upload another image too.
</p>
<p>
So if API upload is finished first, which is kinda impossible (U know
upload file is not fast right?), everything right. But for most cases, API
submit is finished first. It means Trong's data is submitted with the old
image. Then API upload is finished, it will replace the old image with the
new one.So the old one, aka image in submitted data, is gone.
</p>
<p>Chaos right there!</p>
<p>
<strong>Solution</strong>: Use a lock, if user enter API upload, lock it
to prevent user call other APIs. Remember to unlock after finished
</p>
<div>
Feel free to ask me via
<a href="mailto:hauvipapro+posts@gmail.com">email</a> or
<a rel="me" href="https://hachyderm.io/@haunguyen">Mastodon</a>.
<br />Source code is available on
<a href="https://github.com/haunt98/posts-go">GitHub</a>
<a href="https://codeberg.org/yoshie/posts-go">Codeberg</a>
<a href="https://git.sr.ht/~youngyoshie/posts-go">sourcehut</a>
<a href="https://gitea.treehouse.systems/yoshie/posts-go">Treehouse</a>
<a href="https://gitlab.com/youngyoshie/posts-go">GitLab</a>
</div>
</body>
</html>