𝗖𝗼𝗺𝗽𝗮𝗰𝘁 𝗩𝗶𝗱𝗲𝗼 𝗠𝗲𝘁𝗮𝗱𝗮𝘁𝗮 𝗪𝗶𝘁𝗵 𝗣𝗿𝗼𝘁𝗼𝗯𝘂𝗳
અમારું ઇન્જેસ્ટ વર્કર (ingest worker) દર બે કલાકે હજારો ટ્રેન્ડિંગ વિડિયો મેળવે છે. અમે આ ડેટા ત્રણ સેવાઓ પર મોકલીએ છીએ: એક રેન્કિંગ સર્વિસ, એક કેશ વार्मર (cache warmer), અને એક એનાલિટિક્સ જોબ.
લાંબા સમય સુધી, અમે આ ડેટા મોકલવા માટે JSON નો ઉપયોગ કરતા હતા. જ્યાં સુધી સમસ્યા ન આવી ત્યાં સુધી તે બરાબર કામ કરતું હતું.
JSON માં એક સિંગલ વિડિયો રેકોર્ડ 2.4 KB નો હતો. 40,000 રેકોર્ડ્સને ત્રણ અલગ-અલગ સેવાઓ પર મોકલવાનો અર્થ હતો દર બે કલાકે 280 MB વધારાનો (redundant) ટેક્સ્ટ મોકલવો. આનાથી બેન્ડવિડ્થનો બગાડ થતો હતો અને અમારા PHP વર્કર્સની ઝડપ ધીમી પડી જતી હતી.
અમે Protocol Buffers (Protobuf) પર સ્વિચ કર્યું. તે શા માટે કર્યું અને તેનાથી અમારી સિસ્ટમ કેવી રીતે બદલાઈ તે અહીં છે.
JSON સાથેની ત્રણ મુખ્ય સમસ્યાઓ:
- સાઈઝ (Size): JSON દરેક રેકોર્ડમાં ફીલ્ડના નામનું પુનરાવર્તન કરે છે. "viral_score_24h" જેવું ફીલ્ડ નામ માત્ર 8-બાઇટના નંબરને વહન કરવા માટે જ 15 બાઇટ્સનો ઉપયોગ કરે છે.
- પાર્સ કોસ્ટ (Parse Cost): જો કોઈ સર્વિસને માત્ર બે ફીલ્ડની જ જરૂર હોય, તો પણ PHP એ આખા JSON બ્લોબને પાર્સ કરવો પડે છે.
- સ્કીમા ડ્રિફ્ટ (Schema Drift): JSON માં કોઈ કોન્ટ્રાક્ટ હોતો નથી. જો એક સર્વિસ કોઈ ફીલ્ડ બદલે છે, તો અન્ય સર્વિસ રનટાઇમમાં અચાનક બગડી જાય છે.
Protobuf એ આ સમસ્યા કેવી રીતે ઉકેલી:
Protobuf નામોને બદલે ફીલ્ડ નંબર્સનો ઉપયોગ કરે છે. તે 'સિંગલ સોર્સ ઓફ ટ્રુથ' તરીકે .proto ફાઇલનો ઉપયોગ કરે છે. આ ફાઇલ PHP, Python, અને Go માટે કોડ જનરેટ કરે છે. જો તમે સ્કીમા બદલો છો, તો કોડ કમ્પાઈલ થવામાં નિષ્ફળ જાય છે. આનાથી રનટાઇમ બગ્સ (runtime bugs) કમ્પાઈલ-ટાઇમ એરર્સ (compile-time errors) માં બદલાઈ જાય છે.
પરિણામો:
અમે એક અઠવાડિયા દરમિયાન આ ફેરફારો માપ્યા:
- પેલોડ સાઈઝ (Payload size): 2.4 KB થી ઘટીને 720 bytes થઈ ગઈ (70% ઘટાડો).
- PHP એન્કોડ સમય (PHP Encode time): 310 ms થી ઘટીને 95 ms થયો.
- Go ડિકોડ સમય (Go Decode time): 140 ms થી ઘટીને 38 ms થયો.
- બેન્ડવિડ્થ (Bandwidth): દરેક સાયકલ દીઠ 280 MB થી ઘટીને 84 MB થઈ ગઈ.
Protobuf નો ઉપયોગ ક્યારે કરવો:
તેનો ઉપયોગ દરેક વસ્તુ માટે કરશો નહીં. જો તમારા પેલોડ્સ નાના હોય અથવા તમારે તેને માણસો દ્વારા સરળતાથી વાંચવાની જરૂર હોય, તો JSON સાથે જ રહો. જ્યાં સ્પીડ અને કડક કોન્ટ્રાક્ટ્સ સૌથી વધુ મહત્વના હોય તેવા હાઈ-વોલ્યુમ ઇન્ટરનલ ટ્રાફિક માટે Protobuf નો ઉપયોગ કરો.
અમારી પબ્લિક APIs હજુ પણ JSON નો ઉપયોગ કરે છે. અમારી ઇન્ટરનલ સર્વિસિસ Protobuf નો ઉપયોગ કરે છે.