Web Architecture 101
Dưới đây là kiến trúc điển hình nhất được các hệ thống website hiện nay áp dụng

Hệ thống website Storyblocks

Sau khi user nhập URL, browser sẽ gửi một request đến server DNS. Server DNS sẽ tìm kiếm IP của server theo domain name và connect đến server của website.

Trước khi request đến được với web server, request đó sẽ hit hệ thống load balancer của StoryBlocks, tại đây request sẽ được đưa đến một cách ngẫu nhiên tới 1 / 10 server để xử lí.

Storyblocks cho phép tìm kiếm theo màu sắc của hình ảnh, nhưng việc tính toán để lấy được màu sắc chính của một bức ảnh sẽ không được thực hiện đồng bộ với việc trả ảnh về cho user, tức là chỉ trả ảnh sau khi lấy được màu sắc chính của bức ảnh. Để thực hiện tính năng này, Storyblocks sẽ gửi job này đến một job queue, và việc tính toán sẽ được xử lí một cách bất đồng bộ với quá trình trả ảnh tới user.

Ngoài ra, để tìm được cả những chiếc ảnh có chủ đề liên quan, Storyblocks gửi 1 request to hệ thống full text search với title của ảnh sẽ là input. Đối với user sử dụng account, kết quả tìm kiếm sẽ được lưu vào cùng thông tin của user, dữ liệu sẽ được sử dụng analytic sau này.

Lúc này tại web server được chọn sẽ bắt đầu render view (HTML) và trả về cho browser của user. JS và CSS của page sẽ được load từ hệ thống CDN

After all, trang web sẽ được hiển thị đến user.

Tổng quan là thế, bây giờ chúng ta sẽ đi vào chi tiếp từng thành phần ...

1, DNS

DNS (DOMAIN NAME SYSTEM) đây là 1 công nghệ xương sống với tất cả website trên thế giới. Đơn giản có thể hiểu DNS là 1 quyển danh bạ : Tên chúng ta chính là domain name , và số điện thoại chính là rải IP của server web cái chúng ta request đến. Sau khi user nhập domain name vào thanh điều hướng của browser, domain này sẽ được gửi đến DNS và từ đó map ra dải IP tương ứng, từ đó user có thể request đến đúng web server.

2, LOAD BALANCER

Trước khi tìm hiểu load balancer, chúng ta cần biết về một khái niệm về việc scaling application theo chiều ngang và scaling theo chiều dọc. Chiều ngang có nghĩa là bạn thêm nhiều machines vào system, còn chiều dọc có nghĩa là chúng ta tăng sức mạnh cho server (nhiều RAM hơn, nhiều CPU hơn,...)

Khi scaling 1 hệ thống web, scale theo chiều ngang thường được cân nhắc áp dụng trước bởi vì khi gặp những trouble như rớt mạng, server crash, hay khù khoằm hơn là mất điện, việc có thêm 1 server cho phép bạn yên tâm là hệ thống web của bạn vẫn có thể hoạt động. Và 1 lí do đơn giản nữa là bạn có thể dễ dàng có 400 con server RAM 8G hơn là 1 con máy lắp 400 con RAM 8G.

OK, quay lại load balancer, đây như là 1 khái niệm cơ bản nhất khi ta muốn scaling hệ thống theo chiều ngang. Load balancer như người điều phối request đến một trong những web server của chúng ta, những server này phải là bản sao của nhau, phải giống nhau tới từng cầu hình, bất cứ server nào trong hệ thống , cũng xử lí request 1 cách giống nhau, return về 1 data giống nhau.

Nhiệm vụ duy nhất của load balancer là việc chia tải sao cho không server nào bị quá tải.

3, WEB SERVER

Ở high level thì server web rất dễ để có thể mô tả, chúng xử lí request của user và trả về HTML để browser của user show up. Để làm việc này chúng giao tiếp với database, caching, job queue, các services, data queue,... và để ra lệnh cho server làm việc theo ý chúng ta, ae phải dùng các ngôn ngữ lập trình như PHP, JS, Ruby, and Java

4, DATABASE

Mọi ứng dụng đều cần 1 hoặc nhiều database để lưu trữ thông tin. Tùy vào loại database sẽ cung cấp các cách để thiết kế kiến trúc data. Ngoài ra database sẽ support các tính năng: thêm , sửa xóa data, thực hiện các tính toán dựa trên data hiện tại. Có 2 loại database hiện nay SQL (Structured Query Language) và NoSQL (Non-Structured Query Language)

5, CACHING

Caching là kho lưu trữ dữ liệu theo kiểu key - value (VD: name - TuanAnh, age - 18, ...) việc này giúp đơn giản hóa nhất có thể việc lưu và tìm kiếm thông tin nhanh nhất. Một ứng dụng web thường sử dụng hệ thống caching để lưu kết quả một phép tính phực tạp hay kết quả từ database, external service , có khi cả HTML. Có 2 công nghệ caching được sử dụng rộng rãi nhất là : Redis và Memcache
VD: Google cache kết quả tìm kiếm cho "Dog", Facebook cache các bài post, data friends của bạn

6, JOB QUEUE và JOB SERVER

Các ứng dụng web hiện nay thường xử lí bất đồng bộ 1 task nào đó song song với task chính là phản hồi với request của user. Ví dụ: như việc chat qua lại giữa 2 user, để giảm độ trễ của msg từ người gửi đến người nhận , việc save msg vào db sẽ được cho vào 1 job queue để thực hiện song song với việc trả về tin nhắn cho người nhận.

Có rất nhiều kiến trúc cho job queue này, nhưng kiến trúc phổ biến nhất là bao gồm 2 thành phần : 1 là queue để chứa các jobs và 2 là 1 hoặc nhiều server (workers) để thực hiện các job này

Một job queue sẽ được thực hiện theo thứ tự FIFO (First In, First Out). Job server sẽ thăm dò queue để check xem có job nào để thực hiện không nếu có sẽ pop ra và thực hiện chúng.

7, FULL-TEXT SEARCH SERVICE

Để phục vụ cho việc search theo keyword của user có thể trả về nhiều kết quả liên quan nhất trong thời gian nhanh nhất, chúng ta thường sử dụng 1 công nghệ được gọi là "full-text search", việc này tận dụng inverted index để tăng performance cho việc search.



Platform full-text search phổ biến nhất là Elasticsearh, ngoài ra các DB như Mysql, cũng support việc Full text search.

8, MICROSERVICES

Anh em hình dung 1 ngày đẹp trời, 1 ông AnhPT là dev của 1 website E-commerce, code như shit làm hỏng phần checkout , khiến server crash, tất nhiên lúc đó client sẽ không thể truy cập vào website được nữa. Để giảm thiểu rủi ro cho việc này, tức là vẫn không thể checkout được nhưng user vẫn có thể xem những product yêu thích, vẫn add to cart..v..v làm những chức năng không liên quan đến phần checkout, người ta đã phát mình ra mô hình các service chạy như những appicaltion riêng biệt. Bạn hình dung việc này như việc trong 1 hệ thống web sẽ có những website con có db riêng, có hệ thống caching riêng v.v. Tất nhiên chúng sẽ không exposed ra ngoài, mà chỉ tương tác nội bộ với nhau qua API.

Ví dụ: trong 1 website E-commerce, ae sẽ có :

- Account service : chỉ dể để xử lí các nghiệp vụ liên quan đến user.
- Product service : chỉ dể để xử lí các nghiệp vụ liên quan đến product.
- Payment service :
....

9, DATA

Ngày nay, các công ty tồn tại được hay không là do việc họ xử lí data tốt đến mức nào. Khi web đã nở đến một mức độ nhất đinh thì việc phân tích data về user interactions là công việc tiếp theo nên làm.

Có 3 giai đoạn chính :

1, Data ghi lại các tương tác của user với web sẽ được gửi đến nơi chuyên nhận và xử lí data, thường được gọi là data firehose. Raw data sẽ được dịch hoặc thêm data và được chuyền đến một firehose khác. AWS Kinesis và Kafka là 2 công nghệ phổ biện cho mục đích này.
2, Raw data sau khi đã phân tích, lọc , thêm bớt, cuồi cùng sẽ được lưu vào cloud storage.
3, Tại đây data sẽ được load vào 1 data warehouse để phân tích để có thể sử dụng. Ae có thể tìm hiểu AWS Redshift, để biết quá trình phần tích data như nào.

10, CLOUD STORAGE

Cloud storage là cách đơn giản nhất và linh hoạt nhất để lưu trữ và chia sẻ data trên Internet. Chúng ta có thể sử dụng Cloud storage để phải lưu trữ ít hơn trên server web. Amazon S3 đang là cloud storage thông dụng nhất hiện nay.

11, CDN (Content Delivery Network)

Đây là công nghệ cung cấp giải pháp để load các file assets như static HTML, CSS, JS , Image nhanh nhất có thể nhanh hơn load trên chính server web đó. Phương thức hoạt động là các file assets sẽ được phân phối đến các server đặt ở các nơi trên thế giới, dựa vào vị trí của user mà CDN sẽ serve file assets ở server gần nhất với user thay vì phải load ở chính server web. Ví du bạn ở Việt Nam, bạn sẽ load file ảnh được đặt ở server HongKong , tất nhiên sẽ nhanh hơn rất nhiều bạn load 1 file ảnh ở Mẽo.



Bài viết được dịch nguyên si theo ý hiểu của mình từ bài viết này