
Apakah Anda siap menghadapi tantangan baru? Kami mengundang semua amatir dan profesional ke kejuaraan untuk desain dan administrasi layanan yang sangat dimuat
HighLoad Cup # 2 !
Kompetisi dimulai pada tahun lalu. Kemudian kami tahu bahwa HighLoad Cup adalah kejuaraan yang benar-benar hilang di sejumlah proyek Mail.Ru Group. Kompetisi percontohan pertama dihadiri oleh 449 orang. Ada banyak kode dan banyak keringat baik dari panitia dan peserta (8789 solusi yang berbeda). Ada nuansa dalam implementasi teknis, tetapi yang paling penting, semua orang menyukainya! Panitia menghabiskan banyak malam di pusat data, beberapa hari libur di kantor. Siap lagi! Di akhir artikel, Anda akan menemukan materi yang berguna dari kami dan dari para peserta, yang akan membantu Anda memahami mekanika dan menemukan beberapa solusi praktik terbaik.
Kali ini mereka mencoba menyiapkan untuk Anda bisnis yang lebih sulit. Selain itu, kami telah memperluas audiens, sekarang pengguna yang berbahasa Inggris dapat mengambil bagian dalam kompetisi. Bergabunglah dengan komunitas berbahasa Rusia di
Telegram . Di sana Anda akan mendapatkan banyak wawasan tentang kompetisi :)

Jadi selamat datang!
Mekaniknya
Dibandingkan tahun lalu, tidak ada yang berubah secara konsep dalam kompetisi.
Para peserta diberikan tugas untuk membuat layanan web kecil yang berfungsi dengan data dari struktur tertentu dan mengimplementasikan API untuk data ini. Wadah (Docker) dengan layanan yang diimplementasikan diunggah ke server kami, tempat kami meluncurkan dan mulai menembaki dengan permintaan HTTP.
Solusi dikirimkan kepada kami menggunakan klien Docker yang dipasang secara lokal di repositori khusus (masing-masing memiliki miliknya sendiri). Kemudian layanan yang dikirim kepada kami secara otomatis diperiksa oleh sistem CodeHub-CodeRunner yang dikembangkan oleh staf Laboratorium Grup Technopark Mail.Ru.
Kemudian kita mulai "memalu" wadah pada mesin uji dengan prosesor Intel Core i7. Solusinya akan dialokasikan 4 inti 2,4 GHz, 2 GB RAM dan 10 GB ruang hard disk. Singkatnya, "tangki" diluncurkan dengan mesin phantom, yang menyala di beberapa aliran dengan profil beban yang tumbuh secara linear. Sebelum penembakan dimulai, solusi pengguna memiliki beberapa menit (jumlah yang tepat tergantung pada tugas) untuk memproses data dari file JSON yang diterima. Pekerjaan yang benar dengan data ini adalah syarat yang diperlukan untuk kemenangan. Menembaki hanya dua, pendek dan panjang.
Berdasarkan hasil serangan tersebut, kami menghitung jumlah jawaban yang benar dan salah, RPS dan kecepatan respons, dan membentuk tabel penilaian untuk metrik tertentu. Penulis layanan tercepat dan paling toleran akan menjadi pemenang.

Gunakan teknologi web apa pun yang dapat Anda temukan atau hasilkan. Pilih bahasa dan kerangka kerja pemrograman Anda sendiri. Itu bisa C ++, Java + Tomcat, Python + Django, Ruby + RoR, GoLang, JavaScript + NodeJs, Haskell, setidaknya Assembler atau sesuatu yang lain, sesuai kebijaksanaan Anda. Untuk penyimpanan data: MySQL, PostgreSQL, Redis, MongoDB, cache. Kebebasan penuh!
Sebagai hasil dari penembakan, log dan metrik diperoleh, yang kemudian akan ditampilkan kepada para peserta dalam bentuk grafik pada halaman keputusan. Dilacak secara terpisah:
- metrik dasar;
- jawaban yang benar;
- kecepatan respons terhadap permintaan;
- jumlah respons per detik.

Peringkat solusi dihitung sebagai berikut: kami mengambil waktu dari semua jawaban yang benar bahwa API berhasil memberikan selama penembakan, kami menambahkan waktu penalti untuk setiap jawaban atau permintaan yang salah yang kami tidak dapat menerima respons (waktu penalti selalu sama dengan total batas waktu permintaan). Peserta, yang total waktunya kurang dari yang lain, lebih tinggi di leaderboard dan memiliki kesempatan untuk menjadi pemenang kejuaraan.
Tantangan
Tim kami berpikir untuk waktu yang lama tugas apa yang harus diberikan tahun ini. Mereka menginginkan sesuatu yang akan menyamakan peluang mayoritas (sehingga beberapa sepeda buatan sendiri di C / C ++ tidak akan menang).
Kata-katanya adalah sebagai berikut:
Dalam realitas alternatif, umat manusia memutuskan untuk membuat dan meluncurkan sistem pencarian global untuk "babak kedua." Ini dirancang untuk mengurangi jumlah orang lajang di dunia dan membantu menciptakan keluarga yang kuat.
Dalam data pengujian dan โpertarunganโ untuk berbagai penembakan, ada entri tentang satu entitas: Akun. Ini menggambarkan semua informasi yang diketahui tentang pengguna - namanya, kontak, minat, mengungkapkan simpati untuk pengguna lain. Keakuratan data yang diberikan dijamin sesuai dengan jenis dan batasan yang ditunjukkan di bawah ini. Semua data dihasilkan dan ditemukan oleh kami sesuai dengan hukum tertentu.
Data pribadi berikut ini terkandung dalam satu catatan Akun:
- id - pengidentifikasi eksternal unik pengguna. Itu diinstal oleh sistem pengujian dan kemudian digunakan untuk memeriksa respons server. Tipe adalah bilangan bulat 32-bit.
- email - alamat email pengguna. Ketik - unicode string hingga 100 karakter. Keunikan terjamin.
- fname dan sname - nama depan dan belakang, masing-masing. Ketik - string unicode hingga 50 karakter. Kolom adalah opsional dan mungkin tidak ada dalam catatan tertentu.
- telepon - nomor telepon seluler. Ketik adalah string unicode hingga 16 karakter. Bidang ini opsional, tetapi keunikan dijamin untuk nilai yang ditentukan. Itu jarang diisi.
- seks adalah string unicode, "m" berarti laki-laki, dan "f" berarti perempuan.
- kelahiran - tanggal lahir, dicatat sebagai jumlah detik dari awal era UNIX di UTC (dengan kata lain, ini adalah cap waktu). Terbatas mulai di bawah 01/01/1950, dari di atas 01/01/2005.
- negara - negara tempat tinggal. Ketik adalah string unicode hingga 50 karakter. Bidang ini opsional.
- kota - kota tempat tinggal. Ketik adalah string unicode hingga 50 karakter. Bidang ini opsional dan jarang ditentukan. Setiap kota terletak di negara tertentu.
Juga, dalam satu catatan Akun ada bidang khusus untuk mesin pencari untuk babak kedua:
- bergabung - tanggal pendaftaran dalam sistem. Jenis - stempel waktu dengan batasan: dari bawah 01.01.2011, dari atas 01.01.2018.
- status - status pengguna saat ini dalam sistem. Ketik - satu baris opsi berikut: "gratis", "sibuk", "semuanya rumit." Jangan memperhatikan akhir yang aneh :)
- minat - minat pengguna dalam kehidupan sehari-hari. Ketik - larik string unicode, mungkin kosong. Panjangnya tidak melebihi 100 karakter.
- premium - awal dan akhir periode premium dalam sistem (ketika pengguna benar-benar ingin menemukan "jodoh" dan mereka membayar untuk layanan). Di JSON, bidang ini diwakili oleh objek bersarang dengan bidang mulai dan selesai, di mana cap waktu dengan batas bawah dicatat pada 01/01/2018.
- suka - larik suka yang diketahui pengguna, mungkin kosong. Semua simpati berjalan berbeda dan masing-masing mewakili objek dari bidang berikut:
- id - pengidentifikasi akun lain yang disukai pengguna. Akun selalu dapat ditemukan di sumber data dengan id. Harap dicatat bahwa dalam data mungkin ada beberapa suka dengan id yang sama.
- ts - waktu, mis. timestamp, ketika simpati direkam dalam sistem.
Anda perlu mengimplementasikan API.
- Mendapatkan daftar pengguna: / akun / filter /
Metode API ini direncanakan untuk digunakan untuk mencari pengguna di bidang yang sebelumnya dikenal atau diinginkan. Misalnya, seseorang ingin melihat semua orang dari usia dan jenis kelamin tertentu yang tinggal di kota tertentu. - Mengelompokkan pengguna: / akun / grup /
Metode API ini direncanakan untuk digunakan untuk membuat laporan tentang pengoperasian sistem. Bidang yang digunakan untuk pengelompokan dilewatkan dalam kunci parameter GET yang dipisahkan oleh koma. Jumlahnya tidak sebanyak seperti permintaan pemfilteran pengguna. Hanya ada lima bidang untuk pengelompokan - jenis kelamin, status, minat, negara, kota. - Rekomendasi Kompatibilitas: / akun / id / merekomendasikan /
Kueri ini digunakan untuk mencari "babak kedua" dalam data pengguna yang ditentukan. Permintaan melewati id pengguna untuk siapa mereka yang paling cocok dengan status, usia dan minat dicari. Keputusan harus memeriksa kompatibilitas hanya dengan lawan jenis (kami tidak menentang minoritas seksual dan mengutuk diskriminasi, hanya terjadi :)). Jika negara atau kota dengan kunci negara dan kota, masing-masing, ditransmisikan dalam permintaan GET, maka Anda hanya perlu mencari di antara mereka yang tinggal di tempat yang ditentukan. - Mencocokkan suka serupa: / akun / id / sarankan /
Jenis permintaan ini mirip dengan yang sebelumnya karena ini juga tentang pencarian "belahan jiwa." Id dari pengguna yang kami cari soulmate juga dikirimkan, parameter GET batas digunakan. Perbedaan dalam implementasi: kami mencari orang-orang seperti jenis kelamin yang sama dengan "suka" yang sama dan menawarkan mereka yang mereka sukai sendiri. Jika permintaan menerima parameter GET dari negara atau kota, maka Anda perlu mencari "simpati yang serupa" hanya di lokasi tertentu.
Menceritakan semuanya dalam satu artikel tidak dimungkinkan. Aturan terperinci akan dipublikasikan pada hari peluncuran (hari ini) di situs web kejuaraan dan di gudang
GitHub , tetapi sekarang Anda tahu apa yang menanti Anda.
Jadwalkan
Ya, kami tahu bahwa liburan (dengan yang akan datang), jadi kejuaraan akan sangat panjang :)
- Pengujian beta (hasilnya tidak diperhitungkan): mulai pada 13 Desember pukul 19:00, berakhir pada 21 Desember pukul 19:00.
- Babak kualifikasi: dari 21 Desember 19:00 hingga 31 Januari 19:00.
- Babak final: hingga 5 Februari.
Selama pengujian beta, aturan dan ketentuan tugas dapat berubah (di hadapan bug dan karena alasan lain).
Babak kualifikasi - aturan tidak berubah.
Babak final sepenuhnya otomatis, tetapi sebelum itu finalis (pengguna N yang telah melewati hasil babak kualifikasi dan setidaknya 50 orang) memilih solusi yang akan ditembakkan dalam beberapa gelombang. Hasilnya dibentuk oleh hasil terbaik untuk semua gelombang.
Hadiah
Tempat pertama adalah MacBook Air yang baru.
Tempat kedua dan ketiga - Apple iPad.
Tempat keempat, kelima dan keenam - Samsung Gear S3.
Peserta berhak untuk meminta hadiah lain dengan nilai setara sebagai imbalan. Semua peserta yang lolos ke final akan menerima kaos bermerek kejuaraan kami.
Komunitas
Jika Anda pergi ke ruang obrolan
Telegram kami, Anda sepertinya tidak akan meninggalkannya. Kami menunggu Anda, dan semoga sukses!
Ucapan Terima Kasih
Artikel ini tidak membahas masalah pembaruan sistem. Kami melakukan banyak pekerjaan untuk menghilangkan bug infrastruktur, meninjau semua
masalah dari para peserta di GitHub, sudah mengimplementasikan sesuatu dan memasukkannya ke dalam daftar TODO untuk tahun depan. Saya ingin mengucapkan terima kasih yang
mendalam kepada Maxim
@ xammi- Kislenko, Ilya
@liofz Lebedev, Eugene
@gunicorn Ivanov, Irina
@aithelle Lukyanova, Vasily
@vasidmi Dmitriev dan seluruh tim yang berpartisipasi dalam kompetisi, termasuk seluruh komunitas kejuaraan. Terima kasih
Literatur yang berguna tentang hasil dari HighLoad Cup 2017