paint-brush
Prishja e aplikacionit iOS të Reddit - Vështrime mbi API-të, performancën, sigurinë dhe eksperimentet A/Bnga@hackercm3ebf0le00003b7n7h2a5k7d
Histori e re

Prishja e aplikacionit iOS të Reddit - Vështrime mbi API-të, performancën, sigurinë dhe eksperimentet A/B

nga 7m2024/11/26
Read on Terminal Reader

Shume gjate; Te lexosh

Kurioziteti im më çoi në analizën prapa skenave të funksionimit të aplikacionit Reddit iOS dhe zbuloi disa njohuri të mira rreth Reddit API-ve.
featured image - Prishja e aplikacionit iOS të Reddit - Vështrime mbi API-të, performancën, sigurinë dhe eksperimentet A/B
undefined HackerNoon profile picture
0-item

E gjeta përvojën e aplikacionit iOS të Reddit më të mirë se versioni në internet, kështu që mendova të kontrolloja se si i ngarkon të dhënat kaq shpejt. Këtu është prishja e aplikacionit iOS të Reddit.


Këtu janë disa pika kryesore:

  • Ai përdor vërtetimin e bazuar në Token.
  • Ai përdor API-të GraphQL për pothuajse gjithçka, nga konfigurimi dhe eksperimentet deri te informacionet e postimit.
  • Ai monitoron performancën e sistemit të tij API siç përjetohet nga përdoruesit e tij duke përdorur një API të quajtur w3-raportimi.
  • Në shumicën e thirrjeve të GraphQL API vetëm emri i operacionit kalohet pa variabla, unë po supozoj se ata po përdorin programin e mesëm për të abstraguar konfigurimin e variablave nga front-end. Një shërbim mbështetës po plotëson informacionin bazuar në emrin e operacionit.
  • Reddit përdor Web Socket për funksionin e komenteve të drejtpërdrejta.


Këtu është përmbysja e detajuar e thirrjeve të API. Kam përdorur aplikacionin Desktop të Requestly për të përgjuar aplikacionin iOS të Reddit, udhëzimet e konfigurimit jepen këtu .

Teknologjia e përdorur

Aplikacioni Reddit është krijuar me

  • Aplikacioni iOS i Reddit përdor GraphQL API për të ngarkuar të gjithë përmbajtjen.
  • Autentifikimi i bazuar në token përdoret për vërtetimin e përdoruesve.
  • Monitorimi i performancës duke raportuar performancën e API në fund të përdoruesit.
  • Komentimi i drejtpërdrejtë mbështetet duke përdorur WebSocket.
  • Konfigurimi dinamik për të kontrolluar në distancë sjelljen e aplikacionit pa vendosur versione të reja.
  • Eksperimentet dinamike për të kontrolluar nga distanca eksperimentet, pa nevojë për vendosje të re për të ndryshuar statusin e një eksperimenti.

UX më i mirë me ngarkim paraprak

Pyetja kryesore që kisha ishte se si aplikacioni po funksionon kaq shpejt u përgjigj pasi kontrollova përgjigjen e FeedPostDetailsByIds API. Ky API thirret në ekranin bazë me ID-të e postimeve të shfaqura dhe vjen me informacione të detajuara që shfaqen pasi klikoni postimin. Ky ngarkim paraprak i postimeve kryesore ndihmoi në shfaqjen e menjëhershme të ekranit të detajeve të postimit pa ndonjë ngarkues.


  • Postimet e ngarkimit paraprak shfaqen në furnizim.
  • Koha e përgjigjes së API-ve është gjithashtu shumë e shpejtë.

Siguria e API-ve të GraphQL

Pyetjet e GraphQL përbëhen nga të dhënat dhe struktura e përgjigjes së nevojshme. Emri i operacionit është përgjithësisht opsional. Shumica e API-ve të Reddit kanë vetëm emra operacionesh në pyetje dhe variablat janë të disponueshëm vetëm kur ka variabla/filtra në ekran si furnizimi me opsionet e postimit të nxehtë dhe më të fundit.


Kjo u jep më pak kontroll zhvilluesve të frontit për të bërë ndryshime në mënyrë të pavarur, por më shumë kontroll mbi keqpërdorimin e API-ve për të marrë të dhëna të panevojshme pas gjithë API-së së saj që përballet me përdoruesit.

Eksperimente me telekomandë

Ekzekutimi i eksperimenteve në aplikacionet origjinale të iOS është i vështirë dhe ka nevojë për ri-vendosje për të aktivizuar ose çaktivizuar eksperimentet, por Reddit e ka konfiguruar aplikacionin në atë mënyrë që eksperimentet të mund të kontrollohen nga distanca. Të gjitha eksperimentet ngarkohen në një API së bashku me vlerat dhe statuset e tyre. Aplikacioni aktivizon automatikisht variantin e eksperimentit që ka caktuar.

Kontrolli i veçorive të bazuara në flamur

Me kaq shumë përdorues, eksperimente dhe veçori, është më mirë t'i kontrollosh nga distanca. Reddit bën një punë të shkëlqyer për të kontrolluar këto veçori nga distanca.

GetAllDynamicConfigs Thirrje API siç tregohet te Kërkesa


Në çdo nisje të aplikacionit, ai do të thërrasë një API konfigurimi për të ngarkuar mbi 400 variabla të konfigurimit. Bazuar në këto variabla ai tregon veçori dhe variante të ndryshme të veçorive.

Konfiguro përgjigjen API

Sekreti i Karmas

API me emrin e operacionit GetTopKarmaSubreddits merr listën e nënrediteve kryesore me pikë karma të fituara në secilën prej tyre. Kjo API zbulon sa komente dhe karma postimesh kemi fituar nga aktiviteti ynë në çdo nën-reddit. Nuk mund ta gjeja kurrë këtë informacion brenda ndërfaqes së internetit dhe celularit të Reddit.


Karma për çdo Subreddit

Fusha e Përmirësimit

Ndërsa lexoja API-të për të gjetur llojin e të dhënave që sjell, zbulova se SubredditFeedElements API ngarkon furnizimin e nën-reddit-it të zgjedhur, por me çdo postim, ai ka një JSON të mbivendosur me informacion të detajuar nën-reddit. Ky informacion është i tepërt dhe mund të hiqet për të zvogëluar ngarkesën e rrjetit të API-së dhe për të përmirësuar më tej performancën e tij.


Shënim: SubredditFeedElements API tani është zëvendësuar nga SubredditFeedSdui API dhe problemi është rregulluar.

Përdor AI për Insights

Unë u përpoqa të përdor ChatGPT për të marrë disa njohuri nga API-të. Kështu krijoi një skedar me të gjitha API-të me kaçurrelat e tyre dhe përgjigjet e tyre në të. E ngarkova këtë skedar në një CustomGPT në mënyrë që të mund të vendos çdo lloj pyetjeje. Ai dha disa njohuri që ishin të dukshme, si lloji i përdorimit të një API dhe strukturën e përgjigjes, por kishte shumë halucinacione, ka shumë të ngjarë për shkak të shumë API-ve ose unë nuk jam ekspert në nxitje. Disa nga njohuritë e dhëna nga AI:


  1. GetAllExperimentVariants API — Shumë eksperimente kanë emra të veçantë "variante", duke përfshirë opsione si enabled , variant_1 , control_model , dhe one_feed_ph_bridge_new_users . Ky segmentim sugjeron që Reddit po teston veçori në segmente të veçanta të përdoruesve për të përcaktuar ndikimin e tyre. Për shembull, eksperimenti d2x_avatar_in_comments_loggedin ka dy variante, loggedin dhe loggedout , duke testuar potencialisht funksionin bazuar në gjendjen e vërtetimit të përdoruesit.
  2. GetAllExperimentVariants API — Eksperimentet përfshijnë hybrid_video_rollout_android_v2 , active_sales , dhe gql_google_maps_integration , të cilat tregojnë për një gamë të gjerë testesh të veçorive që mbulojnë funksionalitetin e videos, vendosjet e reklamave, përmirësimet e ndërfaqes së përdoruesit dhe integrimet e palëve të treta
  3. GetAccountDetails API — Përgjigja API përmban fusha të ndryshme që detajojnë statusin e llogarisë së përdoruesit, të tilla si isSubredditCreationAllowed , isNameEditable , isPasswordSet dhe statusin e moderatorit të përdoruesit. Për më tepër, ai përfshin suspensionExpiresAt dhe isSuspended , të cilat tregojnë nëse një llogari është aktualisht e pezulluar ose e kufizuar

Lista e API-ve

Ekziston një listë e API-ve GraphQL që kam studiuar për të kuptuar se si funksionon Reddit. Kishte edhe disa API të tjera si vërtetimi, raportimi etj. Unë nuk i përfshiva në këtë listë.

Ekrani

GraphQL API
(emri i operacionit)

Përshkrimi

Shtëpi

GetAllDynamicConfigs

Ngarkon mbi 400 parametra konfigurimi në bazë të të cilave funksionojnë veçori të ndryshme të aplikacionit. Konfigurimi është në formatin tipik të vlerës së çelësit së bashku me llojin e vlerës që mund të jetë një JSON, float, varg etj.


GetAllExperimentVariantet

Kërkesa përmban informacione rreth aplikacionit dhe pajisjes për të caktuar eksperimente të destinuara për pajisjen dhe versionin e aplikacionit. Përgjigja përmban një listë të të gjitha eksperimenteve me ID, Emri i eksperimentit, versioni dhe statusi.


GetAccount

Ngarkon të gjitha detajet e përdoruesit të regjistruar.


HomeFeedSdui

Ngarkon postimet e para me detaje minimale për t'u shfaqur në faqen kryesore.


FeedPostDetailsByIds

Parangarkon postimet duke përdorur ID me të gjitha detajet, në rast se një përdorues klikon në postim.


DiscoverBarRecommendations

Zbuloni të dhënat e shiritit.


Abonimi UserPremium

Të dhëna në lidhje me abonimin premium të përdoruesit


GetUserAdEligibility

Merr përshtatshmërinë për reklamën e përdoruesit dhe çdo preferencë.


Numri i distinktivit

Informacion në lidhje me distinktivët e fituar nga përdoruesi.




Faqja e Subreddit

SubredditChannels

Ngarkon të gjitha detajet bazë rreth komunitetit si përshkrimi, ikonat, numëruesit, llojet e lejuara të postimeve dhe ngjyrat.


SubredditTaksonomyTema

Ngarkon kategorinë e komunitetit dhe një tekst të shfaqur si p.sh. nëse ngarkoj r/softuerin e komunitetit, ai do të tregojë #20 te Software & Apps.


IsInvitePending

Siç sugjeron emri, kontrolloni për një ftesë në pritje, por nuk jeni të sigurt se cila ftesë është saktësisht.


SubredditChannels

Ngarkon kanalet e bisedës së nën-reddit, kontrollova shumë subreddit por nuk gjeta asnjë.


BlockedRedditors

Sjell të dhëna nëse përdoruesi është i bllokuar.


GetModerators

Merr listën e modaliteteve.


FetchStructuredStyleAndWidgets

Kjo API sjell informacione rreth stilit, rregullave dhe detajeve të komunitetit.


Rekomandimet e FetchRelatedCommunity

Ky API sjell komunitete të lidhura.


SubredditMuting

Kontrollon nëse sub reddit është i heshtur.


SubredditFeedElements

Ngarkon furnizimin e nën-reddit. Ai merr filtrat dhe opsionet e paraqitjes të zgjedhura për nën-reddit. Sjell të gjitha detajet rreth postimeve që do të shfaqen në furnizim.


PostInfoByIdComments

Kjo kërkesë ngarkon paraprakisht komentet e postimit të parë.




Faqja e postimit

GetCustomEmojis Status

Ky API u thirr me ID-në e nën-reddit dhe ngarkon statusin e emoji-ve të personalizuara në nën-reddit. Nuk është shumë e qartë pse quhet kjo API, por unë e kam parë atë në shumë raste. Përgjigja ishte isEnabled: false në të gjitha rastet që testoi.


GetSubredditAchievementFlairsStatus

Ngjashëm me statusin e emoji-t, ai merr id nën-reddit dhe merr një përgjigje si është Enabled: false . Qëllimi i kësaj nuk është i qartë për mua.


PostInfoByIdComments

Ky API përdoret për të ngarkuar komentet e postimit duke përdorur ID-në e postimit të kaluar në kërkesë.


Reklamat e faqeve të komenteve

Ngarkon reklamën vetëm sipër komenteve.




Faqja e profilit

RedditorByName

Ngarkon detajet e profilit të përdoruesit të identifikuar.


PostSetSettings

Numri i postimeve për t'u ngarkuar.


GetTopKarmaSubreddits

Merrni listën e subreddit-eve kryesore me pikë karma në secilin komunitet, kjo API zbulon se sa komente dhe postime karma kemi fituar nga aktiviteti ynë në çdo nën-reddit.


UserProfileFeed

Furnizimi për profilin e përdoruesit që përmban komente dhe postime.


UserPublicTrophies

Lista e arritjeve dhe trofeve të fituara nga emri i përdoruesit të kaluar në kërkesë me ID, emrin dhe imazhin që do të shfaqet.


TippingProfileMigrated

Detajet rreth profilit të bakshishit, nuk e kanë përdorur shumë këtë veçori. Tregoi bilanc 0 në profilin tim 😄.

konkluzioni

Do të doja të theksoja disa pika në përfundim të këtij eksperimenti të shkatërrimit.

  • API-të e Reddit nuk janë shumë të shpejta, përkundrazi përdorin ngarkimin paraprak për të dhënë një përvojë më të mirë të përdoruesit.
  • Puna e API-ve nuk përfundon kurrë, madje edhe inxhinierët e Reddit kanë disa punë për të bërë për ta përmirësuar atë.
  • Mbajtja e konfigurimeve të aplikacioneve dhe eksperimenteve në distancë mund të japë një kontroll të mirë mbi përvojën e përdoruesit.
  • Inxhinierët e Requestly bënë një punë të shkëlqyeshme në shfaqjen e emrit të operacionit me çdo kërkesë GraphQL, duke e bërë jetën e zhvilluesve shumë më të lehtë.