VPS

Laravel Horizon: theo dõi queue bằng giao diện

Thanh Nguyễn Đăng 8 phút đọc 5 khối lệnh

Laravel Horizon: theo dõi queue bằng giao diện
Mục lục bài viết
  1. Khi nào nên thêm Horizon
  2. Cài và cấu hình
  3. Chạy Horizon như dịch vụ
  4. Chặn đường dẫn quản trị
  5. Đọc số liệu cho đúng
  6. Khi nào nên thêm và khi nào chưa cần
  7. Chặn đường dẫn quản trị, việc bắt buộc
  8. Hàng đợi dài lên nói lên điều gì
  9. Câu hỏi thường gặp
  10. Bài viết liên quan

Trả lời nhanh: Laravel Horizon là bảng điều khiển cho hàng đợi chạy trên Redis: bạn nhìn thấy job đang chờ, job đang chạy, job hỏng, thời gian chờ trung bình và thông lượng theo phút, tất cả trong một trang web. Nó cũng thay bạn quản lý số lượng worker theo cấu hình khai báo. Hai điều kiện: bắt buộc dùng Redis, và phải chặn đường dẫn quản trị vì mặc định trang này lộ khá nhiều thông tin nội bộ.

Hàng đợi chạy êm thì không ai để ý, tới lúc có sự cố thì câu hỏi đầu tiên luôn là đang tồn bao nhiêu job và tồn từ khi nào. Trả lời bằng câu truy vấn database thì được, nhưng chậm và không thấy xu hướng. Horizon sinh ra để trả lời những câu đó trong hai giây, kèm biểu đồ cho thấy chuyện bắt đầu hỏng từ lúc nào.

Khi nào nên thêm Horizon

Không phải dự án nào cũng cần. Nếu bạn chỉ có một worker gửi email và một bảng job hỏng có cảnh báo, thêm Horizon là thêm việc phải trông. Cách dựng tối giản đó nằm ở bài Laravel queue trên VPS.

Ba dấu hiệu cho thấy đã tới lúc:

  • Nhiều loại job với mức ưu tiên khác nhau, và bạn cần biết loại nào đang bị dồn.
  • Tải biến động theo giờ, ví dụ cao điểm buổi tối, và bạn muốn số worker tự co giãn theo.
  • Có người vận hành không phải lập trình viên cần nhìn được tình trạng hệ thống mà không phải gõ lệnh.

Cài và cấu hình

TerminalCài và cấu hìnhbash
composer require laravel/horizonphp artisan horizon:installphp artisan migrate

Trong config/horizon.php, phần đáng chỉnh nhất là khai báo nhóm worker cho môi trường thật:

TerminalCài và cấu hìnhbash
'environments' => [    'production' => [        'supervisor-chinh' => [            'connection' => 'redis',            'queue' => ['cao', 'mac-dinh'],            'balance' => 'auto',            'minProcesses' => 1,            'maxProcesses' => 8,            'tries' => 3,            'timeout' => 90,        ],    ],],

Chế độ auto là điểm hay: Horizon tự chuyển tiến trình sang hàng đợi đang dồn nhiều việc, thay vì để worker rảnh ngồi nhìn hàng đợi khác quá tải. Đặt maxProcesses theo sức máy chứ đừng theo mong muốn, quá nhiều tiến trình PHP cùng chạy sẽ ăn hết RAM và làm chậm cả trang web.

Chạy Horizon như dịch vụ

TerminalChạy Horizon như dịch vụbash
# /etc/systemd/system/horizon.service[Unit]Description=Laravel HorizonAfter=network.target redis.service [Service]User=www-dataRestart=alwaysRestartSec=3ExecStart=/usr/bin/php /var/www/app/artisan horizonExecStop=/usr/bin/php /var/www/app/artisan horizon:terminate [Install]WantedBy=multi-user.target

Chú ý dòng ExecStop: lệnh horizon:terminate bảo các worker kết thúc job hiện tại rồi mới thoát, thay vì bị cắt ngang. Trong script deploy, hãy gọi đúng lệnh này sau khi đã cập nhật code và tạo lại cache, để worker mới nạp mã nguồn mới.

Khi Horizon đã quản worker, đừng chạy song song các dịch vụ queue:work cũ cho cùng hàng đợi. Hai bên sẽ tranh job và bạn mất luôn khả năng nhìn đúng số liệu trên bảng điều khiển.

Chặn đường dẫn quản trị

Mặc định bảng điều khiển nằm ở /horizon và chỉ mở cho môi trường phát triển. Trên máy chủ thật bạn phải khai báo ai được vào, trong app/Providers/HorizonServiceProvider.php:

TerminalChặn đường dẫn quản trịbash
Gate::define('viewHorizon', function ($user) {    return in_array($user->email, [        '[email protected]',    ]);});

Vì sao phải nghiêm: trang này hiển thị tên job, tham số truyền vào và thông báo lỗi. Tham số job thường chứa mã đơn hàng, địa chỉ email khách, đôi khi cả dữ liệu nhạy cảm hơn. Để mở là rò rỉ dữ liệu người dùng chứ không chỉ là lộ thông tin kỹ thuật.

Lớp bảo vệ thêm nếu muốn chắc: giới hạn theo dải địa chỉ nội bộ ở tầng máy chủ web, hoặc chỉ cho truy cập qua mạng riêng như trong bài Tailscale.

Đọc số liệu cho đúng

Ba chỉ số đáng nhìn hằng ngày:

  • Thời gian chờ của mỗi hàng đợi. Đây là chỉ số sát người dùng nhất. Email xác nhận chờ ba mươi giây thì không ai than, chờ hai mươi phút thì có.
  • Thông lượng theo phút. Giảm đột ngột thường nghĩa là worker chết hoặc dịch vụ bên ngoài đang chậm.
  • Số job hỏng. Tăng dần đều thường là lỗi code mới lên, tăng vọt một lúc thường là dịch vụ bên ngoài sập.

Horizon đặt được ngưỡng cảnh báo cho thời gian chờ, hãy bật cho những hàng đợi ảnh hưởng trực tiếp tới khách hàng. Và nhớ rằng Horizon cho bạn nhìn thấy vấn đề chứ không sửa hộ: khi job dồn vì database chậm, chỗ cần sửa nằm ở truy vấn, theo hướng trong bài đọc EXPLAIN.

Khi nào nên thêm và khi nào chưa cần

Tình huốngCó nên thêm khôngVì sao
Dưới vài trăm việc mỗi ngày, một tiến trình xử lýChưa cầnXem nhật ký là đủ
Hàng nghìn việc mỗi ngày, nhiều loại việcNênCần thấy loại nào đang tắc
Nhiều tiến trình xử lý chạy song songNênKhó theo dõi bằng nhật ký
Cần biết việc nào chạy lâu bất thườngNênĐây là thứ nhật ký không cho thấy dễ dàng
Chưa dùng nơi lưu hàng đợi phù hợpChưa đượcCông cụ này yêu cầu nơi lưu cụ thể

Chặn đường dẫn quản trị, việc bắt buộc

TerminalChặn đường dẫn quản trị, việc bắt buộcbash
# Giao dien theo doi hang doi hien thi noi dung cong viec,# tuc la co the lo du lieu khach hang. Phai chan. # 1. Kiem duong dan co lo ra internet khongcurl -sI https://tenmien.vn/horizon | head -3# nen tra ve 403 hoac 302 chuyen sang dang nhap, khong duoc tra ve 200 # 2. Gioi han theo dia chi mang, hoac dat sau lop dang nhap # 3. Kiem trong ma nguon co cong duyet quyen truy cap chuagrep -rn "viewHorizon\|Gate::define" app/Providers/ 2>/dev/null # 4. Xem tien trinh dang chaysystemctl status horizonjournalctl -u horizon -n 50 --no-pager

Đây là lỗi bảo mật phổ biến nhất với các giao diện theo dõi: cài xong quên chặn, và bất kỳ ai biết đường dẫn đều xem được nội dung công việc đang chạy, gồm cả dữ liệu khách hàng nằm trong đó.

Hàng đợi dài lên nói lên điều gì

  • Số việc đang chờ tăng dần không giảm: tiến trình xử lý không đủ, hoặc có việc bị treo chiếm chỗ.
  • Thời gian chờ trung bình tăng: đây là con số người dùng cảm nhận được, quan trọng hơn tổng số việc.
  • Số việc thất bại khác 0: phải có người xem, không chỉ để đó. Việc lỗi rơi vào hư không là mất đơn hàng.
  • Việc chạy lâu bất thường: thường là do gọi dịch vụ bên ngoài mà không đặt thời gian chờ tối đa.

Về cách chạy tiến trình xử lý như một dịch vụ, xem bài về hàng đợi công việc.

Câu hỏi thường gặp

Horizon có chạy với queue database không?

Không, nó chỉ làm việc với Redis. Nếu đang dùng driver database mà muốn dùng Horizon thì phải chuyển hàng đợi sang Redis trước. Việc chuyển khá nhẹ, chủ yếu là cài Redis và đổi cấu hình kết nối.

Horizon có tốn tài nguyên không?

Bản thân tiến trình giám sát nhẹ, phần tốn là số worker mà nó quản. Nó cũng ghi số liệu vào Redis nên hãy giới hạn thời gian lưu, để lâu quá thì bộ nhớ Redis phình dần mà ít ai để ý.

Có cần Horizon khi chỉ có một loại job không?

Thường là không. Một worker chạy dưới systemd cộng cảnh báo khi có job hỏng đã đủ. Thêm Horizon lúc bạn có nhiều hàng đợi với mức ưu tiên khác nhau hoặc cần nhìn xu hướng theo thời gian.

Nên đặt maxProcesses bao nhiêu?

Bắt đầu bằng số nhân CPU rồi quan sát mức dùng RAM và thời gian chờ. Mỗi tiến trình PHP chiếm bộ nhớ riêng, nên tăng quá tay sẽ làm máy chậm đều thay vì xử lý nhanh hơn.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.