Вместо введения


Как и все интересные истории, эта началась достаточно давно и неожиданно. Однажды наш банк-партнер пришел к нам и сказал: “Ребята, мы научились делать скоринг в нашей системе за одну минуту. Как насчет того, чтобы объединить наши усилия и интегрировать проекты? С нас – решение и кредит, с вас – машины”. Сказать, что мы воодушевились, – ничего не сказать! Мы имели все шансы стать первыми чуть ли не в мире, кто может дать кредит онлайн на подержанное авто за одну минуту (ОДНУ МИНУТУ, КАРЛ)! Ниже я расскажу, что из этого получилось, но для начала расскажу вам, кто такие, собственно, МЫ.



Мы — “Колёса | Крыша | Маркет” являемся крупнейшей IT-компанией, основанной в Казахстане. Каждый день наши продукты помогают шести миллионам казахстанцев покупать и продавать машины, квартиры, детские кроватки и тысячи других вещей. Kolesa.kz – самый большой авторесурс и приложение, уже не первый год занимает 1-е место в мобильном рейтинге Казахстана.


Что из себя представляет проект “Автокредит”?


На данный момент база подержанных авто составляет 103 400 автомобилей, более 60% из них доступны в кредит!


Как это выглядит в картинках

1. Выбираем машину которую хотим взять в кредит



Рисунок 1. Поисковая выдача машин доступных в кредит


2. На странице объявления видим форму для подачи заявки на кредит


Рисунок 2. Экран страницы объявления


3. Выбираем период и первоначальный взнос и нажимаем получить одобрение



Рисунок 3. Кредитный калькулятор для объявления


4. Попадаем на форму, где нам нужно ввести свои контактные данные



Рисунок 4. Форма инициализации заявки на кредит


Сюда вводим ваш номер мобильного телефона Имя и ИИН (в России это был бы ИНН)


5. Далее вам необходимо ввести код СМС который придёт на указанный вами номер



Рисунок 5. Форма подтверждения номера телефона путём ввода смс


6. После этого начинается сам процесс скоринга, который длится не более 1 минуты


Рисунок 6. Экран процесса скоринга заявки


7. Есть несколько вариантов результата скоринга:


  1. Вам одобряют кредит
  2. Вам отказывают в получении кредита
  3. Вам предлагают альтернативные условия
  4. У вас запрашивают дополнительную информацию, после предоставления которой вы получаете один из предыдущих вариантов (а, б, в)


Рисунок 7. Пример экрана одобрения Автокредита


После того как человек получает одобрение своей заявки, ему в течение 10 минут перезванивает менеджер из банка и информирует человека о том, какие действия ему нужно произвести далее, для того чтобы оформить кредит. Удобно, не правда ли? Давайте посмотрим как это всё было реализовано.


Ты помнишь как всё начиналось…


Всё было впервые и вновь! Если раньше у нас в качестве кредитной формы была просто форма обратной связи, то наша новая задумка была чем-то совершенно новым и непонятным. Т.к. аналогов у нас не было, нам предстояло очень увлекательное занятие — планировать, проектировать, распределять и реализовывать. Для начала мы разбили весь процесс нашей совместной интеграции на 2 блока, которые выполнялись параллельно, а именно:


  • Инфраструктурная интеграция
  • Программная интеграция


    Изначально мы договорились с банком партнёром, что он(банк-партнёр) предоставит нам некое API, в которое мы будет слать некие данные и получать некоторые ответы. На том и порешали. Мы стали ждать документацию по API от банка, свели между собой наших и их сетевых инженеров! В плане программной интеграции же вырисовывалась достаточно простая схема, мы шлём данные в банк, банк их прокручивает в своей системе, и возвращает нам, и всё это за гарантированные 60 секунд. На случай таймаута (куда ж без этого) договорились выводить аварийную анкету, в которой мы добираем данные которые могут дополнительно понадобиться банку.



Сети


В то время пока разработчики выбирали инструментарий для реализации, проектировали свою систему и ждали документацию по системе партнёра, в отделе инфраструктуры работа уже во всю кипела! У нас с банком-партнёром было на двоих: 2 рядом стоящих циски в одном ДЦ, кабель соединяющий циски, ВПН-туннель, сертификаты безопасности и приблуды для работы с ними всех цветов и размеров… План был следующий, Мы прокидываем шифрованный ВПН канал между нашими серверами, и строим прямую интеграцию между нашими сервисами. Схематично это можно изобразить так:



Поговорим про код


Ниже мы расскажем о том, как и что устроено со стороны нашего сервиса. Итак, получив документ, описывающий сервис партнёра готовый к интеграции, мы узнали, что в отличие от нас банк работает только с запросами SOAP, и не про какие RESTful сервисы слышать не хочет. А так как в наших сервисах мы используем SOAP чуть реже чем никогда, нам предстояло много чудных открытий о том, как научиться готовить SOAP в нашем новом продукте. Следовательно, нам нужно было научить наш сервис парсить SOAP запросы и конвертировать наши ответы обратно в SOAP.


Выбора фреймворка


Для начала надо было выбрать хотябы язык реализации, идей было очень много, начиная с C и С# заканчивая golang и erlang. Решили идти по простому пути. Систему надо будет поддерживать, и дабы не нарваться на bus-фактор с нехваткой специалистов на рынке, решили сделать упор на наиболее распространенную технологию в нашей компании — PHP. Слава богу, что за окном уже был не 2001, а 2017 год и php-фреймворков присутствует такое множество, что ими можно удовлетворить потребности даже весьма изощренных инженеров. Перебрав целую кучу мы выбрали один из самых простых и в то же время поддерживаемых — Yii 2.


За это решение было:


  • Легко освоить, целая куча литературы;
  • Достаточно легко строить формы и валидаторы;
  • Есть Active Record и вагон готовых либ для работы со всевозможным инструментарием;
  • Он и правда быстрый;
  • На его базе просто строится API, удобно писать консольные команды.

Против было:


  • Фреймворк построен на статических методах — это весьма неудобно, в том числе при написании тестов
  • Было не совсем понятно, какой доп инструментарий нам понадобится в ближайшее время после запуска, и, как следствие, был риск не обнаружить необходимых библиотек…

Выбор хранилищ


Фреймворк выбрали, теперь настало время выбрать хранилище для заявок. Было несколько вариантов, MySQL, mongoDB, postgreSQL… С одной стороны, заявка это документ, наверняка её структура может меняться, время от времени дополняясь новыми полями и избавляясь от неактуальных. С другой стороны, использование нереляционных БД будет накладывать свои ограничения. Взвесив все “за” и “против”, мы решили усидеть на 2х стульях и к запуску использовать MySQL, а после запуска мигрировать на связку mongoDB + ElasticSearch. В итоге было поднято 2 реплики MySQL в качестве хранилища и прикручены к приложению с помощью ActiveRecord. К моменту когда мы начали переход на mongoDB объем данных очень сильно вырос и взял такой темп прироста, что появилась ещё одна необходимость в разделении заявок на условные хранилища. В качестве инструмента near-realtime индексации документов в ElasticSearch решили использовать сервис, написанный на Golang — monstache.


Строим инфраструктуру


Инфраструктуру решили сделать следующую: 10 бэкендов с приложением обработчиком заявок, 2 балансировщика, 2 реплики MySQL, 3 шарда elasticsearch, 3 реплики mongoDB и 2 реплики сервиса monstache.


Процесс


Вообще процесс автокредита можно разделить на 2 части:


  1. Для начала, вам необходимо найти подходящую машину, доступную в кредит. Скорее всего вы будете ориентироваться на её состояние и на условия кредитования.
  2. После того, как вы выберите машину, вам нужно получить одобрение кредита, для этого вам понадобится заполнить заявку

Про реализацию второй части мы более-менее рассказали выше, поговорим про реализацию первой части. Реализация первой части состоит из нескольких подчастей:


  1. При поиске машины человек должен иметь возможность ориентироваться, помимо технических параметров, на доступность авто для покупки в кредит и на минимальный размер ежемесячного платежа. Для этого нам необходимо еще в момент подачи объявления знать, доступна ли машина в кредит и каков будет на неё минимальный платёж.
  2. После того, как человек выбрал машину, нам нужно предоставить ему кредитный калькулятор, где он мог бы выбрать размер первоначального взноса и срок кредитования, тем самым подобрав себе наиболее комфортный размер ежемесячного платежа.

Для данной цели был разработан специальный микросервис на языке go. Суть его заключалась в следующем: При подаче объявления в микросервис отправляется объект со всеми данными по автомобилю, микросервис, основываясь на правилах, которые для него пишутся отдельно, возвращает минимальный размер ежемесячного платежа для индексации в поиске, а также возвращает минимальный первоначальный взнос и допустимые сроки кредитования, которые идут в основу построения кредитного калькулятора.



Мы заранее кэшируем варианты просчета для стандартных значений первоначального взноса и ежемесячного платежа. Это делается для каждого из доступных кредитных периодов. Если человек поменяет первоначальный взнос (в пределах допустимого), то микросервис вновь рассчитает все данные. Если же первоначальный взнос указан меньше допустимого, то калькулятор выведет валидационную ошибку.



В связи с высокой нагрузкой на наш сервис, кредитный калькулятор имеет 2 степени кэширования: 1-ая происходит на бэкенде, куда первоначально идут клиенты за калькулятором, 2-ая в самом микросервисе.


Так что в итоге?


Мы запустили проект 11 сентября 2017 года. С того момента, на сегодняшнюю дату (04.12.2018) подано 2,973,868 заявок. Мы находимся в непрерывном процессе улучшения нашего сервиса и упрощения пользовательского пути. Делаем его быстрее проще и стабильнее! Аптайм проекта за весь период с момента запуска составил 99.99%.


Как итог мы имеем следующие результаты:


  1. Существенно сократили пользовательский путь
  2. Расширили объем доступных для кредитования авто до 60% от всей базы
  3. На сегодняшний день количество заявок выросло более чем в 7 раз!

Вместо заключения


За 3 месяца нам удалось построить воистину удивительный и уникальный проект. Его основной целью было дать нашим клиентам возможность приобретать легковые авто с пробегом не покидая нашей платформы. Всего за 1 минуту пользователь может получить решение по своей заявке, созвониться с продавцом, и в тот же день оформить все необходимые документы.
Судя по количеству заявок за год и 2 месяца можно сделать вывод, что у нас получается делать сервис действительно удобным и востребованным.

Комментарии (31)


  1. stalkerxxl
    04.12.2018 20:41
    +3

    Жду вопроса в комментах «Почему не Laravel»? =)


    1. iit
      05.12.2018 07:07

      Думаю учитывая наработки компании спрошу почему не phalcon ?


      1. WallEnd Автор
        05.12.2018 12:05

        Не phalcon потому, что смысла в нём нет никакого в данном конкретном случае. Смысл разворачивать такую махину и не пользоваться практически ни чем из его инструментария. Не Laravel потому, что на тот момент казалось, что на Yii это будет реализовано быстрее, хотя это и не факт)


  1. SergeyMax
    04.12.2018 20:45
    +5

    С того момента, на сегодняшнюю дату (04.12.2018) подано 2,973,868 заявок
    Tags: highload
    Мне всегда казалось, что хайлоад — это три миллиона транзакций в час. А не в год.


    1. WallEnd Автор
      04.12.2018 21:07
      +4

      Возможно, я что-то непонятно написал, уточню.

      Количество заявок != количество просмотров кредитного калькулятора и рассчётов.
      У нас, в среднем 45 000 уникальных поситителей одновременно онлайн, в час пик бывает больше! Каждый из них генерирует множество запросов: 6 показов объявлений из 10 включают в себя работу с кредитным калькулятором, и, как следствие, с нашей системой.

      В то же время, заявка это уже непосредственно само обращение человека в систему скоринга, когда человек выбрал авто и решился на кредит.

      Прошу прощения, если не оправдал ваше ожидание по highload, мы стремимся к лучшему!


      1. VSV
        04.12.2018 21:26
        +2

        А можно подробнее про «одновременно онлайн»? Какое количество запросов/страниц в секунду/час?


      1. VSV
        04.12.2018 21:32
        +2

        Ну и про серверы расскажите, если это не тайна: сколько ядер/памяти.


        1. WallEnd Автор
          05.12.2018 12:45

          Бэкенды реализованы в виртуалках: 2 горшка на 1ГБ ОЗУ
          Запросы — около 5000 запросов/секунду
          Это я говорю про запросы, которые поступают от пользователя на просмотр сайта и от мобильных приложений, далее все это умножается на количество сервисов которые мы подтягиваем для показа страницы. И получаются достаточно большие цифры. В сервис автокредита отдельно нагрузка порядка 1000 запросов/секунду.

          Надеюсь я ответил на ваш вопрос.


    1. turbotankist
      05.12.2018 10:44

      как бывший житель РК скажу, что колёса действительно один из крупнейших ресурсов страны и лет 5 назад даже все российские аналоги были меньше, им дальше просто расти некуда — населения нужно больше. Только последние годы автору стал больше с его агрессивным маркетингом. Так что если в Казахстене есть хайлод, то это у них)


  1. Alimkulov
    04.12.2018 21:11

    лучше бы вы научились отфильтровывать фейковые объявления и мошенников в ваших ресурсах.


  1. PQR
    04.12.2018 21:44
    +1

    Правильно пишется MySQL, а не «mySQL»


    1. WallEnd Автор
      04.12.2018 21:48
      +1

      Большое спасибо! Сейчас же исправлю эту вопиющую ошибку!


      1. PeterK
        05.12.2018 11:23

        "… и не про какие RESTfull сервисы слышать не хочет..."
        RESTful


        1. WallEnd Автор
          05.12.2018 11:23
          +1

          Немедленно исправляю, спасибо!


  1. Cuthbert
    04.12.2018 21:59
    +1

    Очень актуально, кстати, пока покупатель не передумал брать эту рухлядь.


    1. Polaris99
      05.12.2018 14:44

      Аналогичная мысль возникла. Интересен процесс конвертации заявок в реальные кредиты после просмотра машины вживую. Ну или хотя бы после того, как человек вышел на связь.


  1. mkevac
    05.12.2018 00:04

    На каком этапе используется микросервис? Когда пользователь ищет машины для каждой машины отправляется инфа в микросервис или когда пользователь уже выбрал машину, то оправяется инфа по этой конкретной машине?


    1. WallEnd Автор
      05.12.2018 11:31

      Микросервис используется в нескольких местах:

      1. В момент сохранения объявления нам нужно понять доступно ли оно будет в кредит и на каких условиях. Мы идём в микросервис и узнаём доступен ли и какой минимальный ежемесячный платёж и сохраняем это вместе с объявлением. Благодаря этому пользователи могут фильтровать в посике машины доступные в кредит и по размеру ежемесячного платежа.
      2. В момент когда вы открываете объявление и у нас не оказывается в кэше калькулятора для него мы идем в микросервис. В момент когда вы меняете первоначальный взнос мы тоже идём в микросервис
      3. В момент когда формируется заявка и мы ещё раз проверяем правильно ли указаны условия которые указал пользователь


  1. Samouvazhektra
    05.12.2018 02:43
    +1

    А сколько человек в команде — бек, фронт?
    И хотелось бы подробнее про использование Yii — сомневаюсь, что прям всё как из-коробки — как модифицировали темплейт, как с ним боролись, что перекраивали? Толстые контроллеры, толстые модели, или сервисный слой?


    Ну и по тестированию — встроенный codeception или phpunit? Как решали вопрос с фикстурами?


    1. WallEnd Автор
      05.12.2018 11:48

      На сегодняшний день в команде автокредита 6 человек: 4 фулл-стек разработчика, тестировщик и менеджер)
      Про Yii:
      1. Версия Yii2
      2. Темплейтами не пользуемся у нас прямая конвертация ответа в JSON
      3.

      Толстые контроллеры, толстые модели, или сервисный слой
      — Стараемся Делать контроллеры тонкими, максимально сократить код в экшенах и размазать по моделям и сервисам
      4. Фикстуры не используются

      По тестированию — встроеный codeception для юнитов и Newman для функциональных.


  1. Adverte
    05.12.2018 07:01

    "… Человек должен иметь возможность ориентироваться на доступность авто для покупки в кредит.."
    Что значит «доступность авто в кредит»?
    Разве продавцу не всё равно какие там отношения у покупателя с банком если он получает всю сумму от банка сразу?


    1. shaggyone
      05.12.2018 07:27

      1. Я так понял речь про покупателя.
      2. Продавец эту информацию тоже может использовать. Многие клюют на «Всего за 300 баксов в месяц вы получите большую пацанскую тачку». Более того, если авто используется для заработка, этот показатель действительно важен. Зарабатывая на такси 1000 басков в месяц пожалуй можно 300 отдавать по кредиту за средство производства. Возможно есть более удачный вариант, но этот определённо в числе допустимых.


    1. lexlocker
      05.12.2018 11:21

      Не все марки и модели кредитуются (как правило, банк смотрит на ликвидность). Какой-нибудь кабриолет вряд ли доступен в кредит, либо доступен, но по адским условиям.


  1. ShinRa
    05.12.2018 12:34

    Т.е. как? Все машины не биты, не крашены? Просто по фото взял и подписался на кредит?


    1. lexlocker
      05.12.2018 12:41

      Из личного опыта — там более длинная конечная процедура )
      — если тебе одобрили кредит (смысл ехать смотреть авто, если тебе не одобрили?) — звонит менеджер из банка и приглашает на ближайшее аффилированное СТО в твоем городе на определенное время, удобное продавцу и покупателю.
      — на СТО проводится осмотр и оценка авто, составляется дефектовочный акт и в течение нескольких минут оценивается авто (продавец может оценить авто дороже в 2 раза, чем оно действительно стоит, такие ушлые ребята отсекаются).
      — дальше покупатель едет в банк (или прям на аффилированном СТО) и вносит первоначальный взнос от 10% и продавец с покупателем едут переоформлять автомобиль.


      1. Polaris99
        05.12.2018 14:45

        Всего один вопрос — зачем это нужно продавцу?


        1. WallEnd Автор
          05.12.2018 15:05

          Наверное, чтобы продать авто? Машины — не горячие пирожки)


          1. Polaris99
            05.12.2018 15:23

            То есть, ушлые продавцы сразу же скинут цену, как только какая-то мастерская им скажет, что, по их мнению, авто должно стоить в два раза меньше? Вы, видимо, недооцениваете людей, которые продают подержанные машины.
            Значит, покупателю нет смысла ехать, если кредит не одобрили, а продавцу есть смысл мотаться в сервис, ждать там результата, а потом выяснить, что покупатель готов дать в два раза меньше или вообще не готов покупать.


            1. lexlocker
              05.12.2018 15:27

              Только дурак поедет оценивать и покупать авто с ценой в два раза выше рыночной, либо мошенник :) (на kolesa.kz, кстати, в каждом объявлении есть индикатор средней рыночной цены на такую марку/модель/год).
              А если банк скажет, что реальная стоимость авто сильно меньше рыночной — тогда пересчитают покупателю условия кредита и всё. Дальше стороны либо соглашаются, либо нет.
              Чаще всего пересчёт — это увеличение первоначального взноса.


  1. gents
    05.12.2018 15:00

    Используете миграции? Если да, то каким образом применяете их?


    1. WallEnd Автор
      05.12.2018 15:06

      Используем родные миграции Yii. Все по мануалу. Но у нас мало что осталось в MySQL.