Khóa học
Mọi hệ thống phức tạp đều là kết quả của việc điều phối nhiều hệ thống con. Xây dựng và vận hành các hệ thống như vậy luôn là một thách thức phổ biến, đặc biệt khi làm việc với hạ tầng đám mây.
May mắn thay, đã có nhiều công cụ được phát triển để đơn giản hóa việc điều phối luồng công việc, bất kể mức độ phức tạp. Trong số đó, AWS Step Functions nổi bật nhờ tính hữu dụng và nhiều lợi ích.
Bài viết này tập trung vào cách sử dụng Step Functions để điều phối luồng công việc trong AWS Cloud. Trước tiên, chúng ta sẽ tìm hiểu Step Functions là gì, lợi ích và các tính năng chính của nó.
Sau đó, bài viết hướng dẫn các bước bắt đầu với Step Functions, từ thiết lập môi trường AWS đến khám phá giao diện. Dựa trên nền tảng này, chúng ta sẽ đi qua quy trình từng bước để tạo và triển khai một luồng công việc thực tế.
AWS Step Functions là gì?
AWS Step Functions là dịch vụ điều phối serverless được thiết kế để giúp tạo các luồng công việc trực quan, cho phép phối hợp mượt mà giữa các hàm AWS Lambda và các tài nguyên AWS khác.
Khả năng tích hợp của dịch vụ này rất rộng, hỗ trợ kết nối với Amazon EC2, Amazon ECS, máy chủ on-premise, Amazon API Gateway và hàng đợi Amazon SQS, v.v. Điều này đảm bảo các luồng công việc có thể toàn diện và tương tác với hệ sinh thái dịch vụ AWS rộng lớn.
Tính linh hoạt của AWS Step Functions khiến nó phù hợp với nhiều ứng dụng khác nhau. Dù là quản lý thực hiện đơn hàng, xử lý dữ liệu, vận hành ứng dụng web, hay điều phối bất kỳ chuỗi tác vụ phức tạp nào, Step Functions cung cấp một giải pháp vững chắc cho tự động hóa và quản lý luồng công việc.
Các tính năng và lợi ích chính
Trước khi đi vào khía cạnh kỹ thuật của AWS Step Functions, hãy khám phá những tính năng và lợi ích chính của nó.
Tính năng chính
Step Functions cung cấp nhiều tính năng để đơn giản hóa việc tạo và quản lý luồng công việc, trong đó nổi bật là:
- Tích hợp điểm cuối HTTPS: Cho phép luồng công việc gọi bất kỳ dịch vụ web nào hỗ trợ HTTPS để dễ dàng tích hợp nhiều API web vào quy trình của người dùng.
- Phối hợp thành phần phân tán: Tính năng này cho phép phối hợp các thành phần của hệ thống phân tán, điều tối quan trọng với các ứng dụng phức tạp, đa dịch vụ.
- Quản lý trạng thái tích hợp sẵn: Bằng cách theo dõi tỉ mỉ tiến độ của mỗi lần thực thi luồng công việc, tính năng này duy trì trạng thái ứng dụng của người dùng trong suốt quá trình chạy, đồng thời quản lý dữ liệu truyền giữa các bước.
- Phê duyệt bởi con người: Con người trong vòng lặp là yếu tố thiết yếu của mọi tự động hóa. Tính năng này cung cấp cơ chế đưa can thiệp thủ công vào luồng công việc tự động cho các phê duyệt khi cần.
Lợi ích
Những tính năng chính của AWS Step Functions mang lại cho nhà phát triển và tổ chức nhiều lợi ích để cải thiện vận hành và quy trình phát triển.
|
Đối với nhà phát triển |
Đối với tổ chức |
|
|
Ví dụ thực tế và nghiên cứu tình huống
Dựa trên các tính năng và lợi ích nêu trên, không nghi ngờ gì nữa Step Functions có thể đóng vai trò quan trọng trên nhiều lĩnh vực, giúp doanh nghiệp thiết kế, tự động hóa và mở rộng quy mô luồng công việc một cách hiệu quả.
Phần này tập trung khám phá các ví dụ về cách các ngành khác nhau sử dụng AWS Step Functions để trở nên cạnh tranh hơn, đổi mới hơn và hiệu quả hơn.
Phối hợp microservice
Các tổ chức có kiến trúc dựa trên microservice thường tận dụng AWS Step Functions để quản lý tương tác giữa các dịch vụ.
Ví dụ, một công ty bán lẻ có thể triển khai Step Functions để điều phối các bước xử lý xác thực người dùng, quản lý tồn kho, xử lý thanh toán và gửi đơn hàng, đảm bảo trải nghiệm mua sắm liền mạch.
Bảo mật và vận hành CNTT
AWS Step Functions có thể được dùng để tự động hóa các tác vụ lặp lại như kiểm tra bảo mật, cập nhật hệ thống và xác minh tuân thủ.
Chẳng hạn, trong an ninh CNTT, Step Functions có thể được dùng để thiết kế luồng ứng phó sự cố, từ đó giảm sai sót của con người và thời gian phản hồi bằng cách quản lý có hệ thống từng giai đoạn từ cảnh báo ban đầu đến khắc phục sự cố.
Luồng dữ liệu và quy trình ETL
Với các doanh nghiệp nặng về dữ liệu, AWS Step Functions có thể điều phối xử lý dữ liệu và các tác vụ ETL. Điều này có thể bao gồm luồng công việc để trích xuất dữ liệu từ nhiều nguồn, chuyển đổi về định dạng thống nhất và tải vào nền tảng phân tích hoặc data lake.
Ví dụ, một công ty phân tích có thể triển khai Step Functions để tự động hóa pipeline dữ liệu của mình, đảm bảo xử lý dữ liệu hiệu quả phục vụ quyết định chiến lược.
Vận hành học máy
Step Functions cũng hữu ích trong khía cạnh vận hành của học máy, gồm các quy trình như chuẩn bị dữ liệu, huấn luyện mô hình, đánh giá và triển khai.
Một công ty công nghệ y tế có thể dùng Step Functions để quản lý pipeline tái huấn luyện định kỳ các thuật toán chẩn đoán, duy trì hiệu năng mô hình khi có dữ liệu mới.
Pipeline xử lý media
Trong lĩnh vực truyền thông và giải trí, AWS Step Functions có thể dùng để điều phối các luồng xử lý media phức tạp như mã hóa video, xử lý hình ảnh và phân tích nội dung.
Một công ty media có thể áp dụng Step Functions để đảm bảo nội dung mới, sau khi tải lên, sẽ tự động kích hoạt chuyển đổi định dạng, trích xuất thumbnail và làm giàu metadata trước khi xuất bản.
Bắt đầu với AWS Step Functions
Các phần sau trong bài viết sẽ đề cập đến việc kết hợp Step Functions với các dịch vụ AWS khác. Vì vậy, cần hiểu các kiến thức cơ bản về Step Functions trước khi đi vào các khái niệm nâng cao.
Mục tiêu của phần này là hỗ trợ bạn bắt đầu với AWS Step Functions, từ hiểu các khối xây dựng đến điều hướng giao diện AWS Step Functions.
Các khối xây dựng của Step Functions
Mọi hệ thống hay mô-đun đều là sự kết hợp của nhiều thành phần con, Step Functions cũng vậy. Step Functions dựa trên các khối sau: (1) state machine, và (2) task.
Hãy hiểu các khái niệm này qua một ví dụ.
- State Machine: Một luồng công việc định nghĩa trình tự sự kiện, logic điều kiện và luồng thực thi tổng thể của các tác vụ. Nói ngắn gọn, state machine có thể được định nghĩa là một workflow.
- Task: Một hành động thực hiện tác vụ cụ thể. Nó nhận đầu vào và tạo đầu ra. Ví dụ có thể là truy vấn cơ sở dữ liệu, gọi API hoặc kích hoạt hàm Lambda, v.v.
Xem xét một bài toán đăng ký gửi trẻ sử dụng AWS Step Functions. Trước khi đi vào quy trình tận dụng Step Functions, hãy hiểu các bước tổng thể:
- Thu thập thông tin đăng ký: bước đầu tiên là thu thập thông tin đăng ký từ phụ huynh. Có thể thực hiện qua biểu mẫu web, nhưng trong ví dụ này chúng ta dùng JSON. Khi gửi, một hàm Lambda được kích hoạt, sau đó chuyển thông tin đăng ký sang bước tiếp theo của luồng công việc.
- Xác minh thông tin đăng ký: Bước tiếp theo là dùng hàm Lambda để xác minh thông tin đăng ký. Hàm kiểm tra các trường bắt buộc đã được điền và độ tuổi của trẻ nằm trong phạm vi chấp nhận của cơ sở giữ trẻ. Nếu xác minh thành công, luồng sẽ chuyển sang bước kế tiếp; nếu không, một thông báo lỗi được trả về cho phụ huynh.
- Kiểm tra chỗ trống: khi thông tin đăng ký đã được xác minh, một hàm Lambda khác kiểm tra số chỗ trống tại cơ sở. Nếu còn chỗ, luồng chuyển sang bước kế tiếp; nếu không, một thông báo được gửi cho phụ huynh rằng cơ sở đã đầy.
- Xác nhận đăng ký: bước cuối là một hàm Lambda xác nhận đăng ký và gửi thông báo xác nhận cho phụ huynh, bao gồm ngày bắt đầu và học phí.
Luồng công việc này có một State Machine với bốn task chính, đều khá dễ hiểu.
checkInformationcheckAgeRangecheckSpotsAvailabilityconfirmRegistration
Quy trình đăng ký gửi trẻ bằng AWS Step Functions
Xây dựng AWS Step Function đầu tiên của bạn
Các phần trên mang tính lý thuyết nhiều hơn, và phần này đi vào chi tiết kỹ thuật, bắt đầu từ các điều kiện tiên quyết để dùng Step Functions đến triển khai một luồng từ đầu đến cuối và triển khai nó.
Điều kiện tiên quyết để triển khai Step Functions
Trước khi đi vào chi tiết bài toán, hãy điểm qua các điều kiện tiên quyết cần thiết cho một triển khai thành công:
- Tài khoản AWS: cần để truy cập các dịch vụ AWS và có thể tạo từ trang web của AWS.
- Kiến thức cơ bản về các dịch vụ AWS: Cần quen thuộc với AWS Lambda và Amazon Simple Notification Service (SNS) trong phạm vi bài toán này.
- Kiến thức về JSON: Cần hiểu cơ bản về JSON để nắm định dạng dữ liệu đầu vào và đầu ra.
- AWS IAM: Cần hiểu AWS Identity and Access Management (IAM) để thiết lập quyền phù hợp cho các hàm Lambda được sử dụng.
- Kỹ năng lập trình: Kỹ năng Python cơ bản để viết các hàm Lambda.
Điều hướng giao diện AWS Step Functions
Hãy bắt đầu khám phá giao diện Step Functions. Thực hiện theo bốn bước chính sau sau khi đăng nhập vào tài khoản AWS:
- Gõ từ khóa “Step Functions” vào thanh tìm kiếm phía trên.
- Chọn biểu tượng tương ứng từ kết quả.
- Nhấn biểu tượng “Get Started” để bắt đầu tạo step function đầu tiên.
- Cuối cùng, vì chúng ta muốn tạo state machine của riêng mình, hãy chọn thẻ “Create your own”.

Bốn bước chính để truy cập giao diện Step Functions
Sau bước thứ tư, chúng ta có thể bắt đầu thiết kế state machine với thẻ “Design”, bao gồm ba chức năng chính: “Actions”, “Flow” và “Patterns”.

Ba thành phần chính của thẻ "Design"
- Actions: Tương ứng với các thao tác riêng lẻ có thể thực hiện trong một luồng công việc, gắn với các dịch vụ AWS cụ thể như gọi hàm Lambda, xuất bản thông báo lên SNS, chạy tác vụ trên ECS hoặc khởi động job trong AWS Glue.
- Flow: Đại diện cho các cấu trúc điều khiển xác định đường đi thực thi của state machine. Các phần tử như "Choice" cho rẽ nhánh logic, "Parallel" cho chạy đồng thời, "Map" để lặp qua một tập hợp, "Pass" như thao tác không làm gì hoặc làm giàu dữ liệu trạng thái, "Wait" cho độ trễ thời gian, "Success" để kết thúc luồng thành công và "Fail" để kết thúc do lỗi đều là một phần của điều khiển luồng.
- Patterns: Các mẫu dựng sẵn hoặc thực tiễn tốt nhất cho các kịch bản luồng công việc phổ biến, giúp xây dựng state machine phức tạp dễ dàng hơn. Các mẫu có thể bao gồm tác vụ xử lý dữ liệu đặc thù cho S3 object, tệp JSON, CSV, hoặc các mẫu mục đích chung như Job Poller để điều phối thực thi job bất đồng bộ.
Tạo luồng công việc
Luồng ban đầu nhằm cung cấp cái nhìn tổng quan về các thành phần chính của state machine. Phần này xem xét quy trình triển khai.
Để làm được, chúng ta cần bốn hàm Lambda, mỗi hàm tương ứng với một tác vụ cụ thể.
Bảy bước sau đây nêu bật toàn bộ các bước cần thiết để tạo một hàm Lambda. Quy trình tạo giống nhau cho cả bốn hàm; chỉ khác về nội dung bên trong.
Toàn bộ mã của bài viết có trên trang GitHub. Dù mã rất dễ hiểu, vẫn rất khuyến nghị bạn theo dõi toàn bộ nội dung bài viết để có trải nghiệm tốt hơn.
7 bước chính để tạo Lambda Function
Sau khi hoàn tất bảy bước, cửa sổ sau sẽ xuất hiện, hiển thị các thông tin quan trọng như:
- Tên hàm
- Liên kết Amazon Resource Name (ARN), và
- Khu vực tích hợp để triển khai logic của hàm.
Chi tiết hàm checkInformation
Giờ hãy lặp lại quy trình cho ba tác vụ (hàm) còn lại: checkAgeRange, checkSpotsAvailability và confirmRegistration.
Ví dụ về JSON đầu vào được đưa ra bên dưới. Việc hiểu JSON này rất quan trọng vì nó ảnh hưởng đến cách triển khai các hàm.
- JSON chứa thông tin về đứa trẻ được đăng ký, gồm tên, họ và ngày sinh.
- Nó cũng bao gồm thông tin về cha mẹ, các ngày trong tuần mà trẻ sẽ đến gửi và mọi thông tin bổ sung.
{
"registration_info": {
"child": {
"firstName": "Mohamed",
"lastName": "Diallo",
"dateOfBirth": "2016-07-01"
},
"parents": {
"mother": {
"firstName": "Aicha",
"lastName": "Cisse",
"email": "aicha.cisse@example.com",
"phone": "123-456-7890"
},
"father": {
"firstName": "Ibrahim",
"lastName": "Diallo",
"email": "ibrahim.diallo@example.com",
"phone": "098-765-4321"
}
},
"daysOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"specialInstructions": "Mohamed has a peanut allergy."
}
}
Mỗi hàm Lambda được mô tả dưới đây:
|
Hàm |
Mô tả |
|
|
|
|
|
|
|
|
|
|
|
|
Triển khai cơ bản của mỗi hàm được cung cấp bên dưới:
checkInformation function
import json
def checkInformation(event, context):
registration_info = event['registration_info']
required_fields = ['child', 'parents', 'daysOfWeek']
for field in required_fields:
if field not in registration_info:
return {
'statusCode': 400,
'body': f'Missing required field: {field}'
}
return {
'statusCode': 200,
'body': json.dumps(registration_info)
}
checkAgeRange function
import json
import datetime
def checkAgeRange(event, context):
registration_info = json.loads(event['body'])
dob = registration_info['child']['dateOfBirth']
today = datetime.date.today()
dob_date = datetime.datetime.strptime(dob, '%Y-%m-%d').date()
age = today.year - dob_date.year - ((today.month, today.day) < (dob_date.month, dob_date.day))
if age < 2 or age > 5:
return {
'statusCode': 400,
'body': json.dumps('Child is not within the acceptable age range for this daycare.')
}
registration_info['child']['age'] = age
return {
'statusCode': 200,
'body': json.dumps(registration_info)
}
checkSpotsAvailability function
import json
def checkSpotsAvailability(event, context):
registration_info = json.loads(event['body'])
spots_available = 20 # This should be dynamically determined, not hardcoded
if spots_available <= 0:
return {
'statusCode': 400,
'body': json.dumps('No spots available in the daycare.')
}
return {
'statusCode': 200,
'body': json.dumps(registration_info)
}
confirmRegistration function
import json
import datetime
def confirmRegistration(event, context):
registration_info = json.loads(event['body'])
age = registration_info['child']['age'] # This was added in the checkAgeRange function
if age >= 2 and age < 3:
fees = 800
elif age >= 3 and age < 4:
fees = 750
elif age >= 4 and age < 5:
fees = 700
else: # age >= 5
fees = 650
start_date = datetime.date.today() + datetime.timedelta(weeks=2)
confirmation_details = {
'fees': fees,
'start_date': start_date.isoformat()
}
response = {**registration_info, **confirmation_details}
return {
'statusCode': 200,
'body': json.dumps(response)
}
Với tất cả những điều trên, chúng ta có thể bắt đầu tạo state machine cho bài toán gửi trẻ bằng giao diện trực quan của Step Functions.
State machine cuối cùng được đưa ra dưới đây, và hãy cùng hiểu các bước chính dẫn đến luồng này:

Luồng state machine cho bài toán gửi trẻ
Trước khi đi sâu, cần lưu ý rằng trường statusCode từ đầu ra của hàm Lambda được dùng để xác định trạng thái tiếp theo trong state machine.
- Nếu giá trị là 200, nghĩa là kiểm tra thành công và chúng ta tiếp tục bước kế tiếp.
- Nếu
statusCodelà 400, tức là kiểm tra thất bại, khi đó ta trả về thông điệp phù hợp tùy theo hàm đã thực thi tác vụ.
Check Information
- State machine bắt đầu ở bước này.
- Một hàm Lambda được gọi để kiểm tra tất cả thông tin bắt buộc có trong biểu mẫu đăng ký.
- Nếu thông tin đầy đủ, quy trình chuyển sang bước kế tiếp. Nếu không, kết thúc với trạng thái thất bại thông báo thông tin chưa hoàn chỉnh.
Check Age Range
- Bước này chỉ tới khi kiểm tra thông tin thành công.
- Một hàm Lambda khác được gọi để kiểm tra độ tuổi của trẻ có nằm trong phạm vi chấp nhận của cơ sở.
- Nếu độ tuổi phù hợp, quy trình chuyển sang bước kế tiếp. Nếu không, kết thúc với trạng thái thất bại thông báo độ tuổi không hợp lệ.
Check Spots Availability
- Bước này chỉ tới khi kiểm tra độ tuổi thành công.
- Một hàm Lambda được gọi để kiểm tra còn chỗ trống tại cơ sở hay không.
- Nếu còn chỗ, quy trình chuyển sang bước kế tiếp. Nếu không, kết thúc với trạng thái thất bại thông báo không còn chỗ trống.
Confirm Registration
- Đây là bước cuối cùng và chỉ đến khi còn chỗ trống tại cơ sở.
- Một hàm Lambda được gọi để xác nhận đăng ký và tính học phí dựa trên độ tuổi của trẻ.
- Quy trình kết thúc sau bước này với trạng thái thành công, xác nhận đăng ký.
Để tìm hiểu thêm về Lambda, khóa học Streaming Data with AWS Kinesis and Lambda hướng dẫn cách làm việc với dữ liệu streaming bằng công nghệ serverless trên AWS.
Tạo IAM Role
Bước tiếp theo là định nghĩa IAM role để Step Functions có thể gọi các hàm Lambda. Thực hiện theo các bước sau:

Chín bước đầu để tạo IAM role

Bước thứ 10 và 11 để tạo IAM role
IAM role này có thể được gán cho state machine như sau, bắt đầu từ thẻ “Config”.

3 bước chính để cấp IAM role
Sau khi lưu, chúng ta sẽ thấy thông báo sau nếu mọi thứ diễn ra suôn sẻ.

Thông báo thành công khi tạo state machine
Khi đã hài lòng với state machine, bước tiếp theo là tạo nó bằng nút “Create” ở góc trên bên phải.
Minh họa việc thực thi state machine
Triển khai và kiểm thử luồng công việc
Luồng công việc của chúng ta đã được triển khai, giờ là lúc kiểm thử state machine. Chúng ta sẽ kiểm thử hai kịch bản:
- Một trường hợp thất bại với phạm vi tuổi hợp lệ, khi đứa trẻ muốn đăng ký hơn 5 tuổi. Điều này tương ứng với JSON ban đầu.
- Một trường hợp thành công khi trẻ 3 tuổi.

Kết quả trường hợp thành công

Kết quả trường hợp thất bại
Tối ưu hóa Step Functions của bạn
Tối ưu hóa bất kỳ quy trình nào đều bắt đầu bằng việc áp dụng các thực tiễn tốt nhất liên quan, có thể cải thiện hiệu năng và chi phí. Những thực tiễn tốt sau đây có thể giúp bạn khai thác tối đa mọi AWS Step Function.
- Thực tiễn hiệu năng: Gồm các chiến lược như giảm thiểu số lần chuyển trạng thái, sử dụng thiết lập timeout phù hợp và tối ưu các hàm AWS Lambda.
- Thực tiễn tiết kiệm chi phí: Gồm các chiến lược như sử dụng đúng loại state machine (Standard hoặc Express), quản lý chi phí AWS Lambda và hiểu, quản lý giá của Step Functions.
Kết luận
Bài viết này đã cung cấp hướng dẫn toàn diện để hiểu và sử dụng AWS Step Functions. Mở đầu bằng việc giới thiệu AWS Step Functions cùng các tính năng và lợi ích chính.
Sau đó, bài viết hướng dẫn người đọc thiết lập môi trường AWS và điều hướng giao diện AWS Step Functions.
Tiếp nữa, bài viết đi qua quy trình xây dựng Step Function đầu tiên, từ tạo luồng cơ bản đến triển khai và kiểm thử. Bài viết cũng khám phá các tính năng nâng cao và trường hợp sử dụng của AWS Step Functions, trước khi thảo luận cách tối ưu để đạt hiệu quả và tiết kiệm chi phí tối đa.
Tổng kết
Các bài viết So sánh dịch vụ AWS, Azure và GCP cho Khoa học dữ liệu & AI và Giới thiệu AWS Boto trong Python có thể là những bước tiếp theo tuyệt vời để học thêm.
Bài đầu cung cấp so sánh các dịch vụ chính cần cho công việc liên quan đến dữ liệu và AI, từ kỹ thuật dữ liệu đến phân tích dữ liệu, khoa học dữ liệu và xây dựng ứng dụng dữ liệu. Tờ cheat sheet này giúp bạn hiểu bức tranh dịch vụ đám mây cho khoa học dữ liệu và AI trên ba nền tảng lớn.
Bài thứ hai giới thiệu dễ hiểu về AWS Boto trong Python, hướng dẫn cách khai thác công nghệ đám mây để tối ưu hóa quy trình dữ liệu. Đây có thể là tài nguyên tuyệt vời cho bất kỳ ai muốn tự động hóa vận hành AWS bằng Python.
AWS có rất nhiều dịch vụ, và chìa khóa để làm chủ AWS Step Functions là hiểu yêu cầu của ứng dụng và sử dụng đúng kết hợp các dịch vụ, tính năng AWS để đáp ứng các yêu cầu đó.
Nhà khoa học dữ liệu đa tài, yêu thích chia sẻ kiến thức và đóng góp cho cộng đồng, Zoumana là người sáng tạo nội dung trên YouTube và là cây bút công nghệ hàng đầu trên Medium. Anh yêu thích thuyết trình, lập trình và giảng dạy. Zoumana có hai bằng thạc sĩ: một về khoa học máy tính chuyên sâu Học máy tại Paris, Pháp, và một về Khoa học dữ liệu tại Texas Tech University, Hoa Kỳ. Anh bắt đầu sự nghiệp với vai trò Nhà phát triển phần mềm tại Groupe OPEN ở Pháp, sau đó chuyển sang IBM làm Tư vấn Học máy, nơi anh phát triển các giải pháp AI đầu-cuối cho các công ty bảo hiểm. Zoumana gia nhập Axionable, startup Trí tuệ nhân tạo Bền vững đầu tiên có trụ sở tại Paris và Montreal. Tại đây, anh làm Nhà khoa học dữ liệu và triển khai các sản phẩm AI, chủ yếu là các bài toán NLP, cho khách hàng tại Pháp, Montreal, Singapore và Thụy Sĩ. Ngoài ra, 5% thời gian của anh được dành cho Nghiên cứu và Phát triển. Hiện tại, anh làm việc với vai trò Nhà khoa học dữ liệu cao cấp tại IFC - Nhóm Ngân hàng Thế giới.




