من تجربه برنامه iOS Reddit را بهتر از نسخه وب یافتم، بنابراین به فکر افتادم که بررسی کنم چگونه داده ها را با این سرعت بارگیری می کند. در اینجا حذف برنامه iOS Reddit است.
در اینجا برخی از نکات برجسته وجود دارد:
- از احراز هویت مبتنی بر توکن استفاده می کند.
- تقریباً برای همه چیز از پیکربندی و آزمایشها گرفته تا اطلاعات ارسالی از GraphQL API استفاده میکند.
- با استفاده از یک API به نام w3-reporting، عملکرد سیستم API خود را همانطور که توسط کاربران تجربه شده است، نظارت می کند.
- در بیشتر فراخوانیهای GraphQL API فقط نام عملیات بدون متغیر ارسال میشود، من فرض میکنم که آنها از میانافزار برای انتزاع پیکربندی متغیرها از front-end استفاده میکنند. یک سرویس پشتیبان در حال پر کردن اطلاعات بر اساس نام عملیات است.
- Reddit از Web Socket برای ویژگی نظرات زنده استفاده می کند.
در اینجا تجزیه و تحلیل دقیق فراخوان های API است. من از برنامه Desktop Requestly برای رهگیری برنامه iOS Reddit استفاده کردم، دستورالعملهای راهاندازی در اینجا ارائه شده است.
تکنولوژی مورد استفاده
برنامه Reddit با ایجاد شده است
- برنامه iOS Reddit از API های GraphQL برای بارگیری تمام محتوا استفاده می کند.
- احراز هویت مبتنی بر توکن برای اعتبارسنجی کاربران استفاده می شود.
- نظارت بر عملکرد با گزارش عملکرد API در انتهای کاربر.
- نظر دادن زنده با استفاده از WebSocket پشتیبانی می شود.
- پیکربندی پویا برای کنترل از راه دور رفتار برنامه بدون استقرار نسخه های جدید.
- آزمایشهای پویا برای کنترل آزمایشها از راه دور، بدون نیاز به استقرار جدید برای تغییر وضعیت آزمایش.
UX بهتر با پیش بارگیری
سوال اصلی من این بود که چگونه برنامه به این سرعت عمل می کند با بررسی پاسخ FeedPostDetailsByIds API پاسخ داده شد. این API در صفحه اصلی با شناسه پستهای نشان داده شده فراخوانی میشود و همراه با اطلاعات دقیقی است که پس از کلیک روی پست نشان داده میشود. این پیش بارگذاری پست های برتر به نمایش فوری صفحه جزئیات پست بدون هیچ بارگیری کمک کرد.
- پست های پیش بارگذاری در فید نشان داده می شوند.
- زمان پاسخگویی APIها نیز بسیار سریع است.
امنیت GraphQL APIs
پرس و جوهای GraphQL شامل داده ها و ساختار پاسخ مورد نیاز است. نام عملیات عموما اختیاری است. اکثر API های Reddit فقط نام عملیات در جستارها دارند و متغیرها فقط زمانی در دسترس هستند که متغیرها/فیلترهایی مانند فید با گزینه های داغ و آخرین پست وجود داشته باشد.
این امر به توسعه دهندگان فرانت اند کنترل کمتری می دهد تا بتوانند به طور مستقل تغییراتی ایجاد کنند، اما کنترل بیشتری بر استفاده نادرست از API ها برای واکشی داده های غیر ضروری پس از تمام API های کاربر می دهد.
آزمایش های کنترل از راه دور
اجرای آزمایشها بر روی برنامههای اصلی iOS دشوار است و برای فعال یا غیرفعال کردن آزمایشها نیاز به استقرار مجدد دارد، اما Reddit برنامه را به گونهای تنظیم کرده است که آزمایشها را میتوان از راه دور کنترل کرد. همه آزمایشها به همراه مقادیر و وضعیتهایشان در یک API بارگذاری میشوند. برنامه به طور خودکار نوع آزمایشی را که اختصاص داده است فعال می کند.
کنترل ویژگی های مبتنی بر پرچم
با این همه کاربر، آزمایش و ویژگی، بهتر است آنها را از راه دور کنترل کنید. Reddit کار بسیار خوبی برای کنترل این ویژگی ها از راه دور انجام می دهد.
در هر راه اندازی برنامه، یک API پیکربندی برای بارگیری بیش از 400 متغیر پیکربندی فراخوانی می کند. بر اساس این متغیرها، ویژگی ها و انواع مختلفی از ویژگی ها را نشان می دهد.
راز کارماس
API با نام عملیات GetTopKarmaSubreddits
فهرست زیرمجموعه های برتر را با امتیاز کارما کسب می کند. این API نشان میدهد که در هر زیر ردیت چه تعداد نظر و کارما از فعالیتهای خود به دست آوردهایم. من هرگز نتوانستم این اطلاعات را در رابط کاربری وب و موبایل Reddit پیدا کنم.
دامنه بهبود
در حین خواندن APIها برای یافتن نوع دادههایی که به ارمغان میآورد، متوجه شدم SubredditFeedElements
API فید زیر reddit انتخاب شده را بارگیری میکند، اما با هر پست، یک JSON تودرتو از اطلاعات جزئی reddit دارد. این اطلاعات اضافی هستند و می توانند برای کاهش بار شبکه API و بهبود عملکرد آن حذف شوند.
توجه: SubredditFeedElements
API اکنون با SubredditFeedSdui
API جایگزین شده و مشکل برطرف شده است.
از هوش مصنوعی برای Insights استفاده کنید
من سعی کردم از ChatGPT برای دریافت اطلاعاتی از APIها استفاده کنم. بنابراین یک فایل با تمام APIها با curl و پاسخ های آنها در آن ایجاد کرد. این فایل را در یک CustomGPT آپلود کردم تا بتوانم هر نوع درخواستی را قرار دهم. این اطلاعات بینش هایی را ارائه داد که مشهود بود مانند نوع استفاده از یک API و ساختار پاسخ، اما توهم زیادی داشت، به احتمال زیاد به دلیل تعداد زیادی API یا من متخصص در این امر نیستم. برخی از بینش های ارائه شده توسط AI:
-
GetAllExperimentVariants
API — بسیاری از آزمایشها دارای نامهای «نوعی» خاص هستند، از جمله گزینههایی مانندenabled
،variant_1
،control_model
، وone_feed_ph_bridge_new_users
. این تقسیم بندی نشان می دهد که Reddit در حال آزمایش ویژگی ها بر روی بخش های خاص کاربر برای تعیین تأثیر آنها است. به عنوان مثال، آزمایشd2x_avatar_in_comments_loggedin
دارای دو نوع است،loggedin
وloggedout
که به طور بالقوه این ویژگی را بر اساس وضعیت احراز هویت کاربر آزمایش می کند. -
GetAllExperimentVariants
API — آزمایشها شاملhybrid_video_rollout_android_v2
،active_sales
، وgql_google_maps_integration
هستند که به طیف گستردهای از تستهای ویژگی شامل عملکرد ویدیو، قرار دادن تبلیغات، بهبود رابط کاربری، و ادغام شخص ثالث اشاره میکنند. -
GetAccountDetails
API — پاسخ API حاوی فیلدهای مختلفی است که وضعیت حساب کاربر را شرح می دهد، مانندisSubredditCreationAllowed
،isNameEditable
،isPasswordSet
، و وضعیت ناظم کاربر. علاوه بر این، شاملsuspensionExpiresAt
وisSuspended
می شود که نشان می دهد یک حساب در حال حاضر به حالت تعلیق یا محدود شده است
لیست API ها
لیستی از API های GraphQL وجود دارد که من برای درک نحوه عملکرد Reddit مطالعه کردم. برخی از APIهای دیگر نیز وجود داشت، مانند احراز هویت، گزارشگیری و غیره. من آنها را در این لیست قرار ندادم.
صفحه نمایش | GraphQL API | توضیحات |
---|---|---|
صفحه اصلی | GetAllDynamicConfigs | بیش از 400 پارامتر پیکربندی را بارگیری می کند که بر اساس آنها ویژگی های مختلف برنامه کار می کند. پیکربندی در قالب مقدار کلید معمولی همراه با نوع مقدار است که می تواند JSON، float، رشته و غیره باشد. |
| GetAllExperimentVariants | درخواست حاوی اطلاعاتی درباره برنامه و دستگاه برای تخصیص آزمایشهای مربوط به دستگاه و نسخه برنامه است. پاسخ شامل فهرستی از تمام آزمایشها با شناسه، نام آزمایش، نسخه و وضعیت است. |
| GetAccount | تمام جزئیات کاربر وارد شده را بارگیری می کند. |
| HomeFeedSdui | چند پست اول را با حداقل جزئیات برای نمایش در صفحه اصلی بارگیری می کند. |
| FeedPostDetailsByIds | در صورتی که کاربر روی پست کلیک کند، پست ها را با استفاده از شناسه با تمام جزئیات بارگذاری می کند. |
| DiscoverBarRecommendations | داده های نوار را کشف کنید. |
| اشتراک UserPremium | داده های مربوط به اشتراک حق بیمه کاربر |
| GetUserAdEligibility | واجد شرایط بودن آگهی کاربر و هر اولویت را دریافت می کند. |
| BadgeCounts | اطلاعات در مورد نشان های به دست آمده توسط کاربر. |
| | |
صفحه Subreddit | SubredditChannels | همه جزئیات اساسی درباره انجمن مانند توضیحات، نمادها، شمارندهها، انواع پستهای مجاز و رنگها را بارگیری میکند. |
| SubredditTaxonomyTopics | دسته انجمن و یک متن نمایشگر را بارگیری می کند، مانند اینکه اگر انجمن را/نرم افزار بارگیری کنم، شماره 20 را در نرم افزار و برنامه ها نشان می دهد. |
| IsInvitePending | همانطور که از نام آن پیداست، دعوتنامهای در انتظار را بررسی کنید، اما مطمئن نیستید که دقیقاً کدام دعوت است. |
| SubredditChannels | کانالهای چت سابردیت را بار میکند، بسیاری از سابردیتها را بررسی کردم اما نتوانستم هیچ کدام را پیدا کنم. |
| BlockedRedditors | در صورت مسدود شدن کاربر، داده را می آورد. |
| GetModerators | لیست مدها را دریافت می کند. |
| FetchStructuredStyleAndWidgets | این API اطلاعاتی در مورد سبک، قوانین و جزئیات جامعه به ارمغان می آورد. |
| FetchRelatedCommunityRecommendations | این API جوامع مرتبط را به ارمغان می آورد. |
| Subreddit Muting | بررسی میکند که آیا Sub reddit خاموش است یا خیر. |
| SubredditFeedElements | فید sub-reddit را بارگیری می کند. فیلترها و گزینههای طرحبندی انتخابشده برای reddit فرعی را میگیرد. تمام جزئیات مربوط به پست ها را برای نمایش در فید به ارمغان می آورد. |
| PostInfoByIdComments | این درخواست فقط نظرات اولین پست را از قبل بارگذاری می کند. |
| | |
صفحه پست | GetCustomEmojisStatus | این API با شناسه sub-reddit فراخوانی شد و وضعیت ایموجی های سفارشی را در sub-reddit بارگیری می کند. دلیل نامگذاری این API خیلی واضح نیست، اما من بارها آن را دیده ام. پاسخ در تمام مواردی که آزمایش شد، |
| GetSubredditAchievementFlairsStatus | مشابه وضعیت ایموجی، شناسه زیر ردیت را می گیرد و به صورت isEnabled: false پاسخ می گیرد. هدف از این کار برای من روشن نیست. |
| PostInfoByIdComments | این API برای بارگیری نظرات پست با استفاده از شناسه پست ارسال شده در درخواست استفاده می شود. |
| CommentsPageAds | آگهی را درست بالای نظرات بارگیری می کند. |
| | |
صفحه نمایه | RedditorByName | جزئیات نمایه کاربری وارد شده را بارگیری می کند. |
| PostSetSettings | تعداد پست برای بارگذاری |
| GetTopKarmaSubreddits | فهرستی از زیرمجموعه های برتر با امتیاز کارما را در هر انجمن دریافت کنید، این API نشان می دهد که چه تعداد نظر و پست کارما از فعالیت خود در هر زیر ردیت به دست آورده ایم. |
| UserProfileFeed | فید نمایه کاربر حاوی نظرات و پستها. |
| UserPublicTrophies | فهرست دستاوردها و تروفی های کسب شده توسط نام کاربری که در درخواست ارسال شده با شناسه، نام و تصویر برای نمایش داده می شود. |
| TippingProfileMigrated | جزئیات مربوط به نمایه انعام، از این ویژگی زیاد استفاده نشده است. تو پروفایلم 0 موجودی نشون داد 😄. |
نتیجه گیری
من می خواهم در پایان این آزمایش تخریب چند نکته را بیان کنم.
- API های Reddit خیلی سریع نیستند، در عوض از پیش بارگذاری برای ارائه تجربه کاربری بهتر استفاده می کنند.
- کار API ها هرگز کامل نمی شود، حتی مهندس Reddit باید برای بهبود بیشتر آن کار انجام دهند.
- حفظ تنظیمات برنامه و آزمایش از راه دور می تواند کنترل خوبی بر تجربه کاربر داشته باشد.
- مهندسان Requestly در نشان دادن نام عملیات با هر درخواست GraphQL کار بزرگی انجام دادند و زندگی توسعه دهندگان را بسیار آسانتر کردند.