Apache AGE ਨਾਲ ਗ੍ਰਾਫ-ਅਧਾਰਤ ਵੀਡੀਓ ਰਿਲੇਸ਼ਨਸ਼ਿਪ ਕੁਐਰੀਆਂ ਬਣਾਉਣਾ
ਸਾਡੀ ਸਭ ਤੋਂ ਮਹਿੰਗੀ ਕੁਐਰੀ ਇੱਕ ਸਧਾਰਨ "show related videos" ਪੈਨਲ ਸੀ।
ViralVidVault ਵਿਖੇ, ਅਸੀਂ ਵੀਡੀਓ ਟ੍ਰੈਂਡਸ ਨੂੰ ਟ੍ਰੈਕ ਕਰਦੇ ਹਾਂ। ਅਸੀਂ ਪਾਇਆ ਕਿ ਸਾਂਝੇ ਚੈਨਲਾਂ ਜਾਂ ਇਕੱਠੇ ਦੇਖੇ ਗਏ ਸੈਸ਼ਨਾਂ (co-viewed sessions) ਰਾਹੀਂ ਸੰਬੰਧਿਤ ਵੀਡੀਓ ਲੱਭਣ ਨਾਲ ਸਾਡੇ ਡਾਟਾਬੇਸ ਦੀ ਪਰਫਾਰਮੈਂਸ ਖਰਾਬ ਹੋ ਰਹੀ ਸੀ। ਅਸੀਂ ਰੀਕਰਸਿਵ ਜੁਆਇੰਸ (recursive joins) ਦੇ ਨਾਲ SQLite ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ। ਇਹ ਇੱਕ ਹੌਪ (hop) ਲਈ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ। ਦੋ ਹੌਪਸ 'ਤੇ, ਡਾਟਾ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵਧ ਗਿਆ। ਇੱਕ ਕੁਐਰੀ ਨੇ ਲੱਖਾਂ ਰੋਅ (rows) ਬਣਾ ਦਿੱਤੀਆਂ। ਸਾਡੇ ਵਰਕਰਾਂ ਦਾ ਟਾਈਮ-ਆਊਟ ਹੋਣ ਲੱਗ ਪਿਆ।
ਡਾਟਾ ਇੱਕ ਗ੍ਰਾਫ ਹੈ। ਅਸੀਂ ਇਸਨੂੰ ਟੇਬਲਾਂ ਵਿੱਚ ਫੋਰਸ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਸੀ ਅਤੇ ਇਸਦਾ ਨੁਕਸਾਨ ਉਠਾ ਰਹੇ ਸੀ।
ਅਸੀਂ ਰਿਲੇਸ਼ਨਸ਼ਿਪ ਲੇਅਰ ਨੂੰ Apache AGE 'ਤੇ ਤਬਦੀਲ ਕਰ ਦਿੱਤਾ। ਇਹ PostgreSQL ਲਈ ਇੱਕ openCypher ਐਕਸਟੈਂਸ਼ਨ ਹੈ। ਅਸੀਂ ਆਪਣੀ PHP 8.4 ਐਪ ਅਤੇ SQLite ਸਟੋਰ ਨੂੰ ਉਵੇਂ ਹੀ ਰੱਖਿਆ।
ਨਤੀਜੇ: • ਸੰਬੰਧਿਤ ਪੈਨਲ ਦੀ ਲੇਟੈਂਸੀ (latency) 900ms ਤੋਂ ਘਟ ਕੇ 40ms ਤੋਂ ਵੀ ਘੱਟ ਹੋ ਗਈ। • ਗੁੰਝਲਦਾਰ ਟੂ-ਹੌਪ ਟ੍ਰੈਵਰਸਲ (two-hop traversals) ਹੁਣ ਸਿੰਗਲ-ਡਿਜੀਟ ਮਿਲੀਸੈਕਿੰਡ ਲੈਂਦੇ ਹਨ। • ਸਾਡਾ ਓਪਰੇਸ਼ਨਲ ਵਰਕਲੋਡ ਉਨਾ ਹੀ ਰਿਹਾ ਕਿਉਂਕਿ AGE, Postgres ਦੇ ਅੰਦਰ ਚੱਲਦਾ ਹੈ।
ਇੱਕ ਸਟੈਂਡਅਲੋਨ ਗ੍ਰਾਫ ਡਾਟਾਬੇਸ ਦੀ ਬਜਾਏ Apache AGE ਦੀ ਵਰਤੋਂ ਕਿਉਂ ਕਰੀਏ?
ਓਪਰੇਸ਼ਨਲ ਸਿਮਪਲਿਸੀਟੀ (Operational Simplicity) ਤੁਹਾਨੂੰ ਬੈਕਅੱਪ ਲੈਣ ਜਾਂ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ ਕਿਸੇ ਨਵੇਂ ਡਾਟਾਬੇਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। AGE ਤੁਹਾਡੇ ਮੌਜੂਦਾ Postgres ਸੈੱਟਅੱਪ, ਕਨੈਕਸ਼ਨ ਪੂਲਸ ਅਤੇ ਸੁਰੱਖਿਆ ਨਿਯਮਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ।
ਨੇਟਿਵ ਗ੍ਰਾਫ ਕੁਐਰੀਆਂ (Native Graph Queries) SQL ਵਿੱਚ, ਵੇਰੀਏਬਲ-ਲੈਂਥ ਪਾਥਸ (variable-length paths) ਲਈ ਗੁੰਝਲਦਾਰ ਰੀਕਰਸ਼ਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। Cypher ਵਿੱਚ, ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਸਧਾਰਨ ਪੈਟਰਨਾਂ ਵਜੋਂ ਲਿਖਦੇ ਹੋ। 40-ਲਾਈਨਾਂ ਵਾਲਾ ਰੀਕਰਸਿਵ SQL ਬਲਾਕ ਇੱਕ 6-ਲਾਈਨਾਂ ਵਾਲੀ Cypher ਕੁਐਰੀ ਬਣ ਗਿਆ।
ਬਿਹਤਰ ਪਰਫਾਰਮੈਂਸ (Better Performance) ਇੱਕ ਗ੍ਰਾਫ ਇੰਜਣ ਐਡਜੇਸੈਂਸੀ (adjacency) ਨੂੰ ਇੰਡੈਕਸ ਕਰਦਾ ਹੈ। ਇਹ ਉਹਨਾਂ ਪਾਥਸ ਨੂੰ ਵਧਾਉਣ ਤੋਂ ਰੋਕਦਾ ਹੈ ਜੋ ਮੈਚ ਨਹੀਂ ਕਰਦੇ। ਇਹ ਡਾਟਾ ਫੈਨ-ਆਊਟ (data fan-out) ਨੂੰ ਰੋਕਦਾ ਹੈ ਜਿਸ ਨੇ ਸਾਡੇ ਪਿਛਲੇ ਸਿਸਟਮ ਨੂੰ ਕਰੈਸ਼ ਕਰ ਦਿੱਤਾ ਸੀ।
ਸਾਡੇ ਮਾਈਗ੍ਰੇਸ਼ਨ ਤੋਂ ਇੱਕ ਮੁੱਖ ਸਬਕ: ਹਮੇਸ਼ਾ ਆਪਣੀਆਂ ਐਂਟਰੀਪੁਆਇੰਟ ਪ੍ਰੋਪਰਟੀਜ਼ (entrypoint properties) ਨੂੰ ਇੰਡੈਕਸ ਕਰੋ। ਜੇਕਰ ਤੁਸੀਂ ਟ੍ਰੈਵਰਸਲ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ID ਨੂੰ ਇੰਡੈਕਸ ਨਹੀਂ ਕਰਦੇ ਹੋ, ਤਾਂ AGE ਫੁੱਲ ਸਕੈਨ (full scan) ਕਰੇਗਾ। ਇਹ ਸਭ ਤੋਂ ਵਧੀਆ ਗ੍ਰਾਫ ਕੁਐਰੀ ਨੂੰ ਵੀ ਸੁਸਤ ਬਣਾ ਦਿੰਦਾ ਹੈ।
ਅਸੀਂ ਗ੍ਰਾਫ ਨੂੰ ਰੀਡ ਮਾਡਲ (read model) ਵਜੋਂ ਵਰਤਦੇ ਹਾਂ। ਸਾਡਾ ਰਅਅ ਡਾਟਾ (raw data) SQLite ਵਿੱਚ ਰਹਿੰਦਾ ਹੈ। ਅਸੀਂ ਦੋਵਾਂ ਨੂੰ ਸਿੰਕ ਕਰਨ ਲਈ ਇੱਕ Python ਸਕ੍ਰਿਪਟ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਾਂ। ਇਹ ਸਾਡੇ ਗ੍ਰਾਫ ਨੂੰ ਤੇਜ਼, ਹਲਕਾ ਅਤੇ ਮੁੜ ਬਣਾਉਣ ਵਿੱਚ ਆਸਾਨ ਰੱਖਦਾ ਹੈ।
ਜੇਕਰ ਤੁਹਾਡੀਆਂ ਰੀਕਰਸਿਵ SQL ਕੁਐਰੀਆਂ ਬਹੁਤ ਗੁੰਝਲਦਾਰ ਹੁੰਦੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ, ਤਾਂ ਰਿਲੇਸ਼ਨਲ ਮਾਡਲ ਨਾਲ ਲੜਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਨਾ ਕਰੋ। ਆਪਣੇ ਮੌਜੂਦਾ ਸਟੋਰ ਦੇ ਨਾਲ ਇੱਕ ਛੋਟਾ ਗ੍ਰਾਫ ਪ੍ਰੋਜੈਕਸ਼ਨ ਬਣਾਓ।
