ਡਿਸਟ੍ਰੀਬਿਊਟਡ ਜੌਬ ਸ਼ੈਡਿਊਲਿੰਗ ਲਈ PostgreSQL Advisory Locks
ਸਿਰਫ਼ ਜੌਬ ਸ਼ੈਡਿਊਲਿੰਗ ਲਈ ਆਪਣੇ ਸਟੈਕ ਵਿੱਚ Redis ਜਾਂ SQS ਜੋੜਨਾ ਬੰਦ ਕਰੋ।
ਇਸ ਦੀ ਬਜਾਏ ਤੁਸੀਂ PostgreSQL advisory locks ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ ਤਰੀਕਾ ਨਵੇਂ ਇਨਫਰਾਸਟ੍ਰਕਚਰ ਦੀ ਲੋੜ ਨੂੰ ਖਤਮ ਕਰ ਦਿੰਦਾ ਹੈ।
ਮੇਰੇ ਟੈਸਟਾਂ ਵਿੱਚ, ਇਹ ਸੈੱਟਅੱਪ ਇੱਕ ਸਿੰਗਲ ਡਾਟਾਬੇਸ ਇੰਸਟੈਂਸ 'ਤੇ ਪ੍ਰਤੀ ਮਿੰਟ 10,000 ਜੌਬਸ ਨੂੰ ਸੰਭਾਲ ਲੈਂਦਾ ਹੈ। ਇਹ ਅਕਸਰ ਲੈਟੈਂਸੀ (latency) ਵਿੱਚ Redis ਨੂੰ ਪਛਾੜ ਦਿੰਦਾ ਹੈ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਵਰਕਰਾਂ ਕੋਲ ਪਹਿਲਾਂ ਹੀ ਡਾਟਾਬੇਸ ਕਨੈਕਸ਼ਨ ਹੁੰਦੇ ਹਨ। ਤੁਸੀਂ ਇੱਕ ਵਾਧੂ ਨੈੱਟਵਰਕ ਹੌਪ (network hop) ਤੋਂ ਬਚ ਜਾਂਦੇ ਹੋ।
ਇਸ ਨੂੰ ਕਿਵੇਂ ਲਾਗੂ ਕਰਨਾ ਹੈ:
• ਜੌਬ ਕਲੇਮ ਕਰਨ ਲਈ pg_try_advisory_xact_lock ਦੀ ਵਰਤੋਂ ਕਰੋ।
• ਰੋਅ ਕੰਟੈਂਸ਼ਨ (row contention) ਨੂੰ ਸੰਭਾਲਣ ਲਈ FOR UPDATE SKIP LOCKED ਦੀ ਵਰਤੋਂ ਕਰੋ।
• ਲੌਕ ਲੀਕਸ (lock leaks) ਤੋਂ ਬਚਣ ਲਈ ਟ੍ਰਾਂਜੈਕਸ਼ਨਲ ਵੇਰੀਐਂਟ ਦੀ ਵਰਤੋਂ ਕਰੋ।
ਟ੍ਰਾਂਜੈਕਸ਼ਨਲ ਲੌਕਸ ਕਿਉਂ ਮਹੱਤਵਪੂਰਨ ਹਨ:
ਟ੍ਰਾਂਜੈਕਸ਼ਨਲ ਲੌਕਸ ਆਪਣੇ ਆਪ ਰਿਲੀਜ਼ ਹੋ ਜਾਂਦੇ ਹਨ ਜਦੋਂ ਕੋਈ ਟ੍ਰਾਂਜੈਕਸ਼ਨ ਕਮਿਟ (commit) ਜਾਂ ਰੋਲਬੈਕ (rollback) ਹੁੰਦੀ ਹੈ। ਇਹ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਸੂਰਤ ਵਿੱਚ ਅਨਾਧਾਰਿਤ (orphaned) ਲੌਕਸ ਨੂੰ ਰੋਕਦਾ ਹੈ। ਇਹ ਟ੍ਰਾਂਜੈਕਸ਼ਨ ਮੋਡ ਵਿੱਚ PgBouncer ਦੇ ਨਾਲ ਵੀ ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ।
ਜੇਕਰ ਤੁਸੀਂ PgBouncer ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ ਤਾਂ ਸੈਸ਼ਨ ਲੌਕਸ (session locks) ਤੋਂ ਬਚੋ। PgBouncer ਟ੍ਰਾਂਜੈਕਸ਼ਨਾਂ ਦੇ ਵਿਚਕਾਰ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਦੁਬਾਰਾ ਅਸਾਈਨ ਕਰਦਾ ਹੈ। ਇਹ ਸੈਸ਼ਨ-ਲੇਵਲ ਦੇ ਲੌਕਸ ਨੂੰ ਤੋੜ ਦਿੰਦਾ ਹੈ ਅਤੇ ਚੁੱਪਚਾਪ ਫੇਲ੍ਹ ਹੋਣ (silent failures) ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ।
ਜੇਕਰ ਤੁਹਾਨੂੰ ਸੈਸ਼ਨ ਲੌਕਸ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਆਪਣੇ ਵਰਕਰਾਂ ਲਈ ਇੱਕ ਵੱਖਰਾ ਕਨੈਕਸ਼ਨ ਪੂਲ ਬਣਾਓ। ਵੈੱਬ ਟ੍ਰੈਫਿਕ ਅਤੇ ਜੌਬ ਵਰਕਰ ਟ੍ਰੈਫਿਕ ਨੂੰ ਇੱਕੋ ਪੂਲ ਵਿੱਚ ਨਾ ਮਿਲਾਓ।
ਕੀਜ਼ (keys) ਨਾਲ ਸਕੈਲਿੰਗ:
Advisory locks ਇੱਕ bigint ਜਾਂ ਦੋ ਇੰਟੈਜਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਦੋ ਇੰਟੈਜਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਕੁਦਰਤੀ ਨੇਮਸਪੇਸਿੰਗ (namespacing) ਮਿਲਦੀ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਟੈਕਸਟ ਕੀਜ਼ ਨੂੰ bigint ਵਿੱਚ ਹੈਸ਼ ਕਰਦੇ ਹੋ, ਤਾਂ ਕੋਲੀਜ਼ਨ (collisions) ਦਾ ਧਿਆਨ ਰੱਖੋ। ਕੋਲੀਜ਼ਨ ਉਦੋਂ ਤੱਕ ਘੱਟ ਰਹਿੰਦੇ ਹਨ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ 100,000 ਵੱਖਰੀਆਂ ਲੌਕ IDs ਤੱਕ ਨਹੀਂ ਪਹੁੰਚਦੇ। ਉਸ ਤੋਂ ਅੱਗੇ, ਸੁਰੱਖਿਅਤ ਰਹਿਣ ਲਈ ਦੋ-ਇੰਟੈਜਰ ਫਾਰਮ ਦੀ ਵਰਤੋਂ ਕਰੋ।
ਸਮਝੌਤਾ (The Tradeoff):
• Advisory locks ਸਰਲਤਾ ਅਤੇ ਘੱਟ ਸੰਚਾਲਨ ਲਾਗਤ (operational cost) ਵਿੱਚ ਜਿੱਤਦੇ ਹਨ। • Redis ਰੌਅ ਥਰੂਪੁੱਟ (raw throughput) ਅਤੇ ਹੋਰੀਜ਼ੋਂਟਲ ਸਕੈਲਿੰਗ ਵਿੱਚ ਜਿੱਤਦਾ ਹੈ।
ਜ਼ਿਆਦਾਤਰ ਟੀਮਾਂ ਨੂੰ ਪ੍ਰਤੀ ਮਿੰਟ 10,000 ਤੋਂ ਵੱਧ ਜੌਬਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੁੰਦੀ। ਜੇਕਰ ਤੁਸੀਂ ਉਸ ਸੀਮਾ ਤੋਂ ਹੇਠਾਂ ਹੋ, ਤਾਂ PostgreSQL ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਡੇ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਸਾਫ਼ ਅਤੇ ਤੁਹਾਡੀਆਂ ਲਾਗਤਾਂ ਨੂੰ ਘੱਟ ਰੱਖਦਾ ਹੈ।
ਸਰੋਤ: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp