← bütün işlər

Booknetic SaaS

Tendir Pro

Booknetic SaaS tenant kataloqunun təməldən, premium yenidən dizaynı.

Booknetic SaaS-in daxili tenant kataloqu var: rezervasiya platformasını idarə edən adamın orada olan bütün bizneslərin siyahısını verə bildiyi səhifə — ziyarətçilər salon, klinika, studiya tapıb rezerv edə bilsin deyə. İşləyir. Amma “işləyir” ilə “platformanı satır” fərqli şeylərdir, və aralarındakı boşluq məhz Tendir Pro-nu qurduğum yerdir.

Problem

Standart kataloq dürüstdür, amma çılpaqdır. Tenantların düz siyahısı, bir axtarış xanası, vəssalam. Əgər sən rezervasiya platformasının sahibisənsə, potensial müştəri biznesini səndə yerləşdirib-yerləşdirməyəcəyinə qərar verərkən bu, ilk gördüyü şeylərdən biridir. Bu, sənin vitrinindir. Və standart vitrin verilənlər bazası çapına oxşayır, kiminsə gəzmək istəyəcəyi yerə yox.

Platforma sahiblərindən eyni reaksiyaya təkrar-təkrar rast gəlirdim: onlar bundan sakitcə utanırdılar. Booknetic SaaS üzərində real biznes qurmuşdular, pul ödəyən onlarla tenantları vardı, və bütün bu zəhmətin ictimai üzü onların link verməyə çəkindiyi bir səhifə idi. Heç kim səhər kataloq səhifəsini yenidən dizayn etmək arzusu ilə oyanmır. Sadəcə üzr istəməyəcəyi bir kataloq istəyirlər.

Tendir Pro elə budur — ana səhifənə həqiqətən qoya biləcəyin kataloq.

Nə qurdum

Üç şey, hamısı bir siyahını marketplace-ə çevirməyə yönəlik.

Yenidən dizayn edilmiş axtarış hero-su. Axtarış giriş qapısıdır, ona görə də ilk yenidən qurduğum şey o oldu. Axtarışı mərkəzə çıxaran düzgün bir hero, forma kimi yox, marketplace kimi oxunan filtrlər, və istifadəçi yazarkən ona mane olmaq əvəzinə təmiz tam yenidən yükləmə ilə yenilənən nəticələr. Tonu dərhal təyin edir: bu, cədvəl sorğuladığın yer deyil, biznes seçdiyin yerdir.

Dəyişdirilə bilən grid, list və xəritə görünüşləri. Müxtəlif adamlar müxtəlif cür gəzir. Ən yaxın klinikanı axtaran adam xəritə istəyir. Salonları müqayisə edən adam şəkillərin gözdən keçirilə bilən gridini istəyir. Təxminən nə istədiyini artıq bilən adam sıx siyahı istəyir. Ona görə də hər üçü birinci dərəcəlidir, anında dəyişdirilir, eyni nəticə dəstini paylaşır. Xüsusən xəritə görünüşü hər şeyin hissini dəyişir — birdən kataloq məkansal olur, və “yaxınımda nə var” ondan soruşulacaq açıq-aşkar sual halına gəlir.

Hər tenant biznesi üçün tam yenidən dizayn edilmiş landing səhifəsi. Ən bağlı olduğum hissə budur. Standart təcrübədə ayrıca bir biznes əslində özünə məxsus bir ev almır. Tendir Pro hər tenanta düzgün landing səhifəsi verir — xidmətlər, iş saatları, yer, media, kiminsə “rezerv et” düyməsini basmasına səbəb olan şeylər. Hər biznesi siyahıdakı bir sətirdən bir məkana çevirir.

Altdakı mühəndislik

Yük altında çökən gözəl kataloq məhsul deyil, demo-dur. Tendir Pro-nun çətin yarısı real datası olan real platformada axtarışı sürətli etmək idi, və işin çoxu da ora getdi.

Axtarış yolunu istehsalda canlı saytda profillədim — real tenantları, real açar sözləri, real trafiki olan bir kataloqda — təmiz lokal mühitin mənə həqiqəti deyəcəyinə güvənmək əvəzinə. İki şey dərhal üzə çıxdı.

Birincisi klassik N+1 idi. Nəticələrdəki hər biznes üçün kod verilənlər bazasına bir neçə dəfə qayıdırdı — yerlər, cədvəl, media, ən yaxşı xidmətlər, biznes növü, tenant qeydinin özü — beləliklə sorğu sayı nəticə sayı ilə eyni addımda çoxalırdı. On bir nəticə onlarla sorğu demək idi; otuz yeddi nəticə bunu təxminən 235-ə qaldırırdı. Bu, üç test tenantı olan noutbukunda görünməz, amma əslində uğur qazanan platformada amansız olan xərc növüdür. Kataloq nə qədər populyarlaşırdısa, bir o qədər yavaşlayırdı — o əyrinin göstərə biləcəyi ən pis istiqamət.

İkincisi axtarışın özünün join-u idi. Axtarışın arxasındakı açar söz cədvəli tam skan ilə oxunurdu, və join Block-Nested-Loop-a deqradasiya olurdu — verilənlər bazası uyğunluqlara birbaşa tullanmaq üçün indeksi olmadığından sətirləri dövrə vurub gəzirdi — qruplaşdırma da üstdən müvəqqəti cədvələ və filesort-a daşırdı. Bütün yavaş-sorğu hitləri bir ifadədə.

Keşləmənin burada məni sakitcə xilas etməməsinin struktur səbəbini adlandırmağa dəyər: bütöv bir WordPress plagin sinfi data girişini xam $wpdb sorğuları kimi işlədir, bu da WordPress obyekt keşinin yanından keçib gedir. Beləliklə saytın qarşısında oturan sürətli keş qatı olsa belə, bu oxumalar oradan verilmirdi — hər axtarış həqiqətən, hər dəfə verilənlər bazasına dəyirdi. Performans real olmalı idi, üstündən örtülmüş yox.

Düzəliş üçün riskin ən aşağı, sübutun ən təmiz olduğu yerdən başladım: hədəflənmiş indekslər. Açar söz join sütunlarına indekslər və landing səhifələrindəki status-və-tenant filtrinə uyğun kompozit indeks əlavə etdim. O cədvəllərdə dəyişiklik anında tətbiq olundu. Nəticəni yoxlamaq təmiz idi — problemli join yüzlərlə sətir üzərində Block-Nested-Loop ilə tam skandan ovuc dolusu sətirə dəyən sadə ref axtarışına keçdi, müvəqqəti cədvəl və filesort tamamilə yox oldu, və axtarış təxminən 62ms-dən təxminən 35ms-ə düşdü. Diqqətli indeks işinin bir günortası və sıfır davranış dəyişikliyi müqabilində təxminən 40% azalma. İstehsal verilənlər bazasında güvəndiyim düzəliş növü.

Qəsdən orada dayandım, və səbəbini açıq deyim: daha böyük qazanclar dəyişəcəyim kodda yaşayır, və daha riskli bir şeyə bel bağlamaqdansa bu gün aşağı riskli təkmilləşdirmə göndərməyi üstün tuturam. Təxirə salınan iş artıq xəritələnib. Birincisi, həmin sətir-bə-sətir axtarışları dövrədən əvvəl IN() sorğularına yığaraq N+1-i çökdürmək — bu, ~235 sorğunu bir onluğa qədər endirməlidir. İkincisi, normallaşdırılmış axtarış parametrlərinə əsaslanan açarla yığılmış nəticə dəstinin ətrafında transient keş — və ən vacibi, plagin daxilində əslində mənə məxsus olan keşləmə qatında, beləliklə xam-sorğu problemi ilə döyüşmürəm, onun yanından keçirəm. Tarix və əlçatanlıq axtarışı öz başına ayrı bir canavardır və ora çatanda eyni qapı-və-keş müalicəsini alacaq.

Kimin üçündür və nəticə

Tendir Pro Booknetic SaaS platforma sahibləri üçündür — rezervasiya biznesi qurmuş və footer-də gizlənmək əvəzinə ana səhifədə yerini qazanan kataloq istəyən adamlar. Nəticə müştərilərin həqiqətən gəzib rezerv etmək istədiyi bir kataloqdur: marketplace kimi hiss olunan axtarış, eyni bizneslərə baxmağın üç yolu, hər tenant üçün real landing səhifəsi, və platforma böyüyəndə uğuru cəzalandırmaq əvəzinə tab gətirən axtarış.

Dürüst desəm

Yenidən dizayn əyləncəli hissə idi; performans işi isə onu arxasında dayanacağım məhsula çevirən hissədir. Bitdiyini iddia etmirəm — indeks işi məsuliyyətli ilk addım idi, batching və keşləmə isə real, miqyaslı növbəti addımlardır, qeyri-müəyyən nə vaxtsa vədləri yox. Əmin olduğum şey onun formasıdır: olmaq istəyəcəyin yerə oxşayan, sorğu planına qədər başa düşdüyüm axtarış yolu ilə dəstəklənən bir kataloq. Adımı qoyacağım versiya budur, və elə buna görə də qoydum.

CoreLabs-da al →