Giới thiệu tổng quan về các design pattern cho distributed system
I. Lời mở đầu
Trong lập trình hướng đối tượng, ta có 2 khái niệm quan trọng là class
và object
. Các design pattern giúp ta làm việc được với các class
và object
đó 1 cách hiệu quả. Tượng tự như thế, khi phát triển 1 distributed system ta cũng có các design pattern để làm việc với image container
và container
.
II. Single-container management patterns
Container cung cấp các interface
được dùng để định nghĩa các chức năng của phần mềm ( upward API
) cũng như tương tác với các hệ thống quản lý phần mềm đó ( downward API
). Việc sử dụng các upward API
cho phép các lập trình viên truy cập vào các thông tin chi tiết của ứng dụng, bao gồm việc quản lý các thông tin thể hiện trình trạng của ứng dụng (application health), thông tin ứng dụng (threads, stack, ...), các thông tin configuration, thông tin về logs.
Ví dụ như Kubernetes cho phép lập trình viên có thể định nghĩa việc health check cho ứng dụng thông qua 1 HTTP endpoint
cụ thể nào đó ví dụ như /heath
III. Single-node, multi-container application patterns
Trong pattern này, nhiều container khác nhau sẽ được tổ chức trong 1 máy host duy nhất. Trong Kubernetes, phần abstraction đó được gọi là Pod
. Ví dụ Pod
có thể có 3 container bao gồm 1 container cho Nginx, 1 container cho server của ứng dụng và 1 container cho MySQL
1. Sidecar pattern
Trong mẫu này, chức năng của container chính được mở rộng bởi Sidecar container
sao cho đảm sao cho cả 2 không bị phụ thuộc nhiều vào nhau. Mặc dù ta hoàn toàn có thể viết phần mang phần logic mà chúng ta muốn thêm trực tiếp vào container của ứng dụng (mà không cần phải tạo thêm Sidecar container
), tuy nhiên khi tạo thêm Sidecar container
sẽ mang lại 1 số lợi ích sau đây:
- Giảm sự phụ thuộc về việc cấp phát và quản lý resource.
- Tạo được sử tách biệt ở mức độ về
package
, giảm sự phụ thuộc giữa các container. - Tái sử dụng container của
Sidecar
để dùng lại với các "main" container khác. - Giảm sự phụ thuộc trong việc testing, packaging, upgrade, develoy.
2. Ambassador pattern
Ambassador container
đóng vai trò như 1 proxy giữa các main container khác nhau. Thường dùng trong trường hợp liên quan đến giao tiếp proxy liên quan đến load balancing, sharding để ẩn đi sự phức tạp của ứng dụng.
3. Adapter pattern
Adapter container
đóng vai trò chuẩn hóa và cho ra 1 output trong trường hợp cần làm việc với nhiều input có các chuẩn khác nhau.
Trong khi Ammbassador pattern
ẩn đi sự phức tạp của ứng dụng và chỉ show ra 1 interface đơn giản cho thế giới bên ngoài dùng thì Adapter pattern
làm theo chiều ngược lại, che đi sự phức tạp của thếgiới bên ngoài, biến nó thành 1 interface đơn giản và cung cấp interface đơn giản đó cho phía ứng dụng sử dụng. Nó chuẩn hóa các ouput và interface của nhiều container (có các output có nhiều chuẩn khác nhau) thành 1 chuẩn duy nhất.
IV. Multi-node application patterns
Các modular container
cho phép chúng ta build các coordinated multi-node distributed systems
. Đương nhiên là các ứng dụng sử dụng multi-note pattern
sẽ sử dụng Pod là
abstraction.
1. Leader election pattern
Các Leader-election containers
đóng vai trò như các Sidecar containers
và được quản lý cùng với container chính của ứng dụng. Các Leader-election container
có thể tự chúng thực hiện bầu cử và đóng vai trò như 1 API HTTP đơn giản ở localhost cho các container của ứng dụng cần leader. Các Leader-election containers
có thể được tái sử dụng cho nhiều loại ứng dụng chính khác nhau.
2. Work queue pattern
Mẫu này cài đặt 1 generic work queue framework
sử dụng các container mà implement phương thức run()
và mount()
sau đó build thành 1 hệ thống queue
hoàn chỉnh.
3. Scatter/gather pattern
Mẫu này tương đối giống MapReduce framework
. Có 1 external client
gửi initial request
tới framework được cung cấp bởi root container
. Root
yêu cầu các leaf container
(được cung cấp bởi 1 lượng lớn các lập trình viên) để thực hiện tính toán song song các request đó. Một lập trình viên khác có vai trò cung cấp merge container
để merge kết quả lại. Ngoài ra ta có thể tạo ra 1 container khác gọi là shuffle
có vai trò tương tự như bước shuffle
trong việc thực hiện MapReduce
.
V. Tài liệu tham khảo
https://www.abhishek-tiwari.com/object-inspired-container-design-patterns/