Zjistil jsem, že aplikace Reddit pro iOS je lepší než webová verze, takže mě napadlo zkontrolovat, jak rychle načítá data. Zde je zrušení aplikace Reddit pro iOS.
Zde jsou některé důležité body:
- Používá autentizaci založenou na tokenech.
- Využívá rozhraní GraphQL API pro téměř vše od konfigurace a experimentů po zveřejňování informací.
- Monitoruje výkon svého systému API, jak jej zažívají jeho uživatelé, pomocí rozhraní API s názvem w3-reporting.
- Ve většině volání GraphQL API je předán pouze název operace bez proměnných, předpokládám, že používají middleware k abstrahování konfigurace proměnných z front-endu. Backendová služba vyplňuje informace na základě názvu operace.
- Reddit používá Web Socket pro funkci živých komentářů.
Zde je podrobný popis volání API. K zachycení aplikace Reddit pro iOS jsem použil desktopovou aplikaci Requestly , pokyny k nastavení jsou uvedeny zde .
Použitá technologie
Aplikace Reddit je vytvořena pomocí
- Aplikace Reddit pro iOS používá k načtení veškerého obsahu rozhraní GraphQL API.
- K ověřování uživatelů se používá autentizace založená na tokenech.
- Sledování výkonu hlášením výkonu API na straně uživatele.
- Živé komentování je podporováno pomocí WebSocket.
- Dynamická konfigurace pro vzdálené ovládání chování aplikace bez nasazování nových verzí.
- Dynamické experimenty pro vzdálené ovládání experimentů, které nevyžadují nové nasazení ke změně stavu experimentu.
Lepší uživatelské rozhraní s preloadingem
Hlavní otázka, kterou jsem měl, byla, jak aplikace funguje tak rychle, byla zodpovězena při kontrole odpovědi FeedPostDetailsByIds API. Toto API se volá na domovské obrazovce s ID zobrazených příspěvků a přichází s podrobnými informacemi, které se zobrazí po kliknutí na příspěvek. Toto předběžné načtení horních příspěvků pomohlo k okamžitému zobrazení obrazovky s podrobnostmi příspěvku bez jakéhokoli nakladače.
- Předběžné načítání příspěvků se zobrazuje ve zdroji.
- Doba odezvy API je také velmi rychlá.
Zabezpečení rozhraní GraphQL API
Dotazy GraphQL se skládají z dat a struktury potřebné odpovědi. Název operace je obecně volitelný. Většina rozhraní Reddit API má v dotazech pouze názvy operací a proměnné jsou dostupné pouze tehdy, když jsou na obrazovce proměnné/filtry, jako je zdroj s horkými a nejnovějšími možnostmi příspěvků.
To poskytuje vývojářům frontendu menší kontrolu, aby mohli provádět změny nezávisle, ale větší kontrolu nad zneužitím rozhraní API k načítání nepotřebných dat po všech jeho rozhraních API pro uživatele.
Dálkově ovládané experimenty
Spouštění experimentů na nativních aplikacích pro iOS je obtížné, je třeba je znovu nasadit, aby bylo možné experimenty povolit nebo zakázat, ale Reddit nastavil aplikaci takovým způsobem, že experimenty lze ovládat na dálku. Všechny experimenty se načítají do rozhraní API spolu s jejich hodnotami a stavy. Aplikace automaticky aktivuje variantu experimentu, kterou přiřadila.
Ovládání funkcí na základě příznaku
S tolika uživateli, experimenty a funkcemi je lepší je ovládat na dálku. Reddit odvádí skvělou práci při ovládání těchto funkcí na dálku.
Při každém spuštění aplikace zavolá konfigurační API pro načtení více než 400 konfiguračních proměnných. Na základě těchto proměnných ukazuje různé rysy a varianty vlastností.
Tajemství karmy
API s názvem operace GetTopKarmaSubreddits
získá seznam nejlepších subredditů s karma body získanými v každém z nich. Toto API odhaluje, kolik komentářů a post karmy jsme získali z naší činnosti v každém dílčím redditu. Tyto informace jsem nikdy nemohl najít ve webovém a mobilním uživatelském rozhraní Reddit.
Rozsah vylepšení
Při čtení rozhraní API, abych zjistil, jaký typ dat přináší, jsem zjistil, že SubredditFeedElements
API načítá zdroj vybraného sub-redditu, ale s každým příspěvkem má vnořený JSON s podrobnými informacemi o sub-reddit. Tyto informace jsou nadbytečné a lze je odstranit, aby se snížilo zatížení sítě API a dále se zlepšil jeho výkon.
Poznámka: SubredditFeedElements
API je nyní nahrazeno SubredditFeedSdui
API a problém je vyřešen.
Použijte AI pro statistiky
Zkusil jsem použít ChatGPT, abych získal nějaké postřehy z API. Vytvořil tedy soubor se všemi API s jejich curl a jejich odpověďmi v něm. Nahrál jsem tento soubor do CustomGPT, abych mohl zadat jakýkoli typ dotazu. Poskytlo to několik poznatků, které byly zřejmé, jako jaký typ použití by API mohlo mít a strukturu odpovědi, ale hodně to halucinovalo, s největší pravděpodobností kvůli spoustě API nebo nejsem odborník na nabádání. Některé poznatky poskytnuté AI:
-
GetAllExperimentVariants
API – Mnoho experimentů má specifické názvy „variant“, včetně možností jakoenabled
,variant_1
,control_model
aone_feed_ph_bridge_new_users
. Tato segmentace naznačuje, že Reddit testuje funkce na konkrétních uživatelských segmentech, aby zjistil jejich dopad. Například experimentd2x_avatar_in_comments_loggedin
má dvě varianty,loggedin
aloggedout
, které potenciálně testují funkci na základě stavu ověření uživatele. -
GetAllExperimentVariants
API – Experimenty zahrnujíhybrid_video_rollout_android_v2
,active_sales
agql_google_maps_integration
, které poukazují na širokou škálu testů funkcí zahrnujících funkce videa, umístění reklam, vylepšení uživatelského rozhraní a integrace třetích stran. -
GetAccountDetails
API — Odpověď API obsahuje různá pole s podrobnostmi o stavu účtu uživatele, jako jeisSubredditCreationAllowed
,isNameEditable
,isPasswordSet
a stav moderátora uživatele. Kromě toho zahrnujesuspensionExpiresAt
aisSuspended
, které udávají, zda je účet aktuálně pozastaven nebo omezen.
Seznam API
Existuje seznam GraphQL API, které jsem studoval, abych pochopil, jak funguje Reddit. Existovala některá další API, stejně jako autentizace, reporting atd. Nezahrnul jsem je do tohoto seznamu.
Obrazovka | GraphQL API | Popis |
---|---|---|
Domov | GetAllDynamicConfigs | Načte více než 400 konfiguračních parametrů, na základě kterých fungují různé funkce aplikace. Konfigurace je v typickém formátu klíčové hodnoty spolu s typem hodnoty, kterou může být JSON, float, řetězec atd. |
| GetAllExperimentVariants | Požadavek obsahuje informace o aplikaci a zařízení k přiřazení experimentů určených pro zařízení a verzi aplikace. Odpověď obsahuje seznam všech experimentů s id, název experimentu, verze a stav. |
| GetAccount | Načte všechny podrobnosti o přihlášeném uživateli. |
| HomeFeedSdui | Načte prvních několik příspěvků s minimálními podrobnostmi, které se zobrazí na domovské stránce. |
| FeedPostDetailsByIds | Předem načte příspěvky pomocí ID se všemi podrobnostmi pro případ, že uživatel na příspěvek klikne. |
| DiscoverBarRecommendations | Objevte data lišty. |
| Předplatné UserPremium | Údaje související s uživatelským prémiovým předplatným |
| GetUserAdEligibility | Získá způsobilost uživatele pro reklamy a případné preference. |
| BadgeCounts | Informace o odznakech, které uživatel získal. |
| | |
Stránka Subreddit | SubredditChannels | Načte všechny základní podrobnosti o komunitě, jako je popis, ikony, počítadla, povolené typy příspěvků a barvy. |
| SubredditTaxonomyTopics | Načte kategorii komunity a zobrazí text, jako když načtu komunitu r/software, zobrazí se #20 v Software & Apps. |
| IsInvitePending | Jak název napovídá, zkontrolujte nevyřízenou pozvánku, ale nejste si jisti, která pozvánka přesně. |
| SubredditChannels | Načte chatovací kanály sub-redditu, zkontroloval jsem mnoho subredditů, ale žádné jsem nenašel. |
| BlockedRedditors | Přináší data, pokud je uživatel blokován. |
| GetModerators | Získá seznam modů. |
| FetchStructuredStyleAndWidgets | Toto API přináší informace o stylu, pravidlech a detailech komunity. |
| FetchRelatedCommunityRecommendations | Toto API přináší související komunity. |
| SubredditMuting | Zkontroluje, zda je sub reddit ztlumený. |
| SubredditFeedElements | Načte zdroj sub-reddit. Přebírá možnosti filtrů a rozložení vybrané pro dílčí reddit. Přináší všechny podrobnosti o příspěvcích, které se mají zobrazit ve zdroji. |
| Komentáře PostInfoById | Tento požadavek předem načte pouze komentáře prvního příspěvku. |
| | |
Stránka příspěvku | GetCustomEmojisStatus | Toto API bylo voláno s id sub-reddit a načítá stav vlastních emotikonů na sub-reddit. Není příliš jasné, proč se toto API nazývá, ale viděl jsem to při mnoha příležitostech. Odpověď byla |
| GetSubredditAchievementFlairsStatus | Podobně jako stav emotikonu převezme sub-reddit id a dostane odpověď isEnabled: false . Účel toho mi není jasný. |
| Komentáře PostInfoById | Toto rozhraní API se používá k načtení komentářů k příspěvku pomocí ID příspěvku předaného v požadavku. |
| CommentsPageAds | Načte reklamu těsně nad komentáře. |
| | |
Stránka profilu | RedditorByName | Načte detaily profilu přihlášeného uživatele. |
| PostSetSettings | Počet příspěvků k načtení. |
| GetTopKarmaSubreddits | Získejte seznam nejlepších subredditů s body karmy v každé komunitě, toto API odhaluje, kolik komentářů a post karmy jsme získali z naší aktivity v každém sub-redditu. |
| UserProfileFeed | Zdroj pro uživatelský profil obsahující komentáře a příspěvky. |
| UserPublicTrophy | Seznam úspěchů a trofejí získaných uživatelským jménem předaným v žádosti s ID, jménem a obrázkem, které se mají zobrazit. |
| TippingProfileMigred | Podrobnosti o profilu sklápění, tuto funkci jsem příliš nevyužíval. Na mém profilu to ukazovalo 0 zůstatek 😄. |
Závěr
Na závěr tohoto experimentu bych rád uvedl několik poznámek.
- Rozhraní API Redditu nejsou příliš rychlá, místo toho používají předběžné načítání, aby poskytovaly lepší uživatelský zážitek.
- Práce s rozhraními API není nikdy dokončena, dokonce i inženýr Reddit má co dělat, aby ji dále vylepšil.
- Udržování konfigurací aplikací a experimentů na dálku může poskytnout dobrou kontrolu nad uživatelským zážitkem.
- Inženýři společnosti Requestly odvedli skvělou práci při zobrazování názvu operace s každým požadavkem GraphQL, což vývojářům výrazně usnadnilo život.