0

[Backend Tips] "Tại sao App của tôi không kết nối được Memcached?" - Chuyện về MEMCACHED_HOST

1. Cái bẫy mang tên "localhost"

Bạn vừa cài đặt xong Memcached lên server, hoặc hào hứng khởi tạo một container mới. Bạn viết code, set cấu hình MEMCACHED_HOST=127.0.0.1 và... Boom! Lỗi Connection Refused đập thẳng vào mặt.

Nhiều bạn mới làm quen với Docker thường thắc mắc: "Tại sao em ping từ máy thật thì được, mà App trong Docker lại không thấy Memcached?".

Câu trả lời nằm ở từ khóa: Service Discovery.

2. Ý nghĩa thực sự của MEMCACHED_HOST=memcached

Trong môi trường Docker Compose hoặc Kubernetes, memcached không chỉ là một cái tên cho vui. Nó là một Hostname được phân giải bởi hệ thống DNS nội bộ.

Khi bạn đặt cấu hình: MEMCACHED_HOST=memcached

Bạn đang ra lệnh cho ứng dụng: "Đừng tìm ở nhà (localhost) nữa, hãy đi hỏi ông bảo vệ Docker DNS xem đứa nào tên là 'memcached' thì kết nối vào đó!"

3. Tại sao cấu hình này lại "quyến rũ" đến thế?

  • Tính trừu tượng (Abstraction): Bạn không cần quan tâm IP của container Memcached là 172.18.0.3 hay 172.18.0.10. Chỉ cần nhớ cái tên "vợ gọi" là memcached.
  • Dễ dàng Scale: Hôm nay bạn chạy 1 node, ngày mai bạn chạy một cụm cluster đứng sau một Load Balancer cũng tên là memcached, code của bạn hoàn toàn không phải sửa một dòng nào.
  • Nhất quán giữa các môi trường: Từ Local, Staging đến Production, bạn chỉ cần giữ nguyên biến môi trường này. Sự khác biệt duy nhất nằm ở cách hệ thống DNS của hạ tầng đó trỏ cái tên đó đi đâu.

4. Setup "Chuẩn bài" với Docker Compose

Để biến MEMCACHED_HOST=memcached trở thành hiện thực, file docker-compose.yml của bạn nên trông như thế này:

version: '3.8'
services:
  app:
    image: my-awesome-app
    environment:
      - MEMCACHED_HOST=memcached # Tên service bên dưới
      - MEMCACHED_PORT=11211
    depends_on:
      - memcached

  memcached:
    image: memcached:alpine
    ports:
      - "11211:11211"

5. Những "lưu ý tử thần" khi cấu hình

  1. Network chung: Hãy đảm bảo App và Memcached nằm chung một network. Nếu không, dù có gọi tên khản cổ, chúng cũng không thấy nhau.
  2. Thứ tự khởi động: Sử dụng depends_on để đảm bảo Memcached "sống" trước khi App bắt đầu đi tìm nó.
  3. Case-sensitive: Một số hệ thống phân biệt chữ hoa chữ thường. Tốt nhất là luôn dùng chữ thường cho hostname.

Lời kết

Dòng config MEMCACHED_HOST=memcached tuy ngắn gọn nhưng nó là đại diện cho tư duy thiết kế hệ thống hiện đại: Rời rạc (Decoupling) và Linh hoạt (Flexibility).

Hy vọng bài viết này giúp các bạn hiểu rõ hơn về "phép thuật" đằng sau những biến môi trường quen thuộc. Nếu thấy hữu ích, đừng quên Upvote và Clip bài viết lại để dành khi cần nhé!


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í