[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-menu":3,"tag-queue":14,"site-settings":59},{"items":4},[5,8,11],{"href":6,"label":7},"\u002F","Mới nhất",{"href":9,"label":10},"\u002Fcategory\u002Fdich-vu","Dịch vụ",{"href":12,"label":13},"\u002Fabout","Về tôi",{"items":15,"total":57,"page":57,"pageSize":58},[16],{"id":17,"wordpressId":18,"title":19,"slug":20,"excerpt":21,"contentHtml":22,"status":23,"authorName":24,"seoTitle":19,"seoDescription":21,"featuredMediaId":25,"featuredMedia":26,"categories":39,"tags":50,"publishedAt":55,"createdAt":55,"updatedAt":56},"0e29fb3a-dd03-4693-8283-0ab68e483c2e",164,"Laravel: Chạy Job bất đồng bộ hay đồng bộ?","laravel-chay-job-bat-dong-bo-hay-dong-bo","Khi làm việc với Laravel Queue, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc: Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn tối ưu hiệu năng và tránh bug ngớ ngẩn khi xử lý job. 1. […]","\n\u003Cp class=\"wp-block-paragraph\">Khi làm việc với \u003Cstrong>Laravel Queue\u003C\u002Fstrong>, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn \u003Cstrong>tối ưu hiệu năng\u003C\u002Fstrong> và \u003Cstrong>tránh bug ngớ ngẩn\u003C\u002Fstrong> khi xử lý job.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">1. \u003Ccode>dispatch()\u003C\u002Fcode>: Gửi Job vào hàng đợi\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Ccode>dispatch()\u003C\u002Fcode> dùng để đưa Job vào hàng đợi (queue). Worker sẽ xử lý nó sau, theo cơ chế bất đồng bộ.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>SendWelcomeEmail::dispatch($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>SendWelcomeEmail\u003C\u002Fcode> \u003Cstrong>không chạy ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nó sẽ được lưu vào queue (Redis, Database, SQS, RabbitMQ…).\u003C\u002Fli>\n\n\n\n\u003Cli>Worker (chạy bằng lệnh \u003Ccode>php artisan queue:work\u003C\u002Fcode>) sẽ pick nó lên và xử lý.\u003C\u002Fli>\n\n\n\n\u003Cli>Request hiện tại \u003Cstrong>không bị chặn\u003C\u002Fstrong>, trả về ngay cho user → nhanh và mượt.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Gửi email, SMS.\u003C\u002Fli>\n\n\n\n\u003Cli>Xử lý file, video, ảnh.\u003C\u002Fli>\n\n\n\n\u003Cli>Đồng bộ dữ liệu với service khác.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Ccode>dispatch_sync()\u003C\u002Fcode>: Chạy ngay lập tức\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ngược lại, \u003Ccode>dispatch_sync()\u003C\u002Fcode> sẽ bỏ qua queue và chạy Job \u003Cstrong>ngay trong tiến trình hiện tại\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>WriteAuditLog::dispatchSync($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>WriteAuditLog\u003C\u002Fcode> \u003Cstrong>thực thi ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần worker, không cần queue.\u003C\u002Fli>\n\n\n\n\u003Cli>Request sẽ \u003Cstrong>chờ job chạy xong\u003C\u002Fstrong> mới tiếp tục.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Ghi log quan trọng.\u003C\u002Fli>\n\n\n\n\u003Cli>Tính toán cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Các tác vụ nhỏ, không tốn nhiều thời gian.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. Khi nào dùng cái nào?\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nặng.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Bạn muốn tăng tốc request trả về cho user.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nhỏ, cần chạy ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn đảm bảo chạy xong trước khi qua bước tiếp theo.\u003C\u002Fli>\n\n\n\n\u003Cli>Không muốn phụ thuộc vào queue worker.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. Lưu ý\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Trước Laravel 8 có \u003Ccode>dispatchNow()\u003C\u002Fcode>, nhưng đã bị thay thế bởi \u003Ccode>dispatchSync()\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu bạn dùng \u003Ccode>dispatch()\u003C\u002Fcode> mà không bật queue worker, job sẽ \u003Cstrong>không bao giờ chạy\u003C\u002Fstrong> → bug silent rất khó chịu.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">5. Kết luận\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode> = chạy bất đồng bộ (qua queue).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode> = chạy đồng bộ, ngay lập tức.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Hãy nhớ:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Nặng → dispatch.\u003C\u002Fstrong>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Nhẹ &amp; cần ngay → dispatch_sync.\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Đơn giản vậy thôi, nhưng áp dụng đúng thì hệ thống Laravel của bạn vừa \u003Cstrong>nhanh hơn\u003C\u002Fstrong>, vừa \u003Cstrong>ổn định hơn\u003C\u002Fstrong>.\u003C\u002Fp>\n","published","vdhoangson@gmail.com","f19724a6-8553-4d5c-930e-58b1fcf1b2ab",{"id":25,"wordpressId":27,"filename":28,"storageKey":29,"sourceUrl":30,"mimeType":31,"altText":32,"caption":33,"width":34,"height":35,"createdAt":36,"updatedAt":37,"url":38},16256,"laravel.png","wordpress\u002F2025\u002F07\u002Flaravel.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002Flaravel.png","image\u002Fpng","",null,1930,1090,"2025-09-26T08:50:47.000Z","2026-10-15T04:59:31.204Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F07\u002Flaravel.png",[40,45],{"id":41,"wordpressId":42,"name":43,"slug":44,"parentId":33},"f6aff5ed-b85e-45e6-bbdb-08788be09d67",2,"Lập Trình","lap-trinh",{"id":46,"wordpressId":47,"name":48,"slug":49,"parentId":41},"5f89b685-533f-4c09-85fa-d018f8fd71a4",3,"Laravel","laravel",[51],{"id":52,"wordpressId":53,"name":54,"slug":54},"68c0949f-f079-493b-9f66-9bbdbf0168af",307,"queue","2025-07-07T02:57:03.000Z","2025-09-26T08:52:03.000Z",1,12,{"siteName":60,"siteDescription":61,"contactEmail":62,"phone":63,"githubUrl":64,"facebookUrl":32},"vdhoangson.com","Ghi chép về lập trình, hệ thống và những điều học được trên đường làm sản phẩm.","contact@vdhoangson.com","+84 387 324 112","https:\u002F\u002Fgithub.com\u002Fvdhoangson"]