-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaws-lambda-scalling.html
433 lines (394 loc) · 22.5 KB
/
aws-lambda-scalling.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<!-- Must-have tags for Facebook -->
<meta name="description" content="Hiểu về cách AWS Lambda vận hành, sử dụng resource để scaling hệ thống" />
<meta name="keywords" content="AWS Lambda scaling" />
<meta name="author" content="https://www.facebook.com/tuananh.pham.319 " />
<meta property="og:url" content="https://ttlpta.github.io/aws-lambda-scalling.html" />
<meta property="og:type" content="article" />
<meta property="og:title" content="AWS Lambda scaling" />
<meta property="og:description" content="Hiểu về cách AWS Lambda vận hành, sử dụng resource để scaling hệ thống" />
<meta property="og:image"
content="https://raw.githubusercontent.com/ttlpta/ttlpta.github.io/master/publics/hot-post-2.jpg" />
<!-- Must-have tags for Facebook -->
<!-- GA script -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-120682087-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "UA-120682087-1");
</script>
<!-- GA script -->
<!-- FB SHARE -->
<div id="fb-root"></div>
<script async defer crossorigin="anonymous"
src="https://connect.facebook.net/vn_VN/sdk.js#xfbml=1&version=v6.0&appId=184112649512085&autoLogAppEvents=1"></script>
<!-- FB SHARE -->
<title>
Hiểu về cách AWS Lambda vận hành, sử dụng resource để scaling hệ thống
</title>
<!-- Google font -->
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700%7CMuli:400,700" rel="stylesheet" />
<!-- Bootstrap -->
<link type="text/css" rel="stylesheet" href="css/bootstrap.min.css" />
<!-- Font Awesome Icon -->
<link rel="stylesheet" href="css/font-awesome.min.css" />
<!-- Custom stlylesheet -->
<link type="text/css" rel="stylesheet" href="css/style.css" />
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="detail">
<!-- HEADER -->
<header id="header">
<!-- NAV -->
<div id="nav">
<!-- Top Nav -->
<div id="nav-top">
<div class="container">
<!-- social -->
<ul class="nav-social">
<li>
<a href="https://www.facebook.com/tuananh.pham.319"><i class="fa fa-facebook"></i></a>
</li>
<li>
<a href="https://www.linkedin.com/in/tuan-anh-pham-978863ba/"><i class="fa fa-linkedin"></i></a>
</li>
<li>
<a href="cv.html" title="My resume"><i class="fa fa-graduation-cap"></i></a>
</li>
</ul>
<!-- /social -->
<!-- logo -->
<div class="nav-logo">
<a href="/" class="logo"><img src="./img/logo.png" alt="" /></a>
</div>
<!-- /logo -->
<!-- search & aside toggle -->
<div class="nav-btns">
<button class="aside-btn"><i class="fa fa-bars"></i></button>
</div>
<!-- /search & aside toggle -->
</div>
</div>
<!-- /Top Nav -->
<!-- Main Nav -->
<div id="nav-bottom">
<div class="container">
<!-- nav -->
<ul class="nav-menu">
<li><a href="/">Home</a></li>
<li><a href="chuyen-nghe.html">Chuyện nghề</a></li>
<li><a href="chuyen-doi.html">Lifestyle</a></li>
<li><a href="review-sach.html">Review sách</a></li>
<li><a href="chuyen-cua-tui.html">Chuyện của tui</a></li>
<li><a href="cv.html">About me</a></li>
</ul>
<!-- /nav -->
</div>
</div>
<!-- /Main Nav -->
<!-- Aside Nav -->
<div id="nav-aside">
<ul class="nav-aside-menu">
<li><a href="/">Home</a></li>
<li><a href="chuyen-nghe.html">Chuyện nghề</a></li>
<li><a href="chuyen-doi.html">Lifestyle</a></li>
<li><a href="review-sach.html">Review sách</a></li>
<li><a href="chuyen-cua-tui.html">Chuyện của tui</a></li>
<li><a href="cv.html">About me</a></li>
</ul>
<button class="nav-close nav-aside-close"><span></span></button>
</div>
<!-- /Aside Nav -->
</div>
<!-- /NAV -->
<!-- PAGE HEADER -->
<div id="post-header" class="page-header">
<div class="page-header-bg" style="background-image: url('./img/lifestyle/hot-post-2.jpg')"
data-stellar-background-ratio="0.5"></div>
<div class="container">
<div class="row">
<div class="col-md-10">
<div class="post-category">
<a href="chuyen-nghe.html">Chuyện nghề</a>
</div>
<h2 style="color: #fff">AWS Lambda scaling</h2>
<p class="text-white">Hiểu về cách AWS Lambda vận hành, sử dụng resource để scaling hệ thống.</p>
<ul class="post-meta">
<li>26 Jul 2022</li>
</ul>
</div>
</div>
</div>
</div>
<!-- /PAGE HEADER -->
</header>
<!-- /HEADER -->
<!-- section -->
<div class="section">
<!-- container -->
<div class="container">
<!-- row -->
<div class="row">
<div class="col-md-12">
<!-- post content -->
<div class="section-row content-section">
<h3>Serverless</h3>
Serverless đang ngày càng trở nên phổ biến, thậm chí đang trở thành giải pháp được nghĩ đến đầu tiên khi
thiết kế
kiến trúc của bất cứ hệ thống Backend nào. Với những ưu điểm như : Dễ dàng vận hành, mở
rộng, availability, tiết kiệm chí phí...(những công việc này đều được thực hiện tự động bởi các nền tảng
cung cấp dịch vụ Serverless). <br /><br />
Những nền tảng cung cấp dịch vụ serverless phổ biến như: AWS, Azure, NextJS - Vercel, .... Công việc của
người
dùng chỉ đơn giản là phát triển ứng dụng và trả tiền. <br /><br />
<img src="img/aws-scalling/serverless.png" alt="serverless" />
<br /><br />
AWS Lambda là một dịch vụ của AWS để cung cấp giải pháp serverless đến người dùng. AWS Lambda có thể tự động
mở rộng (scaling) để xử lí từ một request đến hàng trăm, hàng ngàn request trên một giây. Và bài viết này sẽ
giúp chúng ta hiểu hơn về cách AWS Lambda xử lí bài toán này. <br /><br />
<h3>Concurrency và requests per second</h3>
Cách xử lí các tác vụ đồng thời (concurrency) và xử lí các requests trên giây (requests per second) là hai
hướng chính để giải quyết bài toán auto scaling.<br /><br />
Concurrency của hệ thống là khả năng xử lí nhiều tác vụ đồng thời, tức là trong 1 thời điểm, hệ thống có thể
xử lí bao nhiêu tác vụ song song.<br /><br />
Việc xử lí số lượng request hay transaction trong 1 giây, khác với Concurrency. Bởi vì 1 request có thể được
xử lí trong ít hoặc nhiều hơn 1 giây, dẫn được việc trong 1 giây, hệ thống có thể xử lí 2 request hoặc chỉ
có thể xử lí 1 request duy nhất.
<br /><br />
<h3>Runtime environment.</h3>
Lambda sẽ khởi tạo 1 runtime enviroment để thực thi function. Và mỗi 1 runtime environment chỉ có thể xử lí
1
request tại một thời điểm.
<br /><br />
<center> <img src="img/aws-scalling/First-request-to-invoke-your-function.png" alt="serverless"
/><br />
<small>Vòng đời của các request đến function.</small>
</center>
<br />
Ở request đầu tiên đến function, Lambda sẽ tạo mới một runtime enviroment. Code ở ngoài function main
handler sẽ được thực thi trước. Giai đoạn này gọi là giai đoạn khởi tạo (Init), sau đó Lambda mới bắt đầu
thực hiện function main handler (Invocation).
<br /><br />
Sau khi Lambda xử lí xong request
đó, thì runtime environment mới sẵn sàng để xử lí request tiếp theo <b>đến cùng một function</b>. Và ở
request tiếp theo Lambda sẽ bỏ qua giai đoạn Init và chỉ thực hiện giai đoạn invocation.
<br /><br />
<center>
<img src="img/aws-scalling/Lambda-ready-to-process-an-additional-request-for-the-same-function.png"
alt="serverless" />
</center>
<br /><br />
Nếu request đến cùng lúc mà request đầu tiên vẫn đang trong quá trình xử lí thì Lambda sẽ tạo một runtime
enviroment khác. Trong ví dụ dưới đây, Lambda đã tạo các runtime enviroment cho các request 2, 3, 4, 5. Và
mỗi khi tạo một enviroment mới Lambda sẽ chạy lại cả 2 giai đoạn init và invocation.
<br /><br />
<img src="img/aws-scalling/Lambda-creating-new-runtime-environments.png" alt="serverless" />
<br /><br />
Với các requests tiếp, Lambda sẽ sử dụng lại các enviroment đã khởi tạo, và khi sử dụng lại thì giai đoạn
init cũng sẽ được bỏ qua như đã nhắc đến ở trên. <br /><br />
<img src="img/aws-scalling/Lambda-reusing-runtime-environments2-1024x411.png" alt="serverless" />
Số lượng enviroment được tạo ra cũng tương ứng với khả năng xử lí nhiều tác vụ tại cùng một thời điểm
(Concurrency).<br />
1 runtime enviroment = 1 concurrent request.<br />
10 runtime enviroment = 10 concurrent requests.
<br /><br />
Khi số lượng request đến 1 function giảm xuống, thì Lambda sẽ dừng các runtime enviroment không sử dụng để
tăng khả năng mở rộng cho các function khác.<br /><br />
<h3>Invocation, concurrency, transactions/requests per second</h3>
Số lượng request Lambda có thể xử lí trong 1 giây thì sẽ bằng tổng Invocation được thực thi trong thời gian
đó.
Ví dụ nếu 1 function mất 1 giây để xử lí , và Lambda đã tạo 10 runtime enviroment để xử lí 10 request đồng
thời thì số request Lambda có thể xử lí trong 1 giây sẽ bằng tổng số invocation = 10.<br /><br />
<center>
<img src="img/aws-scalling/Lambda-transactions-per-second-for-1-second-invocation.png" alt="serverless"
/>
</center>
<br /><br />
Nhưng nếu function đó chỉ mất khoảng 500ms để thực thi và vẫn với 10 runtime enviroment thì tổng số request
lambda có thể thực hiện trên giây = 20.<br /><br />
<center>
<img src="img/aws-scalling/Lambda-transactions-per-second-for-500-ms-second-invocation.png"
alt="serverless" />
</center><br /><br />
Bạn có thể theo dõi số lượng concurency request = Amazon CloudWatch. Với số liệu là ConcurrentExecutions.
<br />
Như vậy ta có thể có công thức để tính được số lượng request mà lambda có thể xử lí đồng thời (concurency):
<pre>RequestsPerSecond x AvgDurationInSeconds = concurrent requests</pre>
<small>Lưu ý: Số liệu AvgDurationInSeconds là thời gian trung bình của tất cả các function được gọi đến
trong
khoảng thời gian 1 giây.</small>
<br /><br />
<h3>Scaling quotas </h3>
Service Quotas là service AWS cung cấp để quản lí (quota) về resource, actions.. của các AWS
service, mỗi config đều có giá trị default, và bạn có thể request để thay đổi các giá trị đó
<br /><br />
<img src="./img/aws-scalling/Service-Quotas-console.png" />
<br /><br />
Có hai giá trị trong Service Quotas liên quan đến concurrency đó là Account concurrencty và Burst
concurency.
<br /><br />
1, Account concurency: số lượng tối đa các tác vụ mà lambda có thể xử lí đồng thời trong 1 Region. Lưu ý số
lượng này được tính theo tổng của tất cả các lambda function đang process của 1 account, chứ không tính theo
riêng từng function.
<br /><br />
2, Burst concurency: cung cấp số lượng tối đa function có thể init đồng thời. Có thể là từ 500 - 3000 tùy
vào từng region. Sau giai đoạn init đồng thời này, những request tiếp theo Lambda không cần init runtime
enviroment nữa mà chỉ cần xử lí các function ở giai đoạn Invocation và tối đa là 500 request đồng thời (500
concurency). Và từ request thứ 501 , lambda sẽ trả về throttling error (429).
<br /><br />
Ví dụ
<br /><br />
Trong ví dụ dưới đây số lượng Account concurency đã được request tăng lên 7000. Và account chỉ có duy nhất
một
function (vì vậy trong trường hợp này function này có thể sử dụng hết được số lượng account concurency đang
available)
<br /><br />
Giả sử thời gian trung bình để xử lí xong function (AvgDurationInSeconds) là 250ms.
<br /><br />
<img src="./img/aws-scalling/Lambda-account-and-burst-concurrency2.png" />
<br /><br />
1. <strong>08:59</strong></strong>: Lambda đã khởi tạo và xử lí xong 1000 request đồng thời. Tại thời điểm
này số lượng request lambda
có thể xử lí trong 1s là : 1000 (Concurrent requests) / 0.250 (AvgDurationInSeconds) = 4000.
<br /><br />
2. <strong>09:00</strong>: Thời thời điểm này Lambda nhận được 5000 request đồng thời. 1000 request sẽ sử
dụng lại runtime
enviroment đã khởi tạo tại thời điểm (08:59). 3000 request sẽ khởi tạo runtime enviroment mới (3000 là số
lượng Burst concurency đã config trong Service quotas). 1000 request cuối cùng sẽ bị return error throttled
(429)
<br /><br />
3. <strong>09:01</strong>: Khi chưa đạt số lượng request đồng thời tối đa là 7000 thì Lambda sẽ có cơ chế tự
động retry lại
các request đã throttled (1000). Do ở 09:00 đã khởi tạo tối đa số lượng Burst concurency nên lúc này Lambda
chỉ có thể burst tiếp 500 request.<br /><br />
4. <strong>09:02</strong>: Lambda xử lí nốt 500 throttled request còn lại. Như vậy tại thời điểm này 5000
request đã được xử hoàn toàn.
<br /><br />
5. <strong>09:03</strong>: Lambda tiếp tục nhận 5000 requests. Do đã có 5000 runtime enviroment khởi tạo nên
, 5000 requests
này chỉ việc sử dụng lại. Lưu ý lúc này do Lambda không cần dùng đến số lượng Burst concurency nên Lambda sẽ
cộng thêm 500 Burst concurency vào 500 Burst concurency sẵn có. Tức là lúc này số lượng Burst concurency sẽ
là 1000 (chỗ này hay vcl, nên đ biết có hiểu đúng không?)<br /><br />
6. <strong>09:04</strong>: Lambda tiếp tục nhận thêm 8000 requests. 5000 requets sẽ sử dụng lại 5000 runtime
enviroment đã
khởi tạo. 1000 requests sẽ được khởi tạo bởi cơ chế Burst concurency. còn lại 2000 request sẽ return
throttled error.<br /><br />
7. <strong>09:05</strong>: Tương tự như thời điểm 09:01, 500 requests được burst runtime enviroment
mới.<br /><br />
8. <strong>09:06</strong>: Tương tự như thời điểm 09:05, 500 requests được burst runtime enviroment mới. Lúc
này số request đồng thời đã đạt đến 7000. và vẫn còn 1000 requests vẫn trả về throttled error. Do đã đạt đến tối đa số lượng request đồng thời có thể xử lí nên 1000
request còn lại sẽ không được retry và luôn trả về throttled error cho client.<br /><br />
9. <strong>09:07</strong>: Lambda nhận thêm 7000 requests. 1000 vẫn bị throttled. Lúc này Lambda có thể xử
lí 28000 request
trong 1 giây .<br /><br />
<h3>Reserved concurrency</h3>
Reserved concurrency là số lượng tối đa request có thể xử lí đồng thời cho 1 function. Điều này có thể giúp các function có
request đến database hay 1 hệ thống 3rd API có giới hạn số lượng request đồng thời crash. Nếu bạn setting = 0
thì Lambda không tiếp tục xử lí các request đến function này. Việc này giống như việc bạn shutdown server
vậy.
<br /><br />
<img src="./img/aws-scalling/Reserved-concurrency.png" /><br /><br />
<img src="./img/aws-scalling/reserve-concurrency2.png" /><br /><br />
<h3> Provisioned Concurrency</h3>
Giai đoạn init function trước khi Lambda xử lí code trong hàm main handler
(invocation) nên luôn sẽ có độ trễ ( cơ chế cold-start giúp tiết kiệm chi phí nếu application không được sử
dụng) nên để giảm độ trễ này Lambda cung cấp cơ chế Provisioned Concurrency, cơ chế này sẽ khởi tạo sẵn một
số lượng theo setting runtime enviroment và khi có request đến thì request sẽ bỏ qua giai đoạn init và đến
thẳng giai đoạn invocation. Tất nhiên việc này sẽ phát sinh thêm chi phí.<br /><br />
<img src="./img/aws-scalling/provision-concurrency.png" /><br /><br />
Bạn có thể monitor các số liệu sau trên Cloudwatch để có được số liệu setting phù hợp cho concurrency
<br /><br />
1, <b>ConcurrentExecutions</b> theo dõi tổng số runtime enviroment đã được init để xử lí events.<br /><br />
2, <b>UnreservedConcurrentExecutions</b> cho biết số lượng function đã được xử lí mà chưa được setting
reserved
concurrency.<br /><br />
3, <b>ProvisionedConcurrencyUtilization</b> cho biết Lambda đã sử dụng bao nhiêu phần trăm runtime
enviroment được
khởi tạo bởi Provisioned Concurrency để xử lí function.<br /><br />
4, <b>ProvisionedConcurrencySpilloverInvocations</b> cho biết function đang xử lí trong enviroment được khởi
tạo
bình thường. (không dùng Provisioned Concurrency)<br /><br />
<h3>Cuối cùng</h3>
Hi vọng, bài viết này sẽ giúp anh em có một mùa chuyển nhượng thành công. ^^!<br /><br />
Bài viết tham khảo: <a href="https://aws.amazon.com/blogs/compute/understanding-aws-lambda-scaling-and-throughput/">Link</a>
</div>
<!-- /post content -->
<!-- post share -->
<div class="section-row">
<div class="post-share">
<div class="fb-like" data-layout="button_count" data-action="like" data-size="large" data-share="true">
</div>
</div>
</div>
<!-- /post share -->
<!-- post comments -->
<div class="section-row">
<div class="section-row">
<div class="fb-comments" data-width="100%" data-order-by="reverse_time" data-numposts="10"></div>
</div>
</div>
<!-- /post comments -->
</div>
</div>
<!-- /row -->
</div>
<!-- /container -->
</div>
<!-- /SECTION -->
<!-- FOOTER -->
<footer id="footer">
<!-- container -->
<div class="container">
<!-- row -->
<div class="footer-bottom row">
<div class="col-md-12">
<div class="contact">
<span><i class="fa fa-phone"></i>
<a href="tel:038 9695 393"> 038 9695 393</a>
</span>
<span><i class="fa fa-envelope"></i>
<a href="mailto:[email protected]">
[email protected]</a></span>
<span><i class="fa fa-skype"></i> ttlpta.g</span>
</div>
</div>
<div class="col-md-6 col-md-push-6">
<ul class="footer-nav">
<li><a href="/">Home</a></li>
<li><a href="cv.html">About Me</a></li>
</ul>
</div>
<div class="col-md-6 col-md-pull-6">
<div class="footer-copyright">
Copyright ©
<script>
document.write(new Date().getFullYear());
</script>
- AnhPT <i class="fa fa-heart-o" aria-hidden="true"></i>
</div>
</div>
</div>
<!-- /row -->
</div>
<!-- /container -->
</footer>
<!-- /FOOTER -->
<!-- jQuery Plugins -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>