ડિસ્ટ્રિબ્યુટેડ જોબ શેડ્યુલિંગ માટે PostgreSQL Advisory Locks

માત્ર જોબ શેડ્યુલિંગ માટે તમારા સ્ટેકમાં Redis અથવા SQS ઉમેરવાનું બંધ કરો.

તેના બદલે તમે PostgreSQL advisory locks નો ઉપયોગ કરી શકો છો. આ અભિગમ નવી ઇન્ફ્રાસ્ટ્રક્ચરની જરૂરિયાતને દૂર કરે છે.

મારા ટેસ્ટમાં, આ સેટઅપ સિંગલ ડેટાબેઝ ઇન્સ્ટન્સ પર પ્રતિ મિનિટ 10,000 જોબ્સ હેન્ડલ કરી શકે છે. તે ઘણીવાર લેટન્સીમાં Redis ને પણ પાછળ છોડી દે છે કારણ કે તમારા વર્કર્સ પાસે પહેલેથી જ ડેટાબેઝ કનેક્શન હોય છે. તમે વધારાના નેટવર્ક હોપથી બચી શકો છો.

તેને કેવી રીતે અમલમાં મૂકવું:

• જોબ ક્લેમ કરવા માટે pg_try_advisory_xact_lock નો ઉપયોગ કરો. • રો કોન્ટેન્શન (row contention) હેન્ડલ કરવા માટે FOR UPDATE SKIP LOCKED નો ઉપયોગ કરો. • લોક લીક (lock leaks) ટાળવા માટે ટ્રાન્ઝેક્શનલ વેરિઅન્ટનો ઉપયોગ કરો.

ટ્રાન્ઝેક્શનલ લોક્સ શા માટે મહત્વપૂર્ણ છે:

જ્યારે ટ્રાન્ઝેક્શન કમિટ (commit) અથવા રોલબેક (rollback) થાય છે ત્યારે ટ્રાન્ઝેક્શનલ લોક્સ આપમેળે રિલીઝ થઈ જાય છે. જો તમારી એપ્લિકેશન ક્રેશ થાય તો આ ઓર્ફેન્ડ લોક્સ (orphaned locks) ને અટકાવે છે. તે ટ્રાન્ઝેક્શન મોડમાં PgBouncer સાથે પણ સુરક્ષિત રીતે કામ કરે છે.

જો તમે PgBouncer નો ઉપયોગ કરતા હોવ તો સેશન લોક્સ (session locks) ટાળો. PgBouncer ટ્રાન્ઝેક્શન વચ્ચે કનેક્શન ફરીથી અસાઇન કરે છે. આનાથી સેશન-લેવલ લોક્સ તૂટી જાય છે અને સાયલન્ટ ફેલ્યોર (silent failures) થાય છે.

જો તમારે સેશન લોક્સની જરૂર હોય, તો તમારા વર્કર્સ માટે અલગ કનેક્શન પૂલ બનાવો. વેબ ટ્રાફિક અને જોબ વર્કર ટ્રાફિકને એક જ પૂલમાં મિક્સ કરશો નહીં.

કીઝ (keys) સાથે સ્કેલિંગ:

Advisory locks એક bigint અથવા બે ઇન્ટિજર્સનો ઉપયોગ કરે છે. બે ઇન્ટિજર્સનો ઉપયોગ કરવાથી નેચરલ નેમસ્પેસિંગ (namespacing) મળે છે. જો તમે ટેક્સ્ટ કીઝને bigint માં હેશ કરો છો, તો કોલિઝન (collisions) પર ધ્યાન આપો. જ્યાં સુધી તમે 1,00,000 અલગ લોક ID સુધી ન પહોંચો ત્યાં સુધી કોલિઝન ઓછું રહેશે. તેનાથી આગળ વધવા માટે, સુરક્ષિત રહેવા માટે બે-ઇન્ટિજર ફોર્મનો ઉપયોગ કરો.

ટ્રેડઓફ (The Tradeoff):

• સાદગી અને ઓછા ઓપરેશનલ ખર્ચમાં Advisory locks વિજેતા છે. • રો થ્રુપુટ (raw throughput) અને હોરિઝોન્ટલ સ્કેલિંગમાં Redis વિજેતા છે.

મોટાભાગની ટીમોને પ્રતિ મિનિટ 10,000 થી વધુ જોબ્સની જરૂર હોતી નથી. જો તમે તે મર્યાદાથી નીચે હોવ, તો PostgreSQL નો જ ઉપયોગ કરો. તે તમારા આર્કિટેક્ચરને ક્લીન અને ખર્ચને ઓછો રાખશે.

સ્ત્રોત: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp