- Laravel cung cấp API hàng đợi thống nhất với nhiều trình điều khiển (cơ sở dữ liệu, Redis, SQS…) và phân tách giữa các kết nối và hàng đợi logic.
- Công việc cho phép chuyển các tác vụ nặng sang chế độ nền, với sự hỗ trợ cho việc tuần tự hóa các mô hình, phần mềm trung gian, công việc một lần, mã hóa, lô và chuỗi.
- Người lao động được quản lý bằng lệnh queue:work, Supervisor và các lệnh như queue:pause/queue:continue, kiểm soát việc thử lại, thời gian chờ và mức độ ưu tiên.
- Có một hệ sinh thái hoàn chỉnh cho các lỗi, giám sát và thử nghiệm (failed_jobs, queue:retry, queue:monitor, Queue::fake) giúp cho các hàng đợi trở nên đáng tin cậy trong quá trình sản xuất.
Làm việc với hàng đợi trong Laravel gần như là bắt buộc trong bất kỳ dự án nào nghiêm túc: gửi email, xử lý tệp CSV, tạo PDF, thay đổi kích thước hình ảnh, gọi API bên ngoài… Nếu tất cả những việc đó được thực hiện trong yêu cầu HTTP chính, trang web sẽ trở nên chậm, xuất hiện lỗi 500 và người dùng cuối cùng chỉ biết nhìn chằm chằm vào màn hình trống.
Tin tốt là Laravel cung cấp một cơ sở hạ tầng xếp hàng mạnh mẽ và linh hoạt , cho phép bạn giao phó các tác vụ nặng cho các tiến trình nền, quản lý chúng theo mức độ ưu tiên, nhóm chúng thành từng lô, giám sát chúng, thử lại khi chúng thất bại và thậm chí tạm dừng các tiến trình để bảo trì. Hãy cùng xem xét kỹ lưỡng (và không bỏ sót điều gì) cách tận dụng tối đa nó, bao gồm cả cách tạm dừng, tiếp tục và kiểm soát hoạt động của nó trong môi trường sản xuất.
Các khái niệm cơ bản: kết nối, hàng đợi và trình điều khiển
Trong Laravel, trước khi tạm dừng bất cứ điều gì, bạn cần hiểu sự khác biệt giữa kết nối hàng đợi và bản thân hàng đợi. Trong config/queue.php bạn có một mảng connections nơi bạn xác định từng phần phụ trợ: cơ sở dữ liệu, redis, beanstalkd, sqs, đồng bộ hóa, null, chuyển đổi dự phòng, rabbitmq (nếu bạn thêm nó), v.v.
Mỗi kết nối có thể có một số hàng đợi logic (tên như default, emails, high, low, importsThuộc tính queue Mỗi kết nối sẽ chỉ ra hàng đợi mặc định mà các tác vụ sẽ được chuyển đến nếu không có kết nối nào khác được chỉ định. onQueue()Bằng cách này, bạn có thể thực hiện những việc như:
- Một hàng đợi nhanh cho email hoặc giao dịch ngắn.
- Một ưu tiên thấp khác cho các tác vụ dài như xử lý video hoặc báo cáo lớn.
- Hàng đợi được phân đoạn theo loại tác vụ:
imports,notificaciones,reportes, Vv
Khi bạn khởi chạy công nhân với php artisan queue:workTheo mặc định, nó lắng nghe hàng đợi được chỉ định là mặc định trên kết nối đã chọn. Nếu bạn muốn ưu tiên, bạn có thể truyền nhiều hàng đợi được phân tách bằng dấu phẩy:
php artisan queue:work redis --queue=high,default,low
Bằng cách này, trình xử lý sẽ ưu tiên xử lý các yêu cầu cao trước , sau đó là các yêu cầu mặc định , và cuối cùng mới đến các yêu cầu thấp , điều này rất quan trọng khi hệ thống bị quá tải và bạn không muốn báo cáo 30 phút làm tắc nghẽn các email ưu tiên cao.
Trình điều khiển hàng đợi và điều kiện tiên quyết
Laravel cung cấp API thống nhất cho nhiều trình điều khiển hàng đợi , nhưng mỗi trình điều khiển lại có các tính năng và phụ thuộc riêng. Việc lựa chọn trình điều khiển phù hợp là rất quan trọng trước khi thảo luận về việc tạm dừng các tiến trình xử lý.
Cơ sở dữ liệu trình điều khiển
Người lái xe cơ sở dữ liệu Nó lưu trữ các công việc trong một bảng SQL (thường là jobsDễ thiết lập và hoàn hảo cho các dự án nhỏ hoặc môi trường phát triển mà bạn không muốn loay hoay với Redis hoặc SQS.
Các bước cơ bản:
- Tạo bản di chuyển:
php artisan queue:table(hoặc trong các phiên bản mới hơn, nó xuất hiện dưới dạngcreate_jobs_tablemặc định). - Chạy di chuyển:
php artisan migrate. - Cấu hình QUEUE_CONNECTION=cơ sở dữ liệu trong
.envvà xác nhận trongconfig/queue.phpmà'default' => env('QUEUE_CONNECTION','database').
Nó tiện lợi và đủ mạnh mẽ, nhưng với nhiều hàng đợi và lưu lượng truy cập lớn, nó có thể trở thành điểm nghẽn , vì mọi thứ đều đi qua cùng một cơ sở dữ liệu quan hệ.
Trình điều khiển Redis
Trình điều khiển Redis là công cụ chủ lực tiêu chuẩn trong môi trường sản xuất. Nó nhanh, hỗ trợ các tính năng nâng cao (khóa, giới hạn tốc độ, khóa nguyên tử, Horizon, v.v.) và có khả năng mở rộng rất tốt.
Điểm quan trọng:
- Bạn cần cấu hình kết nối Redis trong
config/database.php. - Các tùy chọn
serializerycompressiontừ Redis Chúng không tương thích với người lái xe xếp hàng. - Nếu bạn sử dụng Cụm RedisTên của hàng đợi phải có thẻ bắt đầu bằng dấu thăng, ví dụ
{default}để tất cả các khóa trong hàng đợi đó đều rơi vào cùng một vị trí. - các tùy chọn
block_forNó cho phép người làm việc chặn trong khi chờ đợi công việc trong vài giây, thay vì liên tục thăm dò: tiết kiệm CPU và giảm số lượng truy vấn tới máy chủ Redis.
Ví dụ:
'redis' => ,
Nếu bạn đặt khối_cho = 0Công nhân vẫn bị chặn vô thời hạn cho đến khi có công việc, điều cần lưu ý nếu bạn muốn công nhân phản hồi nhanh chóng với các tín hiệu như SIGTERM hoặc tạm dừng lệnh.
Các trình điều khiển khác: SQS, Beanstalkd, null, failover…
Ngoài cơ sở dữ liệu và Redis, Laravel còn hỗ trợ các hệ thống khác :
- SQS của AmazonHàng đợi được quản lý của AWS, với sự hỗ trợ cho FIFONhóm tin nhắn, loại bỏ trùng lặp và cài đặt hiển thị nâng cao. Yêu cầu SDK.
aws/aws-sdk-php. - Cây đậuRất nhanh chóng và dễ dàng, sử dụng gói
pda/pheanstalk. - đồng bộ: thực hiện các nhiệm vụ ngay lập tức trong cùng một quy trình. Hữu ích trong quá trình phát triển hoặc thử nghiệm, nhưng trong sản xuất, nó gần như không sử dụng hàng đợi.
- vô giá trị: Hủy bỏ các tác vụ ngay khi chúng được "phân phát". Được sử dụng để vô hiệu hóa hoàn toàn hệ thống xếp hàng.
- chuyển đổi dự phòngĐiều này cho phép bạn cấu hình nhiều kết nối và nếu kết nối chính bị lỗi, Laravel sẽ cố gắng đẩy công việc sang kết nối tiếp theo trong danh sách. Hoàn hảo cho các môi trường mà tính sẵn sàng cao là rất quan trọng.
Ở cấp độ tạm dừng và tiếp tục hoạt động của công nhân, logic thực tế là giống nhau bất kể người điều khiển nào, bởi vì nó được quản lý từ các lệnh Artisan và lớp Worker , chứ không phải từ hệ thống xử lý hàng đợi.
Tạo việc làm và tuần tự hóa mô hình
Un Việc làm Trong Laravel, nó chỉ đơn giản là một lớp đóng gói một tác vụ để thực thi trong một hàng đợi. Nó thường được tạo bằng Artisan và được lưu trong app/Jobs.
Để tạo một:
php artisan make:job ProcessPodcast
Lớp được tạo ra dụng cụ ShouldQueue và thường sử dụng các đặc điểm Dispatchable, InteractsWithQueue, Queueable y SerializesModelsTrái tim nằm ở phương pháp handle()đó là những gì người công nhân làm khi công việc đến.
Một tính năng đặc biệt mạnh mẽ là khả năng tự động tuần tự hóa các mô hình Eloquent . Nếu bạn chấp nhận một mô hình trong hàm tạo Job, Laravel sẽ không thêm toàn bộ đối tượng vào hàng đợi, mà chỉ thêm mã định danh của nó. Khi công việc được xử lý, nó sẽ tái tạo lại mô hình từ cơ sở dữ liệu với các mối quan hệ đã được tải.
Ví dụ điển hình (bằng mã giả, để tránh lặp lại nguyên văn):
- Người xây dựng nhận được Podcast $podcast.
- Đặc điểm
SerializesModelsCó nhiệm vụ lưu ID. - En
handle(AudioProcessor $processor)Bạn phải làm những công việc khó khăn (ví dụ như xử lý âm thanh).
Nếu bạn không muốn các mối quan hệ trong mô hình được tuần tự hóa (do đó tải trọng không lớn), bạn có thể sử dụng $model->withoutRelations() hoặc trong PHP 8 thuộc tính # trên bất động sản được chủ thầu quảng bá.
Tiêm phụ thuộc vào phương thức xử lý
Một lợi thế khác là bạn có thể tiêm dịch vụ trực tiếp vào phương thức xử lý (như thể nó là một bộ điều khiển), vì Laravel cũng sử dụng container dịch vụ trong Jobs. Ví dụ, bạn có thể yêu cầu AudioProcessorMáy khách HTTP, kho lưu trữ, v.v. và khuôn khổ sẽ đảm nhiệm việc giải quyết chúng.
Nếu bạn cần kiểm soát cực kỳ tốt cái được gọi là handlebạn có thể sử dụng Container::bindMethod() trong một nhà cung cấp dịch vụ và tự mình xác định logic tiêm, nhưng trong hầu hết các trường hợp, không cần phải làm mọi thứ phức tạp đến vậy.
Phần mềm trung gian công việc
Cũng giống như các tuyến đường có phần mềm trung gian, các công việc cũng có thể có phần mềm trung gian cụ thể chạy trước và sau công việc. Điều này làm giảm đáng kể mã lặp lại trong các phương thức handle() và nó đặc biệt hữu ích cho:
- Giới hạn tỷ lệ với Redis.
- tránh chồng chéo của các tác phẩm đề cập đến cùng một nguồn tài nguyên.
- Ngoại lệ thông thường dành cho các API không ổn định.
- Bỏ qua công việc trong một số điều kiện nhất định (
Skipphần mềm trung gian).
Phần mềm trung gian thường được đặt trong app/Jobs/Middleware và được trả về từ phương thức middleware() Từ Job. Ví dụ khái niệm:
public function middleware(): array { return ;
Các loại công việc đặc biệt: duy nhất, được mã hóa và bị khóa
Laravel cho phép bạn đánh dấu một số công việc nhất định là độc nhất để đảm bảo rằng không có hai phiên bản giống hệt nhau nào được xếp hàng cùng một lúc. Điều này đạt được bằng cách triển khai giao diện ShouldBeUnique o ShouldBeUniqueUntilProcessingvà hỗ trợ việc xác định một khóa uniqueId() và một thời gian uniqueFor.
Điều này lý tưởng cho những việc như:
- Tính toán lại chỉ mục tìm kiếm của sản phẩm: chỉ một lần cho mỗi sản phẩm cho đến khi nó kết thúc.
- Đồng bộ hóa với các dịch vụ bên ngoài không cho phép yêu cầu đồng thời cho cùng một tài nguyên.
Bên dưới, Laravel sử dụng một khóa nguyên tử của bộ nhớ đệm (Redis, memcached, cơ sở dữ liệu, v.v.). Bạn cũng có thể chọn trình điều khiển bộ nhớ đệm cho khóa đó bằng uniqueVia().
Ngoài ra còn có giao diện ShouldBeEncrypted, trong đó bạn chỉ ra rằng Công việc hoàn chỉnh là Nhập mã của bạn trước khi vào hàng đợiRất hữu ích khi truyền dữ liệu nhạy cảm và bạn không muốn dữ liệu đó được truyền dưới dạng văn bản thuần túy qua Redis, SQS hoặc cơ sở dữ liệu.
Phân công, trì hoãn và thực hiện công việc ở các chế độ khác nhau
Khi công việc của bạn đã được xác định, bạn khởi chạy nó với Job::dispatch() từ bộ điều khiển, trình lắng nghe sự kiện, lệnh Artisan hoặc thậm chí là lệnh đóng. Các tham số bạn truyền cho dispatch Họ đi thẳng đến người xây dựng Gióp.
Những biến thể thú vị:
dispatchIf()ydispatchUnless()để điều kiện lô hàng trong một dòng duy nhất.delay()để công việc không thể được xử lý cho đến ngày/giờ cụ thể.dispatchAfterResponse()oafterResponse()endispatch()Closures trì hoãn việc thực thi cho đến khi phản hồi HTTP được gửi đi, nhưng vẫn nằm trong cùng một tiến trình PHP.dispatchSync()để chạy Job một cách đồng bộ (không cần thông qua hàng đợi) nhưng sử dụng lại cùng một lớp.- Các kết nối đặc biệt như
deferredobackgroundđể thực thi sau khi phản hồi, trong cùng một tiến trình hoặc trong một tiến trình PHP mới.
Cuối cùng, bạn có thể chỉ định kết nối và hàng đợi bằng các phương thức được nối tiếp onConnection() y onQueue(), khi gửi hoặc trong trình tạo công việc.
Kiểm soát tốt: thử lại, lùi lại, hết thời gian và xử lý lỗi
Một phần quan trọng khi làm việc với hàng đợi trong Laravel là quyết định số lần thử lại một tác vụ , thời gian chờ giữa các lần thử và khi nào thì coi đó là thất bại.
Opciones không hài lòng:
--triesenqueue:workđể thiết lập số lần thử tối đa cho tất cả các công việc của người lao động đó (trừ khi Công việc tự xác định)$triesotries()).$trieshoặc một phương pháptries()trong lớp Job để kiểm soát từng Job.retryUntil()để nói: "thử lại như bạn muốn cho đến lần này, sau đó, thất bại." Nếu nó trùng vớitries, yêu cầuretryUntil.$maxExceptionsđể cắt bỏ khi vấn đề là do các ngoại lệ không được xử lý lặp đi lặp lại.$timeouto--timeoutđể chỉ ra số giây mà một Job có thể chạy trước khi tác nhân kết thúc tiến trình con.$failOnTimeoutđể đánh dấu công việc là thất bại trong trường hợp hết thời gian.$backoffphương phápbackoff()để xác định thời gian chờ giữa các lần thử lại, ngay cả với các giá trị theo cấp số nhân.
Nếu một công việc đưa ra một ngoại lệ chưa được xử lý, Laravel sẽ... thả trở lại đuôi cho đến khi các lần thử đã cấu hình được thực hiện hết. Bạn có thể kiểm soát điều này theo cách thủ công bằng release($segundos) o fail($exception) khi bạn muốn cố tình đánh dấu một công việc là thất bại.
Công việc thất bại, bảng failed_jobs và cắt tỉa
Khi một công việc đã cạn kiệt những nỗ lực của mình, anh ta được coi là công việc thất bại và Laravel chèn nó vào bảng failed_jobs (hoặc trong DynamoDB nếu bạn cấu hình theo cách đó). Bảng đó lưu trữ UUID, kết nối, hàng đợi, tải trọng công việc và ngoại lệ đã được đưa ra.
Các lệnh hữu ích:
php artisan queue:failedđể liệt kê những cái không đạt.php artisan queue:retry <id|all>để thử lại lần nữa.php artisan queue:forget <id>để xóa một.php artisan queue:flushđể xóa tất cả (có tùy chọn xóa giờ trong các phiên bản mới hơn).php artisan queue:prune-failed --hours=48để tự động cắt bớt các bản ghi cũ.
Trong Jobs bạn có thể định nghĩa một phương pháp failed(Throwable $exception) Để dọn dẹp thêm: thông báo cho người dùng, hoàn nguyên các hành động một phần, viết nhật ký chuyên biệt, v.v. Lưu ý rằng một phiên bản mới của Job được tạo để gọi failed()Vì vậy, đừng dựa vào những thay đổi về tài sản được thực hiện trong handle().
Xử lý hàng loạt công việc: xử lý hàng loạt công việc và kết hợp chúng với chuỗi
Khi bạn cần thực hiện hàng trăm hoặc hàng nghìn tác vụ liên quan (ví dụ: nhập một tệp CSV khổng lồ theo từng phần, xử lý tập tin theo lô, làm sạch dữ liệu, v.v.), nên sử dụng chức năng xử lý theo lô của Laravel .
Luồng cơ bản:
- tạo bảng
job_batchesvớiphp artisan queue:batches-table && php artisan migrate. - Đánh dấu các công việc sẽ là một phần của lô với đặc điểm
Batchable. - Sử dụng
Bus::batch()để gửi một tập hợp các Công việc, với các lệnh gọi lạithen,catchyfinally. - Truy cập lô từ mỗi công việc với
$this->batch()và kiểm tra xem nó có bị hủy không. - Khả năng thêm nhiều việc làm hơn vào một đợt đang diễn ra với
$this->batch()->add().
Các lô (batch) tích hợp rất tốt với các chuỗi (chain) : bạn có thể có các chuỗi nhỏ bên trong một lô hoặc các lô là các phần tử của một chuỗi lớn hơn. Điều này đặc biệt hữu ích khi bạn muốn nhiều chuỗi chạy "song song" và kích hoạt một điều gì đó khi tất cả chúng hoàn thành.
Thực hiện, ưu tiên và triển khai của công nhân
Tất cả sự kỳ diệu của hàng đợi xảy ra vì bạn có một hoặc nhiều công nhân chạy lệnh queue:work (o queue:listen(mặc dù cách sau kém hiệu quả hơn). Các tiến trình này là các daemon chạy lâu dài, lắng nghe hàng đợi tương ứng của chúng.
Các tùy chọn chính của queue:work:
- Conexión:
php artisan queue:work redis,queue:work database, Vv - Than cốc:
--queue=high,default,lowđể ưu tiên. - -một lần: xử lý một tác vụ duy nhất và thoát.
- –max-jobs: xử lý X công việc và kết thúc (để khởi động lại công việc định kỳ và giải phóng bộ nhớ).
- –thời gian tối đa: xử lý trong N giây rồi thoát.
- -ngủ: giây chờ đợi khi không có công việc nào khả dụng.
- –dừng-khi-trống: làm trống hàng đợi và đóng lại hoàn toàn (lý tưởng trong môi trường Docker hoặc các tác vụ một lần).
- –hết thời gian: số giây chờ cho mỗi tác vụ, như chúng tôi đã đề cập trước đó.
- -lực lượng: để xử lý công việc ngay cả khi ứng dụng đang ở chế độ bảo trì.
Vì các tiến trình này chạy trong thời gian dài, trong môi trường sản xuất, một trình giám sát tiến trình như Supervisor (trên Linux) hầu như luôn được sử dụng để khởi động X tiến trình con, khởi động lại chúng nếu chúng gặp sự cố và quản lý nhật ký. Một khối cấu hình Supervisor điển hình cho Laravel định nghĩa như sau:
- lệnh với
php artisan queue:work ...bê tông. - số lượng để chỉ ra số lượng công nhân sẽ được triển khai song song.
- Đường dẫn nhật ký, người dùng, khởi động lại tự động, v.v.
Tạm dừng và tiếp tục hàng đợi trong Laravel
Hãy cùng đến với vấn đề thường rất quan trọng trong bảo trì: làm thế nào để tạm dừng các tiến trình trong hàng đợi mà không làm chúng dừng đột ngột và không để lại các công việc chưa hoàn thành. Laravel cung cấp một số cơ chế, một số mới hơn, một số cổ điển, để kiểm soát điều này.
Tạm dừng: hàng đợi: tín hiệu tạm dừng và ngắt
Trong các phiên bản gần đây, Laravel bổ sung các lệnh cụ thể để tạm dừng và tiếp tục thực thi các worker:
php artisan queue:pause: yêu cầu hệ thống ngừng nhận công việc mới nhưng vẫn để những công việc đang thực hiện hoàn thành.php artisan queue:continue: tiếp tục xử lý công việc mới từ nơi nó dừng lại.
Các lệnh này hoạt động bằng cách gửi tín hiệu đến các worker thông qua cơ chế bộ nhớ đệm mà Laravel sử dụng nội bộ. Đó là lý do tại sao việc cấu hình đúng trình điều khiển bộ nhớ đệm (memcached, redis, cơ sở dữ liệu, tệp, v.v.) rất quan trọng, ngay cả khi hàng đợi bộ nhớ đệm thực tế của bạn là một thứ khác.
Quan trọng: Việc tạm dừng hàng đợi hoặc tiến trình xử lý không hủy bỏ hoặc xóa các công việc đã được xếp vào hàng đợi ; nó chỉ đơn giản là ngăn không cho thêm công việc nào bị xóa khỏi hàng đợi trong khi thời gian tạm dừng vẫn còn.
Khảo sát sự gián đoạn và tác động đến hiệu suất
Mỗi khi một worker hoàn thành công việc, Laravel sẽ kiểm tra bộ nhớ cache để tìm các tín hiệu khởi động lại, tạm dừng hoặc tiếp tục . Việc này có chi phí không đáng kể, nhưng nó vẫn tồn tại. Nếu bạn cực kỳ chú trọng đến hiệu suất và biết rằng bạn sẽ không cần tạm dừng hoặc khởi động lại các worker từ các lệnh, bạn có thể tắt việc kiểm tra này bằng cách gọi:
Queue::withoutInterruptionPolling();
Hoặc thậm chí điều chỉnh các thuộc tính tĩnh của Illuminate\Queue\Worker để vô hiệu hóa các lần chạm cụ thể ($có thể khởi động lại, $có thể tạm dừngTuy nhiên, nếu bạn làm điều này và sau đó cố gắng sử dụng queue:pause o queue:restartnhững người lao động Họ sẽ không tìm raĐây là quyết định thiết kế cần được cân nhắc cẩn thận.
Tạm dừng thủ công bằng Supervisor hoặc Docker
Ngoài các lệnh có sẵn của Laravel , trong môi trường sản xuất, các tiến trình thường được "tạm dừng" một cách gián tiếp:
- Dừng chương trình trong Supervisor (
supervisorctl stop laravel-worker:*), giết chết hoặc ngăn chặn công nhân. - sử dụng –dừng-khi-trống trong quá trình triển khai để cho phép công nhân hoàn thành những gì có trong hàng đợi và sau đó tắt máy.
- Trong Docker, để cho container xử lý với
--stop-when-emptyvà sau đó nó tắt đi.
Sự khác biệt với queue:pause Bằng cách dừng hoàn toàn các tiến trình, bạn sẽ dừng xử lý công việc cho đến khi công nhân khởi động lại. tạm dừng nội bộ Bạn có thể giữ các tiến trình trong bộ nhớ, chờ lệnh continueĐiều này hữu ích cho việc triển khai khôi phục nhanh hoặc thời gian bảo trì ngắn.
Giao dịch cơ sở dữ liệu và after_commit
Một lỗi thường gặp: phân phối các tác vụ trong các giao dịch cơ sở dữ liệu . Nếu không cẩn thận, trình xử lý có thể thực thi tác vụ trước khi lệnh commit được thực hiện, và mô hình hoặc dữ liệu bạn mong đợi có thể chưa có trong cơ sở dữ liệu.
Để tránh tình trạng này, bạn có hai lựa chọn:
- Kích hoạt
'after_commit' => truetrong cấu hình kết nối hàng đợi. Do đó, bất kỳ Công việc nào được phân phối trong một giao dịch đều bị hoãn lại nội bộ cho đến khi được xác nhận. - Sử dụng phương pháp theo từng công việc
afterCommit()obeforeCommit()khi điều phối, để buộc hành vi chỉ áp dụng cho các Công việc cụ thể.
Nếu giao dịch bị đảo ngược, các công việc được gửi đi trong quá trình đó sẽ bị loại bỏ mà không bao giờ được đưa vào hàng đợi, điều này chính xác là điều thường mong muốn để duy trì tính nhất quán.
Giám sát, dọn dẹp hàng đợi và thử nghiệm
Khi hệ thống hàng đợi đã hoạt động ổn định, việc chỉ đơn thuần tạo ra các tác vụ rồi bỏ mặc chúng là chưa đủ; bạn cần theo dõi và kiểm tra xem mọi thứ hoạt động như thế nào.
Các công cụ và lệnh hữu ích:
queue:clearđể xóa một hàng đợi cụ thể (SQS, Redis, cơ sở dữ liệu).queue:monitorđể theo dõi số lượng công việc trong các hàng đợi nhất định và kích hoạt sự kiệnQueueBusynếu chúng vượt quá ngưỡng.- Sự kiện việc làm như
Queue::before,Queue::after,Queue::loopingyQueue::failingđể kết nối logic tùy chỉnh (nhật ký, số liệu, khôi phục, v.v.). - Hàng giả trong quá trình thử nghiệm sử dụng
Queue::fake()yBus::fake()để xác minh rằng các công việc, chuỗi hoặc lô đã được gửi đi mà không thực sự thực thi chúng.
Trong các bài kiểm tra, bạn có thể ghi rõ những điều như “Công việc này đã được xếp vào hàng đợi X lần” , “một chuỗi các Công việc này đã được gửi đi theo thứ tự này” hoặc “không có Công việc cụ thể nào được xếp vào hàng đợi”, điều này mang lại tính bảo mật cao trong các luồng xử lý phức tạp.
Với toàn bộ hệ sinh thái này—các trình điều khiển như Redis hoặc SQS, các công việc được thiết kế tốt, phần mềm trung gian để tinh chỉnh, các lô, chuỗi, cấu hình thử lại, các công nhân do Giám sát viên quản lý và các lệnh như queue:pause y queue:continue— Laravel cho phép bạn làm chủ quá trình xử lý nền đến từng milimet, từ việc gửi email thông thường đến kiến trúc hàng đợi phân tán với khả năng chuyển đổi dự phòng, đảm bảo ứng dụng của bạn tiếp tục phản hồi nhanh chóng ở lớp HTTP trong khi công việc nặng đang được thực hiện bên dưới mà không làm cản trở người dùng.