PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಮುನ್ನುಡಿ

ನಾನು ಹವ್ಯಾಸವಾಗಿ ನಡೆಸುತ್ತಿರುವ ನನ್ನ ವೆಬ್‌ಸೈಟ್ ಆಸಕ್ತಿದಾಯಕ ಮುಖಪುಟಗಳು ಮತ್ತು ವೈಯಕ್ತಿಕ ಸೈಟ್‌ಗಳನ್ನು ಹೋಸ್ಟ್ ಮಾಡಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ. ನನ್ನ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಪ್ರಯಾಣದ ಪ್ರಾರಂಭದಲ್ಲಿಯೇ ಈ ವಿಷಯವು ನನಗೆ ಆಸಕ್ತಿಯನ್ನುಂಟುಮಾಡಲು ಪ್ರಾರಂಭಿಸಿತು; ಆ ಕ್ಷಣದಲ್ಲಿ ನಾನು ತಮ್ಮ ಬಗ್ಗೆ, ಅವರ ಹವ್ಯಾಸಗಳು ಮತ್ತು ಯೋಜನೆಗಳ ಬಗ್ಗೆ ಬರೆಯುವ ಶ್ರೇಷ್ಠ ವೃತ್ತಿಪರರನ್ನು ಕಂಡು ಆಕರ್ಷಿತನಾಗಿದ್ದೆ. ನನಗಾಗಿ ಅವುಗಳನ್ನು ಕಂಡುಹಿಡಿಯುವ ಅಭ್ಯಾಸವು ಇಂದಿಗೂ ಉಳಿದಿದೆ: ಪ್ರತಿಯೊಂದು ವಾಣಿಜ್ಯ ಮತ್ತು ಹೆಚ್ಚು ವಾಣಿಜ್ಯವಲ್ಲದ ಸೈಟ್‌ಗಳಲ್ಲಿ, ಲೇಖಕರ ಲಿಂಕ್‌ಗಳ ಹುಡುಕಾಟದಲ್ಲಿ ನಾನು ಅಡಿಟಿಪ್ಪಣಿಯಲ್ಲಿ ನೋಡುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತೇನೆ.

ಕಲ್ಪನೆಯ ಅನುಷ್ಠಾನ

ಮೊದಲ ಆವೃತ್ತಿಯು ನನ್ನ ವೈಯಕ್ತಿಕ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ಕೇವಲ html ಪುಟವಾಗಿತ್ತು, ಅಲ್ಲಿ ನಾನು ಸಹಿಗಳೊಂದಿಗೆ ಲಿಂಕ್‌ಗಳನ್ನು ul ಪಟ್ಟಿಗೆ ಹಾಕಿದ್ದೇನೆ. ಸಮಯದ ಅವಧಿಯಲ್ಲಿ 20 ಪುಟಗಳನ್ನು ಟೈಪ್ ಮಾಡಿದ ನಂತರ, ಇದು ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿಯಲ್ಲ ಎಂದು ನಾನು ಯೋಚಿಸಲು ಪ್ರಾರಂಭಿಸಿದೆ ಮತ್ತು ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸಲು ಪ್ರಯತ್ನಿಸಲು ನಿರ್ಧರಿಸಿದೆ. ಸ್ಟಾಕ್‌ಓವರ್‌ಫ್ಲೋನಲ್ಲಿ, ಅನೇಕ ಜನರು ತಮ್ಮ ಪ್ರೊಫೈಲ್‌ಗಳಲ್ಲಿ ಸೈಟ್‌ಗಳನ್ನು ಸೂಚಿಸುತ್ತಾರೆ ಎಂದು ನಾನು ಗಮನಿಸಿದ್ದೇನೆ, ಆದ್ದರಿಂದ ನಾನು php ನಲ್ಲಿ ಪಾರ್ಸರ್ ಅನ್ನು ಬರೆದಿದ್ದೇನೆ, ಅದು ಪ್ರೊಫೈಲ್‌ಗಳ ಮೂಲಕ ಸರಳವಾಗಿ ಹೋಯಿತು, ಮೊದಲಿನಿಂದ ಪ್ರಾರಂಭಿಸಿ (ಇಂದಿಗೂ SO ನಲ್ಲಿನ ವಿಳಾಸಗಳು ಹೀಗಿವೆ: `/ಬಳಕೆದಾರರು/1` ), ಬಯಸಿದ ಟ್ಯಾಗ್‌ನಿಂದ ಲಿಂಕ್‌ಗಳನ್ನು ಹೊರತೆಗೆಯಲಾಗಿದೆ ಮತ್ತು ಅದನ್ನು SQLite ನಲ್ಲಿ ಸೇರಿಸಲಾಗಿದೆ.

ಇದನ್ನು ಎರಡನೇ ಆವೃತ್ತಿ ಎಂದು ಕರೆಯಬಹುದು: SQLite ಕೋಷ್ಟಕದಲ್ಲಿ ಹತ್ತಾರು ಸಾವಿರ URL ಗಳ ಸಂಗ್ರಹ, ಇದು HTML ನಲ್ಲಿನ ಸ್ಥಿರ ಪಟ್ಟಿಯನ್ನು ಬದಲಾಯಿಸಿತು. ನಾನು ಈ ಪಟ್ಟಿಯಲ್ಲಿ ಸರಳವಾದ ಹುಡುಕಾಟವನ್ನು ಮಾಡಿದ್ದೇನೆ. ಏಕೆಂದರೆ ಕೇವಲ URL ಗಳು ಇದ್ದವು, ನಂತರ ಹುಡುಕಾಟವು ಅವುಗಳನ್ನು ಆಧರಿಸಿದೆ.

ಈ ಹಂತದಲ್ಲಿ ನಾನು ಯೋಜನೆಯನ್ನು ಕೈಬಿಟ್ಟೆ ಮತ್ತು ಬಹಳ ಸಮಯದ ನಂತರ ಅದಕ್ಕೆ ಮರಳಿದೆ. ಈ ಹಂತದಲ್ಲಿ, ನನ್ನ ಕೆಲಸದ ಅನುಭವವು ಈಗಾಗಲೇ ಮೂರು ವರ್ಷಗಳಿಗಿಂತ ಹೆಚ್ಚು ಮತ್ತು ನಾನು ಹೆಚ್ಚು ಗಂಭೀರವಾದದ್ದನ್ನು ಮಾಡಬಹುದೆಂದು ನಾನು ಭಾವಿಸಿದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, ತುಲನಾತ್ಮಕವಾಗಿ ಹೊಸ ತಂತ್ರಜ್ಞಾನಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವ ದೊಡ್ಡ ಬಯಕೆ ಇತ್ತು.

ಆಧುನಿಕ ಆವೃತ್ತಿ

ಯೋಜನೆಯು ಡಾಕರ್‌ನಲ್ಲಿ ನಿಯೋಜಿಸಲಾಗಿದೆ, ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮೊಂಗೊಡಿಬಿಗೆ ವರ್ಗಾಯಿಸಲಾಯಿತು ಮತ್ತು ಇತ್ತೀಚೆಗೆ, ಮೂಲಂಗಿಯನ್ನು ಸೇರಿಸಲಾಯಿತು, ಇದು ಮೊದಲಿಗೆ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳಲು ಮಾತ್ರವಾಗಿತ್ತು. PHP ಮೈಕ್ರೋಫ್ರೇಮ್‌ವರ್ಕ್‌ಗಳಲ್ಲಿ ಒಂದನ್ನು ಆಧಾರವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.

ಸಮಸ್ಯೆಯನ್ನು

ಕೆಳಗಿನವುಗಳನ್ನು ಸಿಂಕ್ರೊನಸ್ ಆಗಿ ಮಾಡುವ ಕನ್ಸೋಲ್ ಆಜ್ಞೆಯಿಂದ ಹೊಸ ಸೈಟ್‌ಗಳನ್ನು ಸೇರಿಸಲಾಗುತ್ತದೆ:

  • URL ಮೂಲಕ ವಿಷಯವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುತ್ತದೆ
  • HTTPS ಲಭ್ಯವಿದೆಯೇ ಎಂಬುದನ್ನು ಸೂಚಿಸುವ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಹೊಂದಿಸುತ್ತದೆ
  • ವೆಬ್‌ಸೈಟ್‌ನ ಸಾರವನ್ನು ಸಂರಕ್ಷಿಸುತ್ತದೆ
  • ಮೂಲ HTML ಮತ್ತು ಹೆಡರ್‌ಗಳನ್ನು "ಇಂಡೆಕ್ಸಿಂಗ್" ಇತಿಹಾಸದಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ
  • ವಿಷಯವನ್ನು ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ, ಶೀರ್ಷಿಕೆ ಮತ್ತು ವಿವರಣೆಯನ್ನು ಹೊರತೆಗೆಯುತ್ತದೆ
  • ಪ್ರತ್ಯೇಕ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಉಳಿಸುತ್ತದೆ

ಸೈಟ್‌ಗಳನ್ನು ಸರಳವಾಗಿ ಸಂಗ್ರಹಿಸಲು ಮತ್ತು ಅವುಗಳನ್ನು ಪಟ್ಟಿಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲು ಇದು ಸಾಕಾಗಿತ್ತು:

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಆದರೆ ಎಲ್ಲವನ್ನೂ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೂಚಿಕೆ ಮಾಡುವ, ವರ್ಗೀಕರಿಸುವ ಮತ್ತು ಶ್ರೇಣೀಕರಿಸುವ, ಎಲ್ಲವನ್ನೂ ನವೀಕೃತವಾಗಿರಿಸುವ ಕಲ್ಪನೆಯು ಈ ಮಾದರಿಗೆ ಸರಿಯಾಗಿ ಹೊಂದಿಕೆಯಾಗಲಿಲ್ಲ. ಪುಟಗಳನ್ನು ಸೇರಿಸಲು ವೆಬ್ ವಿಧಾನವನ್ನು ಸರಳವಾಗಿ ಸೇರಿಸುವುದರಿಂದ ಕೋಡ್ ನಕಲು ಅಗತ್ಯವಿದೆ ಮತ್ತು ಸಂಭಾವ್ಯ DDoS ಅನ್ನು ತಪ್ಪಿಸಲು ನಿರ್ಬಂಧಿಸುತ್ತದೆ.

ಸಾಮಾನ್ಯವಾಗಿ, ಸಹಜವಾಗಿ, ಎಲ್ಲವನ್ನೂ ಸಿಂಕ್ರೊನಸ್ ಆಗಿ ಮಾಡಬಹುದು, ಮತ್ತು ವೆಬ್ ವಿಧಾನದಲ್ಲಿ ನೀವು ಸರಳವಾಗಿ URL ಅನ್ನು ಉಳಿಸಬಹುದು ಇದರಿಂದ ದೈತ್ಯಾಕಾರದ ಡೀಮನ್ ಪಟ್ಟಿಯಿಂದ URL ಗಳಿಗಾಗಿ ಎಲ್ಲಾ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಆದರೆ ಇನ್ನೂ, ಇಲ್ಲಿ "ಕ್ಯೂ" ಎಂಬ ಪದವು ಸ್ವತಃ ಸೂಚಿಸುತ್ತದೆ. ಮತ್ತು ಕ್ಯೂ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿದರೆ, ನಂತರ ಎಲ್ಲಾ ಕಾರ್ಯಗಳನ್ನು ವಿಂಗಡಿಸಬಹುದು ಮತ್ತು ಕನಿಷ್ಠ ಅಸಮಕಾಲಿಕವಾಗಿ ನಿರ್ವಹಿಸಬಹುದು.

ನಿರ್ಧಾರವನ್ನು

ಸರತಿ ಸಾಲುಗಳನ್ನು ಅಳವಡಿಸಿ ಮತ್ತು ಎಲ್ಲಾ ಕಾರ್ಯಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಈವೆಂಟ್-ಚಾಲಿತ ವ್ಯವಸ್ಥೆಯನ್ನು ಮಾಡಿ. ಮತ್ತು ನಾನು ಬಹಳ ಸಮಯದಿಂದ ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಪ್ರಯತ್ನಿಸಲು ಬಯಸುತ್ತೇನೆ.

PHP ನಲ್ಲಿ Redis ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಬಳಸುವುದು

ಏಕೆಂದರೆ ನನ್ನ ಚೌಕಟ್ಟು ಸಿಮ್ಫೋನಿ, ಲಾರಾವೆಲ್, ಯಿ ಎಂಬ ಮೂರು ದೈತ್ಯಗಳಲ್ಲಿ ಒಂದಲ್ಲದ ಕಾರಣ, ನಾನು ಸ್ವತಂತ್ರ ಗ್ರಂಥಾಲಯವನ್ನು ಹುಡುಕಲು ಬಯಸುತ್ತೇನೆ. ಆದರೆ, ಅದು ಬದಲಾದಂತೆ (ಮೊದಲ ಪರೀಕ್ಷೆಯಲ್ಲಿ), ವೈಯಕ್ತಿಕ ಗಂಭೀರ ಗ್ರಂಥಾಲಯಗಳನ್ನು ಕಂಡುಹಿಡಿಯುವುದು ಅಸಾಧ್ಯ. ಸರತಿ ಸಾಲುಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಎಲ್ಲವೂ ಐದು ವರ್ಷಗಳ ಹಿಂದೆ 3 ಕಮಿಟ್‌ಗಳ ಯೋಜನೆಯಾಗಿದೆ, ಅಥವಾ ಫ್ರೇಮ್‌ವರ್ಕ್‌ಗೆ ಒಳಪಟ್ಟಿರುತ್ತದೆ.

ವೈಯಕ್ತಿಕ ಉಪಯುಕ್ತ ಘಟಕಗಳ ಪೂರೈಕೆದಾರರಾಗಿ ಸಿಮ್ಫೋನಿ ಬಗ್ಗೆ ನಾನು ಸಾಕಷ್ಟು ಕೇಳಿದ್ದೇನೆ ಮತ್ತು ನಾನು ಈಗಾಗಲೇ ಅವುಗಳಲ್ಲಿ ಕೆಲವನ್ನು ಬಳಸುತ್ತಿದ್ದೇನೆ. ಮತ್ತು Laravel ನಿಂದ ಕೆಲವು ವಿಷಯಗಳನ್ನು ಸಹ ಬಳಸಬಹುದು, ಉದಾಹರಣೆಗೆ ಅವರ ORM, ಫ್ರೇಮ್‌ವರ್ಕ್‌ನ ಉಪಸ್ಥಿತಿಯಿಲ್ಲದೆ.

ಸಿಂಫೋನಿ/ಮೆಸೆಂಜರ್

ಮೊದಲ ಅಭ್ಯರ್ಥಿಯು ತಕ್ಷಣವೇ ಆದರ್ಶಪ್ರಾಯವೆಂದು ತೋರುತ್ತದೆ ಮತ್ತು ಯಾವುದೇ ಸಂದೇಹವಿಲ್ಲದೆ ನಾನು ಅದನ್ನು ಸ್ಥಾಪಿಸಿದೆ. ಆದರೆ ಸಿಮ್ಫೊನಿಯ ಹೊರಗಿನ ಬಳಕೆಯ ಉದಾಹರಣೆಗಳನ್ನು ಗೂಗಲ್ ಮಾಡಲು ಹೆಚ್ಚು ಕಷ್ಟಕರವಾಗಿದೆ. ಸಾರ್ವತ್ರಿಕ, ಅರ್ಥಹೀನ ಹೆಸರುಗಳು, ಸಂದೇಶಗಳನ್ನು ರವಾನಿಸಲು ಬಸ್ ಮತ್ತು ರೆಡಿಸ್‌ನಲ್ಲಿ ಸಹ ತರಗತಿಗಳ ಗುಂಪಿನಿಂದ ಹೇಗೆ ಜೋಡಿಸುವುದು?

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಅಧಿಕೃತ ಸೈಟ್‌ನಲ್ಲಿನ ದಸ್ತಾವೇಜನ್ನು ಸಾಕಷ್ಟು ವಿವರವಾಗಿ ವಿವರಿಸಲಾಗಿದೆ, ಆದರೆ ಸಿಂಫೊನಿಗಾಗಿ ಅವರ ನೆಚ್ಚಿನ YML ಮತ್ತು ಸಿಂಫೊನಿಸ್ಟ್ ಅಲ್ಲದ ಇತರ ಮ್ಯಾಜಿಕ್ ವಿಧಾನಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪ್ರಾರಂಭವನ್ನು ಮಾತ್ರ ವಿವರಿಸಲಾಗಿದೆ. ಅನುಸ್ಥಾಪನಾ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ನನಗೆ ಆಸಕ್ತಿ ಇರಲಿಲ್ಲ, ವಿಶೇಷವಾಗಿ ಹೊಸ ವರ್ಷದ ರಜಾದಿನಗಳಲ್ಲಿ. ಆದರೆ ನಾನು ಇದನ್ನು ಅನಿರೀಕ್ಷಿತವಾಗಿ ದೀರ್ಘಕಾಲ ಮಾಡಬೇಕಾಯಿತು.

ಸಿಮ್ಫೋನಿ ಮೂಲಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಸಿಸ್ಟಮ್ ಅನ್ನು ಹೇಗೆ ತತ್‌ಕ್ಷಣಗೊಳಿಸುವುದು ಎಂದು ಲೆಕ್ಕಾಚಾರ ಮಾಡಲು ಪ್ರಯತ್ನಿಸುವುದು ಬಿಗಿಯಾದ ಗಡುವುಗಾಗಿ ಅತ್ಯಂತ ಕ್ಷುಲ್ಲಕ ಕಾರ್ಯವಲ್ಲ:

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಇದೆಲ್ಲವನ್ನೂ ಆಳಕ್ಕಿಳಿದು ಕೈಯಿಂದ ಏನಾದ್ರೂ ಮಾಡೋಕೆ ಪ್ರಯತ್ನ ಪಡ್ತಾ ಇರೋ ಊರುಗೋಲು ಮಾಡ್ತೀನಿ ಅಂತ ತೀರ್ಮಾನಕ್ಕೆ ಬಂದು ಇನ್ನೇನಾದರೂ ಟ್ರೈ ಮಾಡೋಣ ಅಂತ ನಿಶ್ಚಯಿಸಿದೆ.

ಪ್ರಕಾಶಿತ/ಸರದಿ

ಈ ಲೈಬ್ರರಿಯನ್ನು ಲಾರಾವೆಲ್ ಮೂಲಸೌಕರ್ಯ ಮತ್ತು ಇತರ ಅವಲಂಬನೆಗಳ ಗುಂಪಿಗೆ ಬಿಗಿಯಾಗಿ ಜೋಡಿಸಲಾಗಿದೆ ಎಂದು ಅದು ಬದಲಾಯಿತು, ಆದ್ದರಿಂದ ನಾನು ಅದರ ಮೇಲೆ ಹೆಚ್ಚು ಸಮಯವನ್ನು ಕಳೆಯಲಿಲ್ಲ: ನಾನು ಅದನ್ನು ಸ್ಥಾಪಿಸಿದೆ, ಅದನ್ನು ನೋಡಿದೆ, ಅವಲಂಬನೆಗಳನ್ನು ನೋಡಿದೆ ಮತ್ತು ಅದನ್ನು ಅಳಿಸಿದೆ.

yiisoft/yii2-ಕ್ಯೂ

ಸರಿ, ಇಲ್ಲಿ ಅದನ್ನು ತಕ್ಷಣವೇ ಹೆಸರಿನಿಂದ ಊಹಿಸಲಾಗಿದೆ, ಮತ್ತೊಮ್ಮೆ, Yii2 ಗೆ ಕಟ್ಟುನಿಟ್ಟಾದ ಸಂಪರ್ಕ. ನಾನು ಈ ಲೈಬ್ರರಿಯನ್ನು ಬಳಸಬೇಕಾಗಿತ್ತು ಮತ್ತು ಅದು ಕೆಟ್ಟದ್ದಲ್ಲ, ಆದರೆ ಅದು ಸಂಪೂರ್ಣವಾಗಿ Yii2 ಅನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ ಎಂಬ ಅಂಶದ ಬಗ್ಗೆ ನಾನು ಯೋಚಿಸಲಿಲ್ಲ.

ಉಳಿದವು

ಗಿಟ್‌ಹಬ್‌ನಲ್ಲಿ ನಾನು ಕಂಡುಕೊಂಡ ಉಳಿದೆಲ್ಲವೂ ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ, ಹಳತಾದ ಮತ್ತು ನಕ್ಷತ್ರಗಳು, ಫೋರ್ಕ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಕಮಿಟ್‌ಗಳಿಲ್ಲದೆ ಕೈಬಿಟ್ಟ ಯೋಜನೆಗಳಾಗಿವೆ.

ಸಿಂಫೋನಿ/ಮೆಸೆಂಜರ್, ತಾಂತ್ರಿಕ ವಿವರಗಳಿಗೆ ಹಿಂತಿರುಗಿ

ನಾನು ಈ ಲೈಬ್ರರಿಯನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಬೇಕಾಗಿತ್ತು ಮತ್ತು ಸ್ವಲ್ಪ ಸಮಯ ಕಳೆದ ನಂತರ, ನನಗೆ ಸಾಧ್ಯವಾಯಿತು. ಎಲ್ಲವೂ ಸಾಕಷ್ಟು ಸಂಕ್ಷಿಪ್ತ ಮತ್ತು ಸರಳವಾಗಿದೆ ಎಂದು ಅದು ಬದಲಾಯಿತು. ಬಸ್ ಅನ್ನು ತತ್‌ಕ್ಷಣ ಮಾಡಲು, ನಾನು ಒಂದು ಸಣ್ಣ ಕಾರ್ಖಾನೆಯನ್ನು ಮಾಡಿದೆ, ಏಕೆಂದರೆ... ನಾನು ಹಲವಾರು ಟೈರ್‌ಗಳನ್ನು ಮತ್ತು ವಿಭಿನ್ನ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳನ್ನು ಹೊಂದಿರಬೇಕಿತ್ತು.

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಕೆಲವೇ ಹಂತಗಳು:

  • ನಾವು ಸರಳವಾಗಿ ಕರೆಯಬಹುದಾದ ಸಂದೇಶ ನಿರ್ವಾಹಕರನ್ನು ರಚಿಸುತ್ತೇವೆ
  • ನಾವು ಅವುಗಳನ್ನು ಹ್ಯಾಂಡ್ಲರ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್‌ನಲ್ಲಿ ಸುತ್ತುತ್ತೇವೆ (ಲೈಬ್ರರಿಯಿಂದ ವರ್ಗ)
  • ನಾವು ಈ "ವಿವರಣೆಗಳನ್ನು" ಹ್ಯಾಂಡ್ಲರ್‌ಲೊಕೇಟರ್ ನಿದರ್ಶನದಲ್ಲಿ ಸುತ್ತುತ್ತೇವೆ
  • MessageBus ನಿದರ್ಶನಕ್ಕೆ ಹ್ಯಾಂಡ್ಲರ್‌ಲೊಕೇಟರ್ ಅನ್ನು ಸೇರಿಸಲಾಗುತ್ತಿದೆ
  • ನಾವು SendersLocator ಗೆ `SenderInterface` ನ ಒಂದು ಸೆಟ್ ಅನ್ನು ರವಾನಿಸುತ್ತೇವೆ, ನನ್ನ ಸಂದರ್ಭದಲ್ಲಿ `RedisTransport` ತರಗತಿಗಳ ನಿದರ್ಶನಗಳನ್ನು ಸ್ಪಷ್ಟ ರೀತಿಯಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ
  • MessageBus ನಿದರ್ಶನಕ್ಕೆ SendersLocator ಅನ್ನು ಸೇರಿಸಲಾಗುತ್ತಿದೆ

MessageBus ಒಂದು `->ಡಿಸ್ಪ್ಯಾಚ್()` ವಿಧಾನವನ್ನು ಹೊಂದಿದ್ದು ಅದು ಹ್ಯಾಂಡ್ಲರ್‌ಲೊಕೇಟರ್‌ನಲ್ಲಿ ಸೂಕ್ತವಾದ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳನ್ನು ಹುಡುಕುತ್ತದೆ ಮತ್ತು ಅವರಿಗೆ ಸಂದೇಶವನ್ನು ರವಾನಿಸುತ್ತದೆ, ಬಸ್ ಮೂಲಕ ಕಳುಹಿಸಲು ಅನುಗುಣವಾದ `ಸೆಂಡರ್‌ಇಂಟರ್‌ಫೇಸ್` ಅನ್ನು ಬಳಸಿ (ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್‌ಗಳು).

ಕಂಟೇನರ್ ಕಾನ್ಫಿಗರೇಶನ್‌ನಲ್ಲಿ (ಈ ಸಂದರ್ಭದಲ್ಲಿ php-di), ಈ ಸಂಪೂರ್ಣ ಬಂಡಲ್ ಅನ್ನು ಈ ರೀತಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು:

        CONTAINER_REDIS_TRANSPORT_SECRET => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_TRANSPORT_LOG => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_STREAM_RECEIVER_SECRET => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_RECEIVER_LOG => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_BUS => function (ContainerInterface $c) {
            $sendersLocator = new SendersLocator([
                AppMessagesSecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET],
                AppMessagesDaemonLogMessage::class => [CONTAINER_REDIS_TRANSPORT_LOG],
            ], $c);
            $middleware[] = new SendMessageMiddleware($sendersLocator);

            return new MessageBus($middleware);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_SECRET => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'secret',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_LOG => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'log',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },

SendersLocator ನಲ್ಲಿ ನಾವು ಎರಡು ವಿಭಿನ್ನ ಸಂದೇಶಗಳಿಗಾಗಿ ವಿಭಿನ್ನ "ಸಾರಿಗೆ" ಅನ್ನು ನಿಯೋಜಿಸಿದ್ದೇವೆ ಎಂದು ಇಲ್ಲಿ ನೀವು ನೋಡಬಹುದು, ಪ್ರತಿಯೊಂದೂ ಅನುಗುಣವಾದ ಸ್ಟ್ರೀಮ್‌ಗಳಿಗೆ ತನ್ನದೇ ಆದ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿದೆ.

ನಾನು ಈ ಕೆಳಗಿನ ಬಸ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಪರಸ್ಪರ ಸಂವಹನ ನಡೆಸುವ ಮೂರು ಡೀಮನ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪ್ರದರ್ಶಿಸುವ ಪ್ರತ್ಯೇಕ ಡೆಮೊ ಯೋಜನೆಯನ್ನು ಮಾಡಿದ್ದೇನೆ: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

ಆದರೆ ಗ್ರಾಹಕರನ್ನು ಹೇಗೆ ರಚಿಸಬಹುದು ಎಂಬುದನ್ನು ನಾನು ನಿಮಗೆ ತೋರಿಸುತ್ತೇನೆ:

use AppMessagesDaemonLogMessage;
use SymfonyComponentMessengerHandlerHandlerDescriptor;
use SymfonyComponentMessengerHandlerHandlersLocator;
use SymfonyComponentMessengerMessageBus;
use SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
use SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
use SymfonyComponentMessengerTransportSenderSendersLocator;

require_once __DIR__ . '/../vendor/autoload.php';
/** @var PsrContainerContainerInterface $container */
$container = require_once('config/container.php');

$handlers = [
    DaemonLogMessage::class => [
        new HandlerDescriptor(
            function (DaemonLogMessage $m) {
                error_log('DaemonLogHandler: message handled: / ' . $m->getMessage());
            },
            ['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
        )
    ],
];
$middleware = [];
$middleware[] = new HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = new SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = new SendMessageMiddleware($sendersLocator);

$bus = new MessageBus($middleware);
$receivers = [
    CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = new SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();

ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಈ ಮೂಲಸೌಕರ್ಯವನ್ನು ಬಳಸುವುದು

ನನ್ನ ಬ್ಯಾಕೆಂಡ್‌ನಲ್ಲಿ ಬಸ್ ಅನ್ನು ಅಳವಡಿಸಿದ ನಂತರ, ನಾನು ಹಳೆಯ ಸಿಂಕ್ರೊನಸ್ ಆಜ್ಞೆಯಿಂದ ಪ್ರತ್ಯೇಕ ಹಂತಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸಿದ್ದೇನೆ ಮತ್ತು ಪ್ರತ್ಯೇಕ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳನ್ನು ಮಾಡಿದ್ದೇನೆ, ಪ್ರತಿಯೊಬ್ಬರೂ ತಮ್ಮದೇ ಆದ ಕೆಲಸವನ್ನು ಮಾಡುತ್ತಾರೆ.

ಡೇಟಾಬೇಸ್‌ಗೆ ಹೊಸ ಸೈಟ್ ಅನ್ನು ಸೇರಿಸುವ ಪೈಪ್‌ಲೈನ್ ಈ ರೀತಿ ಕಾಣುತ್ತದೆ:

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಮತ್ತು ಅದರ ನಂತರ ತಕ್ಷಣವೇ, ಹೊಸ ಕಾರ್ಯವನ್ನು ಸೇರಿಸಲು ನನಗೆ ತುಂಬಾ ಸುಲಭವಾಯಿತು, ಉದಾಹರಣೆಗೆ, Rss ಅನ್ನು ಹೊರತೆಗೆಯುವುದು ಮತ್ತು ಪಾರ್ಸಿಂಗ್ ಮಾಡುವುದು. ಏಕೆಂದರೆ ಈ ಪ್ರಕ್ರಿಯೆಗೆ ಮೂಲ ವಿಷಯವೂ ಅಗತ್ಯವಿರುತ್ತದೆ, ನಂತರ ವೆಬ್‌ಸೈಟ್‌ಇಂಡೆಕ್ಸ್‌ಹಿಸ್ಟರಿ ಪರ್ಸಿಸ್ಟರ್‌ನಂತಹ RSS ಲಿಂಕ್ ಎಕ್ಸ್‌ಟ್ರಾಕ್ಟರ್ ಹ್ಯಾಂಡ್ಲರ್, "ವಿಷಯ/HtmlContent" ಸಂದೇಶಕ್ಕೆ ಚಂದಾದಾರರಾಗುತ್ತದೆ, ಅದನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಬಯಸಿದ ಸಂದೇಶವನ್ನು ಅದರ ಪೈಪ್‌ಲೈನ್‌ನಲ್ಲಿ ಮತ್ತಷ್ಟು ರವಾನಿಸುತ್ತದೆ.

PHP ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ರೆಡಿಸ್ ಸ್ಟ್ರೀಮ್ಸ್ ಬಸ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್-ಸ್ವತಂತ್ರ ಲೈಬ್ರರಿಯನ್ನು ಆರಿಸುವುದು

ಕೊನೆಯಲ್ಲಿ, ನಾವು ಹಲವಾರು ಡೀಮನ್‌ಗಳೊಂದಿಗೆ ಕೊನೆಗೊಂಡಿದ್ದೇವೆ, ಪ್ರತಿಯೊಂದೂ ಅಗತ್ಯ ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಮಾತ್ರ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ ರಾಕ್ಷಸ ಕ್ರಾಲರ್‌ಗಳು ವಿಷಯಕ್ಕಾಗಿ ಇಂಟರ್ನೆಟ್‌ಗೆ ಹೋಗುವ ಅಗತ್ಯವಿರುವ ಎಲ್ಲಾ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳು ಮತ್ತು ಡೀಮನ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ ಇರುತ್ತವೆ ಡೇಟಾಬೇಸ್‌ಗೆ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿದೆ.

ಈಗ, ಡೇಟಾಬೇಸ್‌ನಿಂದ ಆಯ್ಕೆ ಮಾಡುವ ಬದಲು, ಪರ್ಸಿಸ್ಟರ್‌ನಿಂದ ಅಳವಡಿಕೆಯ ನಂತರ ಅಗತ್ಯವಿರುವ ಐಡಿಗಳನ್ನು ಬಸ್ ಮೂಲಕ ಎಲ್ಲಾ ಆಸಕ್ತಿ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳಿಗೆ ಸರಳವಾಗಿ ರವಾನಿಸಲಾಗುತ್ತದೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ