$ today_i_learn
Biển học vô cùng
Đây là 3 kiến trúc phổ biến cho một ứng dụng.
Monolith đóng gói tất cả chức năng trong một process. Mọi thứ xảy ra trong đó. Đây là kiến trúc phổ biến, cổ truyền.
SOA tách các chức năng chính ra thành các process riêng độc lập và giao tiếp với nhau. Từ monolith phát triển sang SOA khi hệ thống cần tính cô lập, đơn nhiệm, dễ phát triển những chức năng quan trọng, hay nặng đô hơn. Nhưng cũng nảy sinh nhiều vấn đề như giao tiếp giữa các service, bảo mật, deploy,… Microservice cũng là một dạng SOA.
Sau này còn có Serverless là các chức năng đơn giản mà người ta chỉ quan tâm cách nó hoạt động và điều gì trigger nó mà không quan tâm nhiều về server (chứ không phải là không cần server).
Kế thừa như là uỷ quyền trả lời message. Nếu object không thể thực hiện message thì nó sẽ tìm trong cây phả hệ các lớp cha xem có kiến thức gì về message này không.
Dùng kế thừa khi có nhiều kiểu mang cùng điểm tương đồng, kiểu như một dạng chuyên biệt của một cái gì đó chung chung hơn ví dụ như xe đạp thì có nhiều loại như xe địa hình, xe đi trong phố, xe em bé,… người dùng thì có khách, admin, nhân viên,…
Tạo kế thừa theo kiểu đẩy trừu tượng từ lớp chuyên biệt lên lớp cha.
Phải luôn nhớ, phụ thuộc khiến các đối tượng dính vào nhau, làm cho việc thay đổi khó khăn hơn và dễ bị ảnh hưởng qua lại. Khi cảm thấy lớp con phụ thuộc quá nhiều vào lớp cha ví dụ khi khởi tạo nó phải gọi tới super (biết lớp cha làm gì) thì có thể dùng template pattern hoặc hook.
Ví dụ trong initialize của lớp con có gán vài thuộc tính chuyên biệt của nó và gọi super để gán thuộc tính chung thì có thể dùng hook post_initialize để gán những thuộc tính chuyên biệt này. Lớp con giờ không cần biết lớp cha khởi tạo như thế nào nữa, cái gì của riêng nó thì nằm trong hook.
Khi tạo lớp con mới thì chỉ cần làm theo các lớp con có sẵn và tạo method tương ứng là được, không bị lỗi, không cần nhiều kiến thức, dễ thay đổi.
dưới local có thể chạy bình thường nhưng khi deploy nếu chỉ chạy lệnh kamal deploy thì server vẫn chạy phiên bản Ruby cũ. Để cập nhật phiên bản mới trên server giống với local thì cần sửa mục:
# deploy.yml
builder:
arch: amd64
args:
RUBY_VERSION: 4.0.0 <~~ Sửa thành phiên bản mới
# Dockerfile
ARG RUBY_VERSION=4.0.0 <~~ Sửa thành phiên bản mới
Sau đó chạy lệnh kamal deploy --no-cache để build lại image mới và deploy app. Nguyên lý của Kamal là build Docker image → push lên registry → server pull về chạy. Server khi deploy hay dùng bản cache cho lẹ, nên buộc mình phải chạy --no-cache để build bản mới.
Trong quá trình chạy có thể sẽ gặp vài gem không hỗ trợ Ruby mới (4) thì bạn phải tự cài tay lại (bằng bundle update [tên gem]). Trường hợp của mình là gem ffi (1.17.4) và pg (1.6.3).