0

Makefile có tác dụng gì

COMPOSE := docker compose -f deployments/docker-compose.yml
KT      := /opt/kafka/bin/kafka-topics.sh
BOOT    := localhost:9092

.PHONY: up down stop logs ps topics smoke reset

up:                       ## Khởi động hạ tầng
	$(COMPOSE) up -d

down:                     ## Dừng và xoá container (giữ dữ liệu)
	$(COMPOSE) down

stop:                     ## Tạm dừng, giữ nguyên mọi thứ
	$(COMPOSE) stop

logs:                     ## Xem log realtime
	$(COMPOSE) logs -f

ps:                       ## Trạng thái container
	$(COMPOSE) ps

topics:                   ## Tạo topic (chạy được nhiều lần)
	@for t in post social identity; do \
		$(COMPOSE) exec -T kafka $(KT) --bootstrap-server $(BOOT) \
			--create --if-not-exists --topic $$t --partitions 3 --replication-factor 1; \
	done
	@for t in post.DLQ social.DLQ identity.DLQ; do \
		$(COMPOSE) exec -T kafka $(KT) --bootstrap-server $(BOOT) \
			--create --if-not-exists --topic $$t --partitions 1 --replication-factor 1; \
	done
	@$(COMPOSE) exec -T kafka $(KT) --bootstrap-server $(BOOT) --list

smoke:                    ## Kiểm tra kết nối từ Go
	go run ./cmd/smoketest

reset:                    ## ⚠️ XOÁ SẠCH dữ liệu và dựng lại
	$(COMPOSE) down -v
	$(COMPOSE) up -d

Trong thế giới backend, Makefile hoạt động như một "bản thực đơn" gom tất cả các dòng lệnh shell dài ngoằng, phức tạp thành những từ khóa ngắn gọn, dễ nhớ. Thay vì phải copy/paste hay gõ lại nguyên một cụm lệnh Docker, Kafka hay build source code, bạn chỉ cần gõ make <tên_lệnh> trên terminal.

Dựa vào file Makefile, đây là một script tự động hóa được thiết kế rất chuẩn chỉ cho một hệ thống sử dụng Docker Compose, Kafka và Golang. Dưới đây là phân tích chi tiết tác dụng của từng phần:


1. Phần khai báo biến (Variables)

Khai báo biến giúp gom các chuỗi dài lại, nếu sau này cần đổi đường dẫn hoặc port, bạn chỉ cần sửa ở một nơi duy nhất.

  • COMPOSE := docker compose -f deployments/docker-compose.yml: Trỏ thẳng lệnh docker compose vào đúng file cấu hình nằm trong thư mục deployments.
  • KT := /opt/kafka/bin/kafka-topics.sh: Đường dẫn tới script quản lý topic bên trong container Kafka.
  • BOOT := localhost:9092: Địa chỉ của Kafka broker (Bootstrap server).

2. Phần khai báo .PHONY

.PHONY: up down stop logs ps topics smoke reset

Theo mặc định, Make sẽ tìm kiếm các file có tên trùng với tên lệnh (ví dụ: file tên là up). Khai báo .PHONY nhằm báo cho hệ thống biết rằng: "Đây là tên của các hành động (commands), không phải là tên file". Điều này giúp tránh lỗi nếu trong thư mục vô tình có một file nào đó tên là up hoặc logs.


3. Các kịch bản tự động hóa (Targets)

Dưới đây là cách file này chia nhóm các tác vụ để quản lý hạ tầng:

Quản lý vòng đời Docker (Infrastructure)

Thay vì phải gõ thêm cờ -f deployments/... mỗi lần tương tác với Docker, bạn chỉ cần dùng các lệnh Make cực ngắn:

Lệnh Chạy ngầm lệnh gì? Tác dụng
make up docker compose ... up -d Chạy ngầm toàn bộ hạ tầng (Kafka, DB, Zookeeper...) ở chế độ background (detached).
make down docker compose ... down Tắt và gỡ bỏ các container, mạng ảo (network) nhưng giữ lại dữ liệu trong volumes.
make stop docker compose ... stop Tạm dừng container. Lần sau bật lên sẽ nhanh hơn.
make logs docker compose ... logs -f Bám theo và in ra log liên tục (realtime) của toàn bộ hạ tầng.
make ps docker compose ... ps Kiểm tra xem container nào đang chạy, đang chết hay báo lỗi.

Quản lý Kafka (Provisioning)

Lệnh make topics là một kịch bản rất hay. Khi gõ lệnh này, Makefile sẽ chạy vòng lặp bash (for) để tự động tạo ra các Kafka topics cần thiết cho hệ thống:

  • Tạo Main Topics: Tạo 3 topic chính là post, social, identity với 3 partitions (để tăng tốc độ đọc song song) và replication-factor là 1.
  • Tạo Dead Letter Queue (DLQ): Tiếp tục tạo 3 topic DLQ tương ứng (post.DLQ, social.DLQ, identity.DLQ) với 1 partition. Đây là nơi chứa các message bị lỗi, không thể xử lý để theo dõi sau.
  • List Topics: Liệt kê lại toàn bộ topic đang có để xác nhận.

(Dấu @ ở đầu các dòng lệnh dùng để ẩn việc in dòng lệnh đó ra terminal, giúp output sạch sẽ hơn).

Kiểm thử và Dọn dẹp (Testing & Reset)

  • make smoke: Gọi file Golang (go run ./cmd/smoketest) để chạy kịch bản "smoke test" – thường là đoạn code nhỏ để ping thử vào Kafka/Database xem kết nối từ ứng dụng Go có thành công không sau khi hạ tầng đã up.
  • make reset: Lệnh nguy hiểm nhưng tiện lợi lúc dev. Chữ -v (volumes) sẽ xóa sạch sành sanh mọi dữ liệu cũ trong Database/Kafka, sau đó dựng lại một hệ thống trắng tinh khôi từ đầu.

Tóm lại

Makefile này giúp một developer mới vào dự án chỉ cần gõ đúng 3 lệnh: make up, make topics, và make smoke là đã có đủ môi trường hạ tầng để bắt đầu code, không cần phải nhớ bất kỳ tham số phức tạp nào.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí