Laravel 13.31 ಮಧ್ಯದಲ್ಲಿ ನಿಲ್ಲಿಸಬಹುದಾದ (interruptible) jobs ಅನ್ನು ಸೇರಿಸಿದೆ, ಇದು ಕ್ಯೂ ವರ್ಕರ್ಸ್‌ಗಳು (queue workers) ಡೀಪ್ಲಾಯ್‌ಮೆಂಟ್‌ಗಳ ಸಮಯದಲ್ಲಿ ಕಳುಹಿಸಲಾದ SIGTERM ಸಿಗ್ನಲ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲು ಮತ್ತು ಕೆಲಸವನ್ನು ಅರ್ಧಕ್ಕೆ ನಿಲ್ಲಿಸುವ ಬದಲು ಸುಗಮವಾಗಿ ಶಟ್ ಡೌನ್ (shut down) ಮಾಡಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಹತ್ತಾರು ಸಾವಿರ ಸಾಲುಗಳನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು, ಬಲ್ಕ್ ಇಮೇಲ್‌ಗಳನ್ನು ಕಳುಹಿಸುವುದು ಅಥವಾ ವರದಿಗಳನ್ನು ತಯಾರಿಸುವಂತಹ ದೀರ್ಘಾವಧಿಯ ಕೆಲಸಗಳನ್ನು ಮಾಡುವ ತಂಡಗಳಿಗೆ ಇದು ಪ್ರಯೋಜನಕಾರಿಯಾಗಿದೆ, ಏಕೆಂದರೆ ಹೊಸ ರಿಲೀಸ್ ಹೊರಬಂದಾಗ ಡೇಟಾ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ (consistent).

ಡೀಪ್ಲಾಯ್‌ಮೆಂಟ್‌ಗಳು ಕೆಲಸಗಳನ್ನು (jobs) ಏಕೆ ಹಾಳುಮಾಡುತ್ತಿದ್ದವು

ಹೊಸ ವರ್ಷಾಂಕ (version) ಬಂದಾಗ, Supervisor, Docker ಮತ್ತು Kubernetes ನಂತಹ ಪ್ರೊಸೆಸ್ ಮ್ಯಾನೇಜರ್‌ಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ವರ್ಕರ್ಸ್‌ಗಳಿಗೆ ನಿಲ್ಲಿಸುವಂತೆ ಸೂಚಿಸಲು SIGTERM ಅನ್ನು ಕಳುಹಿಸುತ್ತವೆ, ಇದು ಮುಕ್ತಾಯಗೊಳಿಸಲು ನೀಡುವ ಒಂದು ವಿನಂತಿ. ಹೆಚ್ಚಿನ ವರ್ಕರ್ಸ್‌ಗಳು ಹೊರಬರುವ ಮೊದಲು ಪ್ರಸ್ತುತ ಕೆಲಸವು ಮುಗಿಯುವವರೆಗೆ ಕಾಯುತ್ತವೆ. ಮ್ಯಾನೇಜರ್ ಅನುಸರಿಸಲು ಕೇವಲ ಕೆಲವು ಸೆಕೆಂಡುಗಳನ್ನು ಮಾತ್ರ ನೀಡಿದಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗುತ್ತದೆ. ಒಂದು ಕೆಲಸಕ್ಕೆ ನಿಮಿಷಗಟ್ಟಲೆ ಸಮಯ ಬೇಕಾದಲ್ಲಿ, ಮ್ಯಾನೇಜರ್ ತಕ್ಷಣವೇ ಪ್ರೊಸೆಸ್ ಅನ್ನು ಕೊಲ್ಲಲು SIGKILL ಗೆ ಏರಿಕೆ ಮಾಡುತ್ತದೆ. ಇದರಿಂದ ಕೆಲಸವು ಎಂದಿಗೂ ಸ್ಥಿರ ಸ್ಥಿತಿಗೆ ತಲುಪುವುದಿಲ್ಲ, ಇದು ಭಾಗಶಃ ಅಪ್‌ಡೇಟ್ ಆದ ರೆಕಾರ್ಡ್‌ಗಳು, ಅನಾಥ ಫೈಲ್‌ಗಳು (orphaned files) ಅಥವಾ ಡೂಪ್ಲಿಕೇಟ್ ಕೆಲಸಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತದೆ.

Laravel ನ ಉತ್ತರ: ಸಹಕಾರದ ಮಧ್ಯಂತರ ನಿಲುಗಡೆ (cooperative interruption)

Laravel 13.31, Interruptible ಎಂಬ ಹೆಸರಿನ ಕಾಂಟ್ರಾಕ್ಟ್ ಅನ್ನು ಪರಿಚಯಿಸುತ್ತದೆ, ಇದನ್ನು ಒಂದು job ಕ್ಲಾಸ್ ಅನುಷ್ಠಾನಗೊಳಿಸುವ ಮೂಲಕ (implement) ಮುಕ್ತಾಯದ ವಿನಂತಿಯನ್ನು ಪತ್ತೆಹಚ್ಚಬಹುದು. SIGTERM ಬಂದಾಗ, Laravel ಆ ಕೆಲಸದ interrupted() ಮೆಥಡ್ ಅನ್ನು ಕರೆಯುತ್ತದೆ. ಫ್ರೇಮ್‌ವರ್ಕ್ ಕೆಲಸವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಲ್ಲಿಸುವುದಿಲ್ಲ; ಬದಲಾಗಿ, Laravel ಸೆಟ್ ಮಾಡುವ ಫ್ಲಾಗ್ (flag) ಅನ್ನು ಕೆಲಸವು ಪರಿಶೀಲಿಸಬೇಕು ಮತ್ತು ತನ್ನಷ್ಟಕ್ಕೆ ತಾನೇ ಹೊರಬರಬೇಕು. ಈ ಸಹಕಾರದ ಮಾದರಿಯು (cooperative model) ಡೆವಲಪರ್‌ಗಳು ಪ್ರಸ್ತುತ ಲೂಪ್ ಇಟರೇಶನ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು, ಭಾಗಶಃ ಬದಲಾವಣೆಗಳನ್ನು ಹಿಂಪಡೆಯಲು (roll back), ಅಥವಾ ಹೊರಬರುವ ಮೊದಲು ಚೆಕ್‌ಪಾಯಿಂಟ್ ಅನ್ನು ಬರೆಯಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.

ಕೆಲಸವನ್ನು ಮಧ್ಯದಲ್ಲಿ ನಿಲ್ಲಿಸಬಹುದಾದಂತೆ (interruptible) ಮಾಡುವುದು ಹೇಗೆ

  1. ಕಾಂಟ್ರಾಕ್ಟ್ ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿ (Implement the contract) – job ಕ್ಲಾಸ್ ವ್ಯಾಖ್ಯಾನಕ್ಕೆ implements Interruptible ಅನ್ನು ಸೇರಿಸಿ.
  2. ವರ್ಕ್ ಲೂಪ್‌ನ ಒಳಗೆ ಫ್ಲಾಗ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ – ಕೆಲಸವನ್ನು ನಿಲ್ಲಿಸಬೇಕೇ ಎಂದು ನೋಡಲು ಪ್ರತಿ ಇಟರೇಶನ್‌ನಲ್ಲಿ ಒಂದು ಪರಿಶೀಲನೆಯನ್ನು ಸೇರಿಸಿ.
  3. ಕ್ಲೀನಪ್ ಕಾರ್ಯಗಳನ್ನು ಮಾಡಿ – interrupted() ನಲ್ಲಿ, ಕೆಲಸವನ್ನು ನಂತರ ಪುನರಾರಂಭಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುವ ಯಾವುದೇ ಸ್ಥಿತಿಯನ್ನು (state) ಉಳಿಸಿ ಅಥವಾ ನಂತರದ ವಿಶ್ಲೇಷಣೆಗಾಗಿ ಮಧ್ಯಂತರವನ್ನು ಲಾಗ್ ಮಾಡಿ.

ದೊಡ್ಡ ಬಲೆ: --once ಅನ್ನು ಬಳಸಬೇಡಿ

php artisan queue:work --once ಬಳಸಿ ಕ್ಯೂ ವರ್ಕರ್ ಅನ್ನು ರನ್ ಮಾಡುವುದು ಸಿಗ್ನಲ್ ಹ್ಯಾಂಡ್ಲಿಂಗ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ವರ್ಕರ್ ಒಂದು ಕೆಲಸವನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡಿ ಹೊರಬರುತ್ತದೆ, ಆದರೆ ಅದು ಎಂದಿಗೂ SIGTERM ಹ್ಯಾಂಡ್ಲರ್ ಅನ್ನು ನೋಂದಾಯಿಸುವುದಿಲ್ಲ. ಪರಿಣಾಮವಾಗಿ, ಯಾವುದೇ interruptible job ಮುಕ್ತಾಯದ ವಿನಂತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರೊಸೆಸ್‌ನ ಮಧ್ಯದಲ್ಲಿಯೇ ಕೊಲ್ಲಲ್ಪಡುತ್ತದೆ. ಈ ಮಾದರಿಯು ಕ್ರೋನ್-ಚಾಲಿತ (cron-driven) ಕಂಟೇನರ್‌ಗಳು ಮತ್ತು ಒನ್-ಶಾಟ್ ಡೀಪ್ಲಾಯ್‌ಮೆಂಟ್‌ಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತದೆ. ನೀವು interruptible jobs ಬೇಕಾದಾಗ ಯಾವಾಗಲೂ ಡಾಮನ್ ಮೋಡ್ (php artisan queue:work) ಅನ್ನು ರನ್ ಮಾಡುವ ಮೂಲಕ ಇದನ್ನು ಸರಿಪಡಿಸಿ.

ಮಧ್ಯಂತರಗಳನ್ನು ಗಮನಿಸುವುದು (Watching for interruptions)

Laravel ನೀವು ಬಳಸಬಹುದಾದ ಎರಡು ಇವೆಂಟ್‌ಗಳನ್ನು (events) ನೀಡುತ್ತದೆ:

  • WorkerInterrupted – ಯಾವುದೇ ವರ್ಕರ್ SIGTERM ಅನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ ಇದು ಹೊರಬರುತ್ತದೆ. ಈ ಇವೆಂಟ್ ಅನ್ನು ಲಾಗ್ ಮಾಡುವುದರಿಂದ, ಡೀಪ್ಲಾಯ್‌ಮೆಂಟ್‌ಗಳು ಎಷ್ಟು ಬಾರಿ ವರ್ಕರ್ಸ್‌ಗಳನ್ನು ಮಧ್ಯದಲ್ಲಿ ನಿಲ್ಲಿಸುತ್ತವೆ ಎಂಬುದರ ಬಗ್ಗೆ ಮೇಲ್ಮಟ್ಟದ ನೋಟ ಸಿಗುತ್ತದೆ.
  • JobInterrupted – ಪ್ರಸ್ತುತ ಕೆಲಸವು Interruptible ಕಾಂಟ್ರಾಕ್ಟ್ ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿದ್ದರೆ ಮಾತ್ರ ಇದು ಹೊರಬರುತ್ತದೆ. ತಾತ್ಕಾಲಿಕ ಫೈಲ್‌ಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡುವುದು ಅಥವಾ “last processed row” ಮಾರ್ಕರ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವುದು ಅಂತಹ ಕೆಲಸ ನಿರ್ದಿಷ್ಟ ಕ್ಲೀನಪ್‌ಗಳನ್ನು ಪ್ರಚೋದಿಸಲು ಈ ಇವೆಂಟ್ ಬಳಸಿ.

ಈ ಇವೆಂಟ್‌ಗಳನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳುವುದರಿಂದ (listening), ಡೀಪ್ಲಾಯ್‌ಮೆಂಟ್ ಪರಿಣಾಮವನ್ನು ತೋರಿಸುವ ಮತ್ತು ಪದೇ ಪದೇ ಅರ್ಧಕ್ಕೆ ನಿಲ್ಲಿಸಲ್ಪಡುವ ಕೆಲಸಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುವ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ತಂಡಗಳಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.

ಕ್ಯೂ ಗಾತ್ರದ ವರದಿ ಮಾಡುವಿಕೆಯಲ್ಲಿ ಬದಲಾವಣೆ

ಈ ರಿಲೀಸ್ ಕ್ಯೂ ಮ್ಯಾನೇಜರ್‌ಗೆ totalSize() ಎಂಬ ಮೆಥಡ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ, ಇದು ಎಲ್ಲಾ ಕ್ಯೂಗಳಲ್ಲಿ ಬಾಕಿ ಇರುವ ಒಟ್ಟು ಕೆಲಸಗಳ ಸಂಖ್ಯೆಯನ್ನು ನೀಡುತ್ತದೆ. ಈ ಮೌಲ್ಯವು ಡೇಟಾಬೇಸ್-ಬ್ಯಾಕ್ಡ್ ಮತ್ತು Redis ಡ್ರೈವರ್‌ಗಳಿಗೆ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿದೆ, ಏಕೆಂದರೆ ಅವು ನಿಜವಾದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿ ಮಾಡುತ್ತವೆ. SQS, Sync ಮತ್ತು Beanstalkd ನಂತಹ ಡ್ರೈವರ್‌ಗಳು ಇನ್ನೂ ಸೊನ್ನೆಯನ್ನು (zero) ನೀಡುತ್ತವೆ ಏಕೆಂದರೆ ಅವು Laravel API ಮೂಲಕ ಸಂಖ್ಯೆಯನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದಿಲ್ಲ. SQS ಬಳಸುವ ತಂಡಗಳು ಕ್ಯೂ ಆಳಕ್ಕಾಗಿ (queue depth) CloudWatch ಮೆಟ್ರಿಕ್ಸ್‌ಗಳನ್ನು ಅವಲಂಬಿಸುವುದನ್ನು ಮುಂದುವರಿಸಬೇಕು.

ವಿವಿಧ ಸೆಟಪ್‌ಗಳಿಗೆ ಇದರ ಅರ್ಥವೇನು

  • Docker/Kubernetes – ಸುಗಮವಾಗಿ ನಿಲ್ಲಿಸುವ ಅವಧಿಯನ್ನು (graceful shutdown period) ಈಗ ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಬಳಸಬಹುದು. ಕೆಲಸಗಳು ಫ್ಲಾಗ್ ಅನ್ನು ಗಮನಿಸಲು ಮತ್ತು ಸುಗಮವಾಗಿ ಹೊರಬರಲು ಕೆಲವು ಸೆಕೆಂಡುಗಳನ್ನು ಹೊಂದಿರುವಂತೆ ಟರ್ಮಿನೇಶನ್ ಗ್ರೇಸ್ ಅವಧಿಯನ್ನು ವಿಸ್ತರಿಸಿ.
  • Supervisor – ಮಧ್ಯಂತರ ಫ್ಲಾಗ್ ಸ್ವೀಕರಿಸಿದ ನಂತರ ಕೆಲಸವು ಮುಗಿಯುತ್ತದೆ ಎಂದು ನೀವು ನಿರೀಕ್ಷಿಸುವ ಸಮಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನದಾಗಿ stopwaitsecs ಅನ್ನು ಸೆಟ್ ಮಾಡಿ.
  • Legacy jobs – ಮ್ಯಾನೇಜರ್‌ನ ಟೈಮೌಟ್ ಅವಧಿಗಿಂತ ಹೆಚ್ಚು ಕಾಲ ನಡೆಯುವ ಯಾವುದೇ ಕೆಲಸವನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಸಾಧ್ಯವಾದಲ್ಲಿ, ಅದನ್ನು interruptible ಮಾಡಿಕೊಳ್ಳಿ.

ವಿರೋಧಾತ್ಮಕ ಅಂಶ: ಹೆಚ್ಚಿದ ಸಂಕೀರ್ಣತೆ

ಈ ವೈಶಿಷ್ಟ್ಯವು ಸರಿಯಾದ ಟೈಮೌಟ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ. ಒಂದು ವೇಳೆ ಕೆಲಸದ ಲೂಪ್ ಮಧ್ಯಂತರ ಫ್ಲಾಗ್ ಅನ್ನು ಎಂದಿಗೂ ಪರಿಶೀಲಿಸದಿದ್ದರೆ, ಮ್ಯಾನೇಜರ್ ಇನ್ನೂ SIGKILL ಅನ್ನು ಕಳುಹಿಸುತ್ತದೆ. ತಂಡಗಳು ದೀರ್ಘಾವಧಿಯ ಕೋಡ್ ಪಾತ್‌ಗಳನ್ನು ಆಡಿಟ್ ಮಾಡಬೇಕು ಮತ್ತು ತಾರ್ಕಿಕ ಬಿểmಗಳಲ್ಲಿ (logical breakpoints) ಪರಿಶೀಲನೆಗಳನ್ನು ಸೇರಿಸಬೇಕು. ಶಟ್ ಡೌನ್ ವಿಂಡೋ ಒಳಗೆ ಈಗಾಗಲೇ ಮುಗಿದುಹೋಗುವ ಸಣ್ಣ ಕೆಲಸಗಳಿಗಾಗಿ ಕಾಂಟ್ರಾಕ್ಟ್ ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸುವುದು ಮತ್ತು ಫ್ಲಾಗ್ ಪರಿಶೀಲನೆಗಳನ್ನು ಸೇರಿಸುವುದು ಅತಿಯಾದ ಬಾಯ್ಲರ್‌ಪ್ಲೇಟ್ (boilerplate) ಎಂದು ಕೆಲವು ಡೆವಲಪರ್‌ಗಳಿಗೆ ಅನಿಸಬಹುದು.

ಕ್ರಮಗಳ ಪಟ್ಟಿ (Action checklist)

  1. ನಿಯೋಜನಾ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳಲ್ಲಿ (deployment scripts) --once ಫ್ಲಾಗ್ ಅನ್ನು ಹುಡುಕಿ ಮತ್ತು ಅಡ್ಡಿಪಡಿಸಬಹುದಾದ ಕೆಲಸಗಳನ್ನು (interruptible jobs) ಬಳಸುವಲ್ಲಿ ಅದನ್ನು ಡಾಮನ್ ಮೋಡ್ (daemon mode) ಮೂಲಕ ಬದಲಾಯಿಸಿ.
  2. ದೀರ್ಘಕಾಲದವರೆಗೆ ನಡೆಯುವ ಕೆಲಸಗಳನ್ನು (ಅಂದರೆ ಹತ್ತಾರು ಸಾವಿರ ಸಾಲುಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಅಥವಾ ಹಲವಾರು ನಿಮಿಷಗಳ ಕಾಲ ನಡೆಯುವ ಕೆಲಸಗಳು) ಗುರುತಿಸಿ ಮತ್ತು Interruptible contract ಅನ್ನು ಸೇರಿಸಿ.
  3. ಪ್ರತಿ ಲೂಪ್ ಇಟರೇಶನ್‌ನ (loop iteration) ಒಳಗಡೆ ಫ್ಲಾಗ್ ಚೆಕ್ ಅನ್ನು ಸೇರಿಸಿ ಮತ್ತು ಅಗತ್ಯವಿರುವ ಯಾವುದೇ ಫೈನಲೈಸೇಶನ್ ಕೋಡ್ ಅನ್ನು interrupted() ಮೆಥಡ್‌ಗೆ ವರ್ಗಾಯಿಸಿ.
  4. ನಿಯೋಜನೆಗಳು (deployments) ಪ್ರಕ್ರಿಯೆಯ ಮೇಲೆ ಎಷ್ಟು ಬಾರಿ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ ಎಂಬ ಮೆಟ್ರಿಕ್ಸ್‌ಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು WorkerInterrupted ಮತ್ತು JobInterrupted ಗೆ ಲಿಸನರ್‌ಗಳನ್ನು (listeners) ಜೋಡಿಸಿ.
  5. Redis ಅಥವಾ ಡೇಟಾಬೇಸ್ ಕ್ಯೂಗಳಿಗಾಗಿ, ಬ್ಯಾಕ್‌ಲಾಗ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು totalSize() ಬಳಸಿ; SQS ಗಾಗಿ, CloudWatch ಅಲಾರಂಗಳನ್ನು ಸಿದ್ಧವಾಗಿಟ್ಟುಕೊಳ್ಳಿ.

ನಿಯೋಜನೆಯಿಂದ ಉಂಟಾಗುವ ಶಟ್‌ಡೌನ್‌ಗಳನ್ನು ಹಠಾತ್ ನಿಲ್ಲಿಸುವಿಕೆಯ ಬದಲಾಗಿ ಒಂದು ಸಂಯೋಜಿತ ಹಂತವಾಗಿ ಪರಿಗಣಿಸಿ. Laravel 13.31 ಡೇಟಾವನ್ನು ಸ್ಥಿರವಾಗಿರಿಸುತ್ತದೆ ಮತ್ತು ಅರ್ಧಕ್ಕೆ ನಿಂತ ಕೆಲಸಗಳ ಕಾರ್ಯಾಚರಣೆಯ ತಲೆನೋವುಗಳನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ. ಇದರ ಬದಲಾಗಿ ಕೋಡ್ ಜವಾಬ್ದಾರಿಯು ಸ್ವಲ್ಪ ಹೆಚ್ಚಾಗಬಹುದು, ಆದರೆ ಹೆಚ್ಚಿನ ಬ್ಯಾಕ್‌ಗ್ರೌಂಡ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುವ ತಂಡಗಳು ಹೆಚ್ಚು ವಿಶ್ವಾಸಾರ್ಹವಾದ ಪ್ರೊಡಕ್ಷನ್ ಪರಿಸರವನ್ನು ಪಡೆಯುತ್ತವೆ.