WebSockets ਨਾਲ Real-Time ਐਪਸ ਬਣਾਉਣਾ
Polling ਤੁਹਾਡੀ ਐਪ ਲਈ ਮਾੜੀ ਹੈ।
ਮੈਂ ਇੱਕ ਵਾਰ AJAX polling ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਚੈਟ ਵਿਜੇਟ ਬਣਾਇਆ ਸੀ। ਮੈਂ ਐਪ ਨੂੰ ਹਰ ਸੈਕਿੰਡ ਸਰਵਰ ਤੋਂ ਨਵੇਂ ਮੈਸੇਜ ਮੰਗਣ ਲਈ ਸੈੱਟ ਕੀਤਾ ਸੀ। ਇਹ ਕੰਮ ਤਾਂ ਕਰ ਰਿਹਾ ਸੀ, ਪਰ ਇਹ ਹੌਲੀ ਸੀ। UI ਲੈਗੀ (laggy) ਮਹਿਸੂਸ ਹੋ ਰਿਹਾ ਸੀ। ਸਰਵਰ 'ਤੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਲੋਡ ਪੈ ਰਿਹਾ ਸੀ। ਜ਼ਿਆਦਾਤਰ ਰਿਕੁਐਸਟਾਂ ਖਾਲੀ ਡੇਟਾ ਵਾਪਸ ਕਰ ਰਹੀਆਂ ਸਨ। ਇਹ ਇੱਕ ਚਮਚ ਨਾਲ ਬਾਥਟੱਬ ਭਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਵਰਗਾ ਸੀ।
WebSockets ਇਸ ਨੂੰ ਬਦਲ ਦਿੰਦੇ ਹਨ।
ਲਗਾਤਾਰ ਰਿਕੁਐਸਟਾਂ ਦੀ ਬਜਾਏ, ਤੁਸੀਂ ਇੱਕ persistent connection ਖੋਲ੍ਹਦੇ ਹੋ। ਇਹ two-way data flow ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਸਰਵਰ ਤੁਰੰਤ ਕਲਾਇੰਟ ਨੂੰ ਡੇਟਾ push ਕਰ ਸਕਦਾ ਹੈ। ਕਲਾਇੰਟ ਤੁਰੰਤ ਸਰਵਰ ਨੂੰ ਡੇਟਾ ਭੇਜ ਸਕਦਾ ਹੈ।
WebSockets ਦੀ ਵਰਤੋਂ ਕਿਉਂ ਕਰੀਏ?
• Latency ਸੌਆਂ ਮਿਲੀਸੈਕਿੰਡ ਤੋਂ ਘਟ ਕੇ ਦਸਾਂ ਮਿਲੀਸੈਕਿੰਡ ਤੱਕ ਆ ਜਾਂਦੀ ਹੈ। • ਸਰਵਰ ਲੋਡ ਅਨੁਮਾਨਿਤ (predictable) ਹੋ ਜਾਂਦਾ ਹੈ। • ਤੁਸੀਂ ਵਾਰ-ਵਾਰ ਆਉਣ ਵਾਲੇ HTTP headers ਨੂੰ ਹਟਾ ਕੇ ਬੈਂਡਵਿਡਥ ਬਚਾਉਂਦੇ ਹੋ। • ਇਹ ਚੈਟ, ਲਾਈਵ ਨੋਟੀਫਿਕੇਸ਼ਨ ਅਤੇ ਮਲਟੀਪਲੇਅਰ ਗੇਮਾਂ ਲਈ ਕੰਮ ਕਰਦਾ ਹੈ।
ਇਹ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ:
ਕਨੈਕਸ਼ਨ ਇੱਕ HTTP upgrade request ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ। ਜੇਕਰ ਸਰਵਰ ਸਹਿਮਤ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਇਹ 101 status code ਭੇਜਦਾ ਹੈ। ਉਸ ਤੋਂ ਬਾਅਦ, ਤੁਸੀਂ ਇੱਕ raw binary ਜਾਂ text protocol ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ। ਹੁਣ ਕੋਈ cookies ਜਾਂ headers ਤੁਹਾਨੂੰ ਹੌਲੀ ਨਹੀਂ ਕਰਦੇ।
ਬਚਣ ਲਈ ਆਮ ਜਾਲ (Common traps):
- Connection drops: ਨੈੱਟਵਰਕ ਫੇਲ ਹੋ ਸਕਦੇ ਹਨ। ਤੁਹਾਨੂੰ exponential backoff ਵਰਗੀ retry strategy ਲਾਗੂ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ।
- Memory leaks: ਜਦੋਂ ਕੋਈ ਯੂਜ਼ਰ ਚਲਾ ਜਾਵੇ ਤਾਂ ਹਮੇਸ਼ਾ ਆਪਣੇ sockets ਬੰਦ ਕਰ ਦਿਓ। Zombie connections ਸਰਵਰ ਦੀ ਮੈਮੋਰੀ ਖਾ ਜਾਂਦੇ ਹਨ।
- Message loops: Broadcasting ਕਰਦੇ ਸਮੇਂ, ਅਸਲ ਭੇਜਣ ਵਾਲੇ ਨੂੰ ਛੱਡ ਦਿਓ। ਨਹੀਂ ਤਾਂ, ਯੂਜ਼ਰ ਨੂੰ ਆਪਣਾ ਹੀ ਮੈਸੇਜ ਦੋ ਵਾਰ ਦਿਖਾਈ ਦੇਵੇਗਾ।
- Idle connections: ਕੁਝ proxies ਸ਼ਾਂਤ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦੀਆਂ ਹਨ। Socket ਨੂੰ ਜਿਉਂਦਾ ਰੱਖਣ ਲਈ ping/pong heartbeat ਦੀ ਵਰਤੋਂ ਕਰੋ।
ਸਰਵਰ ਨੂੰ ਇਹ ਪੁੱਛਣਾ ਬੰਦ ਕਰੋ ਕਿ ਕੀ ਕੁਝ ਬਦਲਿਆ ਹੈ। ਇੱਕ ਲਾਈਨ ਖੁੱਲ੍ਹੀ ਰੱਖਣਾ ਸ਼ੁਰੂ ਕਰੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਜਦੋਂ ਵੀ ਚਾਹੋ ਗੱਲ ਕਰ ਸਕੋ।
ਤੁਹਾਡੀ ਚੁਣੌਤੀ:
ਇੱਕ ਬੇਸਿਕ ਚੈਟ ਉਦਾਹਰਣ ਲਓ। ਇੱਕ "typing..." ਇੰਡੀਕੇਟਰ ਜੋੜੋ। ਇਸਨੂੰ Render ਜਾਂ Fly.io ਵਰਗੇ ਹੋਸਟ 'ਤੇ ਡਿਪਲਾਈ ਕਰੋ। ਇੱਕ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਉਸ ਇੰਡੀਕੇਟਰ ਨੂੰ polling ਤੋਂ ਬਿਨਾਂ real time ਵਿੱਚ ਚਲਦੇ ਹੋਏ ਦੇਖ ਲੈਂਦੇ ਹੋ, ਤਾਂ ਸਮਝੋ ਕਿ ਤੁਸੀਂ ਅਗਲੇ ਪੱਧਰ 'ਤੇ ਪਹੁੰਚ ਗਏ ਹੋ।