ಹ್ಯಾಂಡ್ಶೇಕ್ ತೆರಿಗೆ
ನಿಮ್ಮ Magento integration ಒಂದು ಗುಪ್ತ ನೆಟ್ವರ್ಕ್ ವೆಚ್ಚದಿಂದಾಗಿ ನಿಧಾನವಾಗಿದ್ದೀತು.
ನಾನು ಒಮ್ಮೆ ಪ್ರೈಸಿಂಗ್ API ಜೊತೆಗೆ ಸಂವಹನ ನಡೆಸುವ ಉತ್ಪನ್ನದ ಎಕ್ಸ್ಪೋರ್ಟ್ (product export) ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಡೆಸಿದ್ದೆ. ಒಂದು ಉತ್ಪನ್ನವು ವೇಗವಾಗಿ ಕೆಲಸ ಮಾಡಿತು. ಆದರೆ ಪೂರ್ಣ ಕ್ಯಾಟಲಾಗ್ ಪ್ರಕ್ರಿಯೆಯಾಗಲು ತುಂಬಾ ಸಮಯtook. ನನ್ನ ಡೇಟಾಬೇಸ್ ಬಳಕೆಯಿಲ್ಲದೆ ಇತ್ತು (idle). ಪ್ರೊಫೈಲರ್ (profiler) ಪ್ರಕಾರ ಸಮಸ್ಯೆ ನೆಟ್ವರ್ಕ್ನಲ್ಲಿದೆ ಎಂದು ತಿಳಿದುಬಂದಿತು.
ಕೋಡ್ ಒಂದು ಲೂಪ್ನ (loop) ಒಳಗೆ ಹೊಸ HTTP client ಅನ್ನು ರಚಿಸುತ್ತಿತ್ತು.
ನೀವು HTTPS ಮೂಲಕ ಡೇಟಾವನ್ನು ಕಳುಹಿಸುವ ಮೊದಲು, ನಿಮ್ಮ ಯಂತ್ರವು ಹೆಚ್ಚಿನ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಸಾಕೆಟ್ (socket) ತೆರೆಯಲು ಅದು TCP handshake ಅನ್ನು ಮಾಡುತ್ತದೆ. ನಂತರ ಸರ್ಟಿಫಿಕೇಟ್ಗಳನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ಕೀಗಳನ್ನು (keys) ನಿರ್ಧರಿಸಲು TLS handshake ಅನ್ನು ಮಾಡುತ್ತದೆ. ಇದು ಹಲವಾರು ರೌಂಡ್ ಟ್ರಿಪ್ಗಳನ್ನು (round trips) ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ.
ನೀವು ಇದನ್ನು ಒಮ್ಮೆ ಮಾಡಿದರೆ, ವೆಚ್ಚ ಕಡಿಮೆ ಇರುತ್ತದೆ. ಆದರೆ ನೀವು 40,000 ಉತ್ಪನ್ನಗಳ ಲೂಪ್ನ ಒಳಗೆ ಇದನ್ನು ಮಾಡಿದರೆ, ನೀವು ಆ ವೆಚ್ಚವನ್ನು 40,000 ಬಾರಿ ಪಾವತಿಸುತ್ತೀರಿ. ನಿಜವಾದ ಡೇಟಾ ಚಿಕ್ಕದಾಗಿರುತ್ತದೆ, ಆದರೆ ಸೆಟಪ್ ಮಾಡುವುದೇ ಹೆಚ್ಚು ವೆಚ್ಚದಾಯಕ ಭಾಗವಾಗಿದೆ.
PHP ನಲ್ಲಿ ನೀವು ಒಂದು ಕ್ಲೈಂಟ್ ಅನ್ನು ರಚಿಸಿ ನಂತರ ಅದನ್ನು ಬಿಟ್ಟುಬಿಡಬೇಕು ಎಂಬ ಭಾವನೆ ಬರಬಹುದು. ಇದು ಒಂದೇ ವೆಬ್ ರಿಕ್ವೆಸ್ಟ್ಗೆ (web request) ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಆದರೆ ದೀರ್ಘಾವಧಿಯ ಪ್ರಕ್ರಿಯೆಗಳಲ್ಲಿ (long-running processes) ಇದು ವಿಫಲವಾಗುತ್ತದೆ.
ಕ್ರೋನ್ ಜಾಬ್ಗಳು (cron jobs), ಕನ್ಸೋಲ್ ಕಮಾಂಡ್ಗಳು ಅಥವಾ ಮೆಸೇಜ್ ಕ್ಯೂ ಕನ್ಸ್ಯೂಮರ್ಗಳಲ್ಲಿ (message queue consumers) ಈ ಮಾದರಿಯನ್ನು ತಪ್ಪಿಸಿ:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
ಈ ಕೋಡ್ ಪ್ರತಿಯೊಂದು ಉತ್ಪನ್ನಕ್ಕೂ ಹೊಸ ಕನೆಕ್ಷನ್ ಅನ್ನು ತೆರೆಯುತ್ತದೆ ಮತ್ತು ಸಂಪೂರ್ಣ ಹ್ಯಾಂಡ್ಶೇಕ್ ಅನ್ನು ನಡೆಸುತ್ತದೆ.
ನೀವು ಒಂದೇ ಕ್ಲೈಂಟ್ ಇನ್ಸ್ಟೆನ್ಸ್ ಅನ್ನು ಬಳಸಿದರೆ Guzzle ಕನೆಕ್ಷನ್ಗಳನ್ನು ಜೀವಂತವಾಗಿರಿಸುತ್ತದೆ. ಕ್ಲೈಂಟ್ ಅನ್ನು ನಿಮ್ಮ ಲೂಪ್ನ ಹೊರಗೆ ತನ್ನಿ:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
ಈಗ ಸಾಕೆಟ್ ಮತ್ತು TLS ಸೆಷನ್ ತೆರೆದೆಯೇ ಇರುತ್ತದೆ. ನೀವು ಒಮ್ಮೆ ಹ್ಯಾಂಡ್ಶೇಕ್ ಮಾಡಿ ಉಳಿದದ್ದನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಬಹುದು. Magento ನಲ್ಲಿ, ಕ್ಲೈಂಟ್ ಅನ್ನು ಮ್ಯಾನುಯಲ್ ಆಗಿ ರಚಿಸುವ ಬದಲು ನಿಮ್ಮ ಕನ್ಸ್ಟ್ರಕ್ಟರ್ (constructor) ಮೂಲಕ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾದ ಕ್ಲೈಂಟ್ ಅನ್ನು ಇಂಜೆಕ್ಟ್ (inject) ಮಾಡಿ.
ಇದನ್ನು ಮಾಡದಿದ್ದರೆ ಕೇವಲ ವಿಳಂಬ (latency) ಮಾತ್ರವಲ್ಲದೆ ಇತರ ಸಮಸ್ಯೆಗಳೂ ಉಂಟಾಗುತ್ತವೆ. ನಿಮ್ಮ ಔಟ್ಬೌಂಡ್ ಪೋರ್ಟ್ಗಳು (outbound ports) ಖಾಲಿಯಾಗಬಹುದು. ಕ್ಲೋಸ್ ಆಗಿರುವ ಕನೆಕ್ಷನ್ಗಳು ನಿಮ್ಮ OS ಅವುಗಳನ್ನು ಮರುಪಡೆಯುವ (reclaim) ವೇಗಕ್ಕಿಂತ ವೇಗವಾಗಿ TIME_WAIT ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗುತ್ತವೆ. ಇದರಿಂದ ನಿಮ್ಮ ಸೇವೆ ಹೊಸ ಸಾಕೆಟ್ಗಳನ್ನು ತೆರೆಯುವುದನ್ನೇ ಸಂಪೂರ್ಣವಾಗಿ ನಿಲ್ಲಿಸಬಹುದು.
ನಿಮ್ಮ ಕೋಡ್ನಲ್ಲಿ ಈ ತಪ್ಪನ್ನು ಪರೀಕ್ಷಿಸಿ. ನಿಮ್ಮ ಟರ್ಮಿನಲ್ನಲ್ಲಿ ಈ ಕಮಾಂಡ್ ಅನ್ನು ರನ್ ಮಾಡಿ:
grep -rn "new .*Client(" app/code | grep -i http
ಲೂಪ್ನ ಒಳಗೆ ಇರುವ ಯಾವುದೇ ಹೊಸ ಕ್ಲೈಂಟ್ ರಚನೆಯನ್ನು ಹುಡುಕಿ. ಕ್ಲೈಂಟ್ ಅನ್ನು ಲೂಪ್ನಿಂದ ಹೊರಗೆ ತನ್ನಿ. ಇದು ಕೇವಲ ಒಂದು ಸಾಲಿನ ಬದಲಾವಣೆಯಾಗಿದ್ದು, ದೊಡ್ಡ ಸಿಂಕ್ಗಳಿಗೆ (large syncs) ಭಾರಿ ವೇಗವನ್ನು ನೀಡುತ್ತದೆ.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
