ಪ್ರಾಕ್ಸಿ ಮೂಲಕ ಅಪೂರ್ಣ ಚಿತ್ರಗಳು: Netty ನ ಬರವಣಿಗೆ ಪೂರ್ಣಗೊಳ್ಳುವಿಕೆಯನ್ನು ಪರಿಶೀಲಿಸಿ
ಪ್ರಾಕ್ಸಿ ಮೂಲಕ ಚಿತ್ರಗಳು ಅಪೂರ್ಣವಾಗಿ ಬಂದಾಗ, ಅಸಿಂಕ್ರೋನಸ್ ಪ್ರತಿಕ್ರಿಯೆ ಬರವಣಿಗೆ ಪೂರ್ಣಗೊಳ್ಳುವ ಮೊದಲು ಮೂಲವು ತನ್ನ Netty ಚಾನಲ್ ಅನ್ನು ಮುಚ್ಚುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.
ಒಂದು ಚಿತ್ರವು ವೇಗದ ನೇರ ಸಂಪರ್ಕದಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ, ಆದರೆ ನಿಧಾನವಾದ ಫಾರ್ವರ್ಡ್ ಪ್ರಾಕ್ಸಿ ಮೂಲಕ ಅಪೂರ್ಣವಾಗಿರುತ್ತದೆ. ಒಂದು ಸಂಭಾವ್ಯ ಕಾರಣವೆಂದರೆ ಮೂಲವು ತನ್ನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಇನ್ನೂ ಬರೆಯುತ್ತಿರುವಾಗ ಸಂಪರ್ಕವನ್ನು ಮುಚ್ಚುತ್ತದೆ.
Netty I/O ಅಸಿಂಕ್ರೋನಸ್ ಆಗಿದೆ. writeAndFlush ನಿಂದ ಹಿಂತಿರುಗುವುದು ಆ ಕಾರ್ಯಾಚರಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಅರ್ಥವಲ್ಲ. ಆದ್ದರಿಂದ ಸರದಿಯಲ್ಲಿ ಇನ್ನೂ ಬೈಟ್ಗಳಿರುವ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಈ ಕ್ರಮ ಸುರಕ್ಷಿತವಲ್ಲ:
ctx.writeAndFlush(response);
ctx.close();
HTTP ವಿನಿಮಯವು ತನ್ನ ಕೊನೆಯ ಪ್ರತಿಕ್ರಿಯೆ ಸಂದೇಶದ ನಂತರ ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ ಮುಚ್ಚುತ್ತಿದ್ದರೆ, ಮುಚ್ಚುವಿಕೆಯನ್ನು ಆ ಬರವಣಿಗೆಯ future ಗೆ ಲಗತ್ತಿಸಿ:
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
ಈ ತುಣುಕು ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಈಗಾಗಲೇ ಸರಿಯಾಗಿ ನಿರ್ಮಿಸಿ ಚೌಕಟ್ಟಿಸಲಾಗಿದೆ ಎಂದು ಊಹಿಸುತ್ತದೆ. ಸ್ಟ್ರೀಮ್ ಮಾಡಿದ ಬಾಡಿಗೆ ಅದರ ಕೊನೆಯ ಸಂದೇಶದ ಪೂರ್ಣಗೊಳ್ಳುವಿಕೆಯನ್ನು ಬಳಸಿ, ಶೀರ್ಷಿಕೆಗಳ ಬರವಣಿಗೆಯನ್ನಲ್ಲ. ನಿರಂತರ HTTP ಸಂಪರ್ಕಕ್ಕೆ, ಪ್ರತಿಕ್ರಿಯೆ ಮುಗಿದ ಕಾರಣದಿಂದಷ್ಟೇ ಮುಚ್ಚುವಿಕೆಯನ್ನು ಸೇರಿಸಬೇಡಿ.
ಅಪ್ಲಿಕೇಶನ್ನ ಸಾಮಾನ್ಯ ದೋಷ ನಿರ್ವಹಣೆಯ ಭಾಗವಾಗಿ future ನ ವೈಫಲ್ಯವನ್ನು ಪರಿಶೀಲಿಸಿ. ಪೂರ್ಣಗೊಳ್ಳುವಿಕೆಯು ವೈಫಲ್ಯ ಮತ್ತು ರದ್ದತಿಯನ್ನು ಒಳಗೊಂಡಿದೆ, ಆದ್ದರಿಂದ ಪೂರ್ಣಗೊಳ್ಳುವಿಕೆ ಮಾತ್ರ ಬ್ರೌಸರ್ನಿಂದ ವಿತರಣಾ ರಸೀದಿ ಅಲ್ಲ.
ಉಪಯುಕ್ತ ಹೋಲಿಕೆ ಎಂದರೆ ಪ್ರತಿ ಮಾರ್ಗದಲ್ಲಿನ ಪೂರ್ಣ ಪ್ರತಿಕ್ರಿಯೆ ಉದ್ದ ಮತ್ತು ಬರವಣಿಗೆಯ ಫಲಿತಾಂಶ. ಪ್ರಾಕ್ಸಿ ಸಮಯವನ್ನು ಸಾಕಷ್ಟು ಬದಲಾಯಿಸಿ ಇರುವ ಜೀವನಚಕ್ರ ದೋಷವನ್ನು ಬಯಲು ಮಾಡಬಹುದು; ಅದರ ಇರುವಿಕೆ ಅದರ ಕಂಪ್ರೆಸರ್ ಅಥವಾ ಕ್ಯಾಶ್ ಬೈಟ್ಗಳನ್ನು ಎಸೆದಿದೆ ಎಂದು ಸಾಬೀತುಪಡಿಸುವುದಿಲ್ಲ.