Kisah Gurita



Ketika Anda mencari produk di Internet, Anda sering ingin mempersempit permintaan Anda sehingga hasil pencarian menjadi lebih relevan. Apakah itu warna T-shirt, jenis girboks mobil, jumlah port USB di laptop, atau area dapur di apartemen yang diinginkan.

Hampir sejak awal pekerjaan Yula, kami memiliki sistem bidang datar, yang memberikan kemampuan untuk memperbaiki permintaan. Artinya, dalam bentuk membuat dan mencari barang, tersedia bidang pilihan sederhana yang memungkinkan Anda untuk menyimpan produk dengan parameter tambahan, dan kemudian mencarinya.

Sebagai pengembangan dan penaklukan puncak baru, Yulia membutuhkan sistem baru yang akan memungkinkan Anda untuk membuat pohon lapangan, dengan entri manual, pemilihan nilai dan bahkan mendapatkan bidang baru, tergantung pada opsi yang dipilih sebelumnya. Dan sebagai pendewaan, diperlukan untuk membuat sistem sederhana untuk mengelola semua ini melalui panel admin.

Bagian satu: "Cthulhu, ayo"


Kami mulai memecahkan masalah ini. Menganalisis opsi yang memungkinkan, kami terus-menerus dihadapkan dengan fakta bahwa konsep "lapangan", "presentasi" dan sebagainya, berpotongan dengan fungsi yang ada, yang menyesatkan lawan bicara. Rekan kami, yang mengusulkan cara radikal untuk memisahkan biji-bijian dari sekam, menyelamatkan kami dari kebingungan ini - sebut saja semuanya "Gurita".

Kenapa Gurita? Karena semuanya terdengar seperti gurita. Gurita adalah sistem bidang umum yang menjelaskan:

  • platform mana untuk menampilkan bidang;
  • jenis presentasi apa yang bertanggung jawab atas skema (pembuatan produk, filter, tampilan kartu, dan sebagainya).

Gurita memiliki tentakel, atau tentakel (hussars, be silent!) - itulah yang kami sebut cabang-cabang pohon, yang menggambarkan bagaimana bidang-bidang tertentu harus ditampilkan dalam formulir. Itu bisa:

  • bidang input;
  • bidang pilihan
  • pengelompokan lapangan;
  • bidang teks.

Sesuatu seperti markup HTML, di mana terdapat tag, dan tag memiliki parameter dan nilai yang dimasukkan atau dipilih pengguna dari daftar yang telah ditentukan.

Mereka yang "untuk" dan "menentang" nama Gurita kira-kira terbagi rata, tetapi setelah beberapa waktu setelah peluncuran sistem, menjadi jelas bahwa, berkat nama ini, semua orang segera mengerti dengan jelas apa yang sedang dibahas.

Bagian dua: struktur


Kami membiarkan makhluk air menjadi nama sistem baru kami, tetapi tidak semuanya dibiarkan terkoyak oleh penguasa laut, ada tempat untuk penunjukan yang lebih klasik. Saya akan mencantumkan semua elemen:

  • Gurita - bertanggung jawab atas struktur secara keseluruhan.
  • Tentakel - menguraikan tampilan setiap cabang individu. Bidang widget diteruskan ke klien, yang menunjukkan cara menampilkan bidang.
  • Atribut - menyimpan nilai yang dimasukkan.
  • Kamus - berisi daftar nilai yang mungkin untuk dipilih dari daftar.
  • Tag - berisi nilai yang dapat dipilih dari daftar.
  • Parameter - atribut atau tentakel dapat dilengkapi dengan berbagai parameter untuk validasi dan respons pelanggan.
  • Dependensi - struktur yang menggambarkan respons dari satu bidang ke pilihan bidang lain.

Pelanggan yang menerima Octopus dapat menggambar halaman untuk membuat atau mengedit produk atau pencarian sesuai dengan struktur yang dijelaskan di atas. Setelah mengisi, data disimpan oleh backend dan dikirim ke pencarian untuk pengindeksan, yang memungkinkan editor dengan cepat membuat bidang baru dan segera menggunakannya dalam pencarian.

Bagian Tiga: Presentasi


Di sini kita tidak berbicara tentang pertunjukan di sirkus, di mana gurita bertepuk tangan dan menakuti penonton dengan kerumitan dan prosedur air (yang menarik, apakah ada sirkus seperti itu?). Saya akan berbicara tentang bagaimana Gurita kita muncul dalam kehidupan klien.

Seperti disebutkan di atas, setiap skema bidang (Gurita) memiliki seperangkat parameter yang menunjukkan tindakan apa yang dimiliki skema ini dan kepada siapa harus menunjukkannya. Misalnya, aplikasi Android meminta backend untuk skema filter pencarian untuk bagian Lemari Pakaian Wanita. Jika database memiliki skema yang cocok untuk parameter yang ditentukan, backend mengembalikannya, dan pengguna melihat bidang "warna" dan "ukuran sepatu".

Bagaimana ini diterapkan?

Editor di panel admin membuat skema Octopus baru, yang menunjukkan bahwa itu ditujukan untuk jenis aplikasi klien tertentu (iOS, Android, web atau untuk semua jenis), bahwa skema ini berisi bidang untuk ditampilkan pada halaman pencarian, dan yang paling penting - skema terlampir pada kategori barang tertentu.

Lebih lanjut, ketika pengguna memasuki pencarian di aplikasi mobile, klien meminta tata letak lapangan dari backend, dengan mempertimbangkan bahwa itu adalah Android, kategori "Lemari pakaian wanita" ditunjukkan, dan skema seharusnya untuk tampilan "Pencarian".

Bagian Empat: Cari


Pengguna dalam aplikasi memasukkan nilai untuk iklannya, klien memeriksanya sesuai dengan aturan skema dan mengirimkannya ke backend. Dia memeriksa ulang semuanya dan menyimpannya dengan aman. Sekarang iklan akan ditampilkan kepada pembeli dengan set lengkap bidang. Tetapi ini tidak cukup, karena itu perlu agar iklan dapat ditemukan oleh pembeli.

Untuk melakukan ini, kami mengirim semua atribut yang datang dengan iklan ke pencarian kami, di mana data diindeks, yang memungkinkan Anda untuk langsung menemukan iklan dengan parameter yang ditentukan. Editor dapat membuat bidang baru di panel admin Gurita kapan saja, dan pengguna dapat langsung menggunakannya saat membuat iklan atau mencari.

Bagian Kelima: Integrasi


Mitra B2B bekerja dengan Yulia untuk berbagi database iklan mereka dengan kami untuk memperluas jangkauan mereka. Misalnya, jika kami bekerja sama dengan mitra mobil, maka ada sejumlah besar bidang untuk setiap iklan di layanan eksternal. Bagaimana cara membuat basis data iklan mobil teman dengan Gurita kami? Jawabannya sederhana - menggunakan pemetaan; atau, jika mitra diverifikasi, kami dapat memungkinkan Anda untuk langsung membuat bidang dalam sistem kami.

Melalui Kafka kami mengatur saluran komunikasi dengan mitra dan mendapatkan:

  • memperbarui tata letak lapangan untuk produk mitra;
  • barang sendiri dan manipulasi dengannya.

Sebelum memulai integrasi, kami akan mencari tahu format data mana yang akan dikirimkan kepada kami dan jenis bidang apa yang akan kami terima. Setelah sebelumnya menciptakan kondisi untuk pemetaan di bidang kami dalam kode, kami mendapatkan skema mitra dan memetakannya. Anda bisa membuat bidang baru atau memetakan ke yang sudah ada. Setelah pemetaan berhasil, kami dapat menerima barang dan semua bidang akan dibuat di Gurita kami. Di masa depan, jika mitra tiba-tiba mengubah skema, partisipasi kami tidak akan diperlukan.

Bagian Enam: Masalah


Dengan semua kelebihan Octopus, kami juga menemui beberapa kesulitan. Jika entitas individual di-cache di Redis, lalu bagaimana dengan keseluruhan skema? Setiap kali, menghasilkan sangat mahal, dan menyimpan sirkuit yang lebih besar dalam cache bermasalah. Selain itu, kita perlu mengubah skema ketika bidang dependen ikut bermain.

Kami memutuskan untuk membagi skema backend Octopus menjadi dua tahap:

  • Mendapatkan pohon abadi, yang kami masukkan ke cache lokal, diperbarui di latar belakang setiap n menit.
  • Manipulasi cabang: melengkapi pohon dengan dependensi dan membangun respons tanpa cache.

Pendekatan ini memecahkan masalah cache, dan waktu pengembalian bidang diminimalkan.

Bagian Tujuh: Tes A / B


Dalam dunia makanan modern, tempat tanpa menguji fitur produk. Tes A / B tidak memotong Octopus. Tugas telah ditetapkan: untuk mengukur tingkat hunian bidang dalam kategori tertentu, dengan mempertimbangkan jumlah dan variabilitas nilai yang berbeda. Karena fleksibilitas rangkaian, pelaksanaan tes semacam itu tidak memerlukan banyak waktu, dan fungsionalitas dioperasikan sesegera mungkin.

Bagaimana kami melakukan ini?

Pada tingkat koneksi Octopus dengan kategori produk, kami membuat tes untuk memasuki percobaan. Dalam kasus positif, Octopus lain diberikan dan pengguna melihat kumpulan bidang yang berbeda.

Kami juga memperkenalkan tes A / B di tingkat Gurita lainnya: dalam tentakel dan kamus.

Bagian delapan: di mana lagi untuk mendaftar?


Di Julia, Gurita digunakan tidak hanya untuk mengisi kartu produk dan mencarinya. Skema gurita memungkinkan Anda untuk melampirkannya ke entitas sistem apa pun, dan saat ini, gurita digunakan dalam akun pribadi pengguna dan dalam pengiriman barang.

Bagian Sembilan: Sebuah Contoh


Kata-kata adalah kata-kata, tetapi tanpa contoh agak sulit untuk dipahami. Mari kita jelaskan dengan jari. Ambil struktur bidang untuk membuat produk di bagian "Real Estat".

Contoh JSON dari kategori Apartemen dijual - Parameter apartemen
 { "title":" ", "widget":"group", "order":17, "params":{ "required":false }, "subfields":[ { "title":"", "widget":"section", "order":18, "params":{ "required":false }, "subfields":[ { "title":"  ", "widget":"select", "order":19, "slug":"komnat_v_kvartire", "type":"tag_id", "attribute_id":1374, "values":[ { "id":1, "value":"1 ", "order":1 }, { "id":2, "value":"2 ", "order":2 }, { "id":3, "value":" ", "order":3 }, { "id":4, "value":"", "order":4 } ], "params":{ "required":true } }, { "title":"", "widget":"input_int", "order":20, "slug":"realty_etaj", "type":"int", "attribute_id":1543, "params":{ "required":true, "min_value":1, "max_value":500 } } ] }, { "title":"", "widget":"section", "order":21, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":22, "slug":"realty_obshaya_ploshad", "type":"float", "attribute_id":1541, "params":{ "required":true, "unit":"²", "min_value":1, "max_value":100000 } } ] }, { "title":"", "widget":"section", "order":25, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":25, "slug":"building_flat_ceiling_height", "type":"float", "attribute_id":1518, "params":{ "required":false, "min_value":1, "max_value":10, "unit":"" } } ] } ] } 


Pohon itu menunjukkan fragmen diagram bidang untuk mengirimkan iklan dalam kategori "Apartemen dijual". Menurut skema ini, klien dapat menggambar UI untuk pengguna, mengelompokkan bidang ke dalam kelompok yang berbeda, memvalidasi nilai yang dimasukkan, dan mengirimkannya ke backend untuk disimpan. Mari kita pertimbangkan lebih detail.

Tentakel dapat bersarang di dalam satu sama lain, dan agar klien memahami apa dan bagaimana menampilkan, kami memperkenalkan properti widget , yang memberi tahu klien apa yang ingin kami perlihatkan di tempat ini: pengelompokan bidang, blok teks, indentasi atau bidang yang lengkap.


Bagian Sepuluh: Dependensi Gurita


Dalam beberapa kasus, Anda tidak dapat menampilkan semua nilai yang mungkin muncul di beberapa bidang pilih sekaligus dalam satu formulir. Misalnya, jika kita berbicara tentang mobil, maka menempatkan formulir dengan semua merek dan model pada satu layar akan sangat merepotkan bagi pengguna, bahkan dengan mempertimbangkan penggunaan widget pencarian dan trik lainnya.

Untuk mengatasi masalah ini, kami menerapkan sistem ketergantungan yang memungkinkan kami untuk menunjukkan di backend bidang mana yang harus ditampilkan dalam tentakel tergantung pada nilai yang sebelumnya dipilih oleh pengguna di bidang lain.

Contoh: pengguna memasuki penjualan mobil, memilih merek BMW, dan di bidang Model hanya model-model yang termasuk merek ini yang muncul.

Diimplementasikan seperti ini:

  • klien menerima peta bidang;
  • untuk bidang-bidang yang memengaruhi pembentukan skema, sebuah bendera khusus ditentukan oleh klien, ketika memilih nilai, meminta kembali skema dan mengirimkan nilai ini ke backend;
  • pengguna memilih bidang, klien mengirim permintaan untuk backend;
  • backend mencari melalui sistem dependensi apakah ada bidang terkait untuk nilai yang ditentukan, dan jika demikian, itu akan mengisinya sesuai dengan instruksi yang telah dibuat sebelumnya;
  • klien menerima skema yang diperbarui dengan set bidang baru;
  • Sekarang pengguna dapat memilih nilai di bidang baru.


Kesimpulannya


Selain lelucon tentang Gurita, kami memiliki alat yang ampuh yang memungkinkan Anda untuk dengan cepat mengimplementasikan berbagai skema bidang untuk barang, profil pengguna, pengiriman, dan sebagainya. Administrator melalui panel kontrol sekarang dapat membuat perubahan dan skema tambahan tanpa menyentuh pengembangan dan pencarian. Dan penambahan sistem uji A / B memungkinkan manajer untuk dengan mudah memverifikasi efektivitas set data yang berbeda untuk input pengguna.

Source: https://habr.com/ru/post/id479924/


All Articles