Как мы разработали сервис, который вошел в топ-5 крупнейших аптечных сайтов мира

Мы занимаемся разработкой и техподдержкой сервиса Apteka.ru в течение 7 лет. За это время выполнено около 2300 задач! Объем работ настолько большой, что проанализировать все — тот еще челлендж. Но мы постарались систематизировать свой опыт, чтобы поделиться им с коллегами. Расскажем о решениях, которые помогли сделать сервис интернет-аптекой №1 в России – и по обороту, и по времени пребывания пользователей на сайте.

image

Клиент


Apteka.ru — федеральный сервис по поиску и бронированию лекарств и товаров для здоровья, проект крупного фармацевтического дистрибьютора Рунета АО НПК «Катрен». В 2018 году на долю сайта приходился 31% от общего объема продаж онлайн-аптек. Согласно рейтингу АКИТ, он входит в ТОП-10 по количеству заказов среди всех российских интернет-ресурсов.

На протяжении 7 лет сервис ежегодно удваивал свои показатели, в 2019 году рост ускорился. По итогам 2019 года товарооборот Apteka.ru вырос на 171% и превысил 34 млрд руб., а число заказов увеличилось в 2,7 раза. Сейчас на площадке оформляется свыше 2 млн заказов в месяц.

В ассортименте Apteka.ru — до 28 000 наименований 840 российских и зарубежных брендов. Сервис работает строго в рамках закона. Клиент делает заказ на сайте, информация о нем поступает в систему, оперативно обрабатывается – и товар отправляется в выбранную аптеку.

Цели и задачи: эволюция


С развитием проекта цели и задачи заказчика менялись. Условно их можно разделить на три этапа.

Первый этап. Старт


Сайт — стандартный интернет-магазин на CMS 1С-Битрикс. Функционал прост – продемонстрировать каталог товаров и реализовать схему их выкупа через розничные точки партнеров.

Второй этап. Масштабирование


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

Основной целью стало создание стабильно функционирующего интернет-магазина, который приносит компании прибыль благодаря сотрудничеству с поставщиками и аптеками.
Совместно с заказчиком мы сформулировали основные задачи:

  • Улучшение юзабилити.
  • Внедрение нового функционала.
  • Интеграция с внешней системой учета.
  • Дополнительная монетизация сайта – привлечь больше пользователей за счет маркетинговых инструментов, программ лояльности, предложить партнерам и поставщикам услуги по рекламе.

При этом сайт должен был отвечать следующим критериям:

  • адаптированность под мобильные устройства;
  • время загрузки — не более 2-3 секунд (по данным на январь 2020 года — 1,5 секунды для главной страницы).

Третий этап. Техподдержка и оптимизация


К 2017 году сервис стал одним из лидеров в своем сегменте и единственным специализированным ресурсом в области медицины и здоровья в топ-30 крупнейших российских сайтов по объему продаж. С этого момента было важно удержать, а затем и усилить позиции.

На первый план вышли новые задачи:

  • Актуализация сервиса под текущие требования заказчика и рынка.
  • Модернизация технологического стека и рефакторинг кода.
  • Обеспечение стабильного функционирования высоконагруженного проекта.
  • Редизайн и доработка интерфейса.

Решения


Масштабирование


Интеграция с системой учета

Мы настроили связь с внешней системой учета заказчика – SAP Business Explorer (BE). Необходимо было добиться постоянного динамического обновления информации в «1С-Битрикс: Управление сайтом», чтобы на сайте всегда были актуальные сведения.

Интеграцию пришлось писать с нуля. Мы получили готовый протокол межсетевого взаимодействия со стороны BE. Под него разработали взаимодействие на своей стороне: обработку пакетов (сформированных блоков данных), приходящих от BE, и их отправку в систему учета.

Потом возникла сложность – количество пакетов выросло настолько, что мы не успевали их отправлять. Чтобы ускорить процесс, внедрили брокер сообщений RabbitMQ. Он помог существенно повысить производительность отправки пакетов и масштабировать эту процедуру. Теперь, если возникнет необходимость отправить большое количество пакетов, можно легко увеличить количество воркеров, и они справятся с возросшей нагрузкой.

Кастомизация ценообразования

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

Доработка коробки Битрикс

Изначально сервис Apteka.ru разрабатывался на Битрикс, так как это решение было оптимальным для интернет-магазина — коробочная версия позволяет быстро запустить сайт.

Однако есть и недостаток – система настраивается в довольно узком диапазоне, ее сложнее кастомизировать под задачи проекта. Поэтому при масштабировании потребовалась разработка расширенной программной архитектуры.

Apteka.ru предлагает множество товаров с разными наименованиями и свойствами, что усложняло фильтрацию и поиск, замедляло работу сайта. Пришлось провести большую работу с базами данных и добавить новый функционал для разработки модулей. В частности, мы:

  • Использовали контейнер внедрения зависимостей Dependency Injection, на базе которого построили систему модулей – более гибкую, удобную, расширяемую.
  • Внедрили компоненты Symfony – шаблонизатор и компонент для создания консольных команд. Это позволило облегчить создание визуальной составляющей проекта, улучшить читаемость кода, а также расширять и переопределять шаблоны, не нарушая работу общего алгоритма.

В числе последних разработаны модули:

  1. Система отзывов и рейтингов. Пользователи получили возможность оценивать по пятибалльной шкале товары некоторых категорий, а также оставлять на них отзывы. Комментарии публикуются на сайте автоматически, но модератор может их редактировать или удалять. Технически это реализовано так: модуль принимает информацию о том, для каких категорий товаров можно оставлять отзывы, и передает ее в базу данных.
  2. Модуль напоминаний для пользователей написан с нуля на PHP. Если клиент заказал препарат, который надо принимать курсом, он будет получать напоминания об этом.
  3. Трекинг – пользователь может отслеживать движение заказа по карте и видеть время доставки.
  4. У сервиса обширная админ-панель, которая включает в себя от 150 до 200 страниц. Через нее можно управлять разными элементами сайта – заказами, данными пользователей, товарами, контентом.

Интеграция с картами Яндекса

Чтобы максимально упростить процедуру заказа лекарства, заказчик предложил использовать API сервиса Яндекс.Карты. Система автоматически определяет местоположение пользователя и выгружает карту с ближайшими доступными для доставки аптеками. Учитывая, что в базе проекта Apteka.RU более 80 000 аптек, это решение было оптимальным.

Оптимизация поиска в 3 этапа

Много времени мы уделили оптимизации поиска — основного инструмента привлечения пользователей на сайт. На старте проекта выполнили ряд внутренних доработок сервиса для повышения релевантности поисковой выдачи.

Встроенный в CMS поиск быстро перестал справляться с поступающими запросами. Мы установили и настроили поисковый движок Sphinx, который тогда отличался хорошей производительностью. Сервис поиска стал работать быстро и безотказно.

Однако через несколько лет текущая версия Sphinx уже не так активно поддерживалась разработчиками, из-за чего не обеспечивала нужной стабильности работы. А главное – чтобы реализовать новый функционал, который требовался заказчику, пришлось бы создавать кучу «костылей». Несколько раз из-за неполадок в поисковом движке возникали проблемы с доступностью сайта. Мы оперативно внесли доработки для бесперебойной работы сервиса. Но стало понятно – это не выход.

Решили перейти на Elastic Search – более современный движок с открытым кодом. Его преимущества – более стабильная работа, высокая производительность, а также расширенные возможности пользовательского поиска.

2. Техподдержка


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

Но потом этот ресурс был исчерпан. Возможностей для оптимизации кода становилось все меньше. Тогда мы перенесли часть сервисов (в частности, базу данных) на другие серверы. Какое-то время такая конфигурация работала, потом этого тоже стало недостаточно.

Мы начали масштабировать отдельные сервисы. Вместо одного сервера добавили несколько php-серверов и организовали балансировку нагрузки между ними. Тот же принцип использовали при масштабировании базы данных – разделили ее на несколько баз, нагрузка между которыми балансируется.

На старте проекта для обработки запросов мы использовали веб-сервер Apache. Но он плохо работал при высоких нагрузках. Тогда мы настроили веб-сервер на базе технологий Nginx + Php-Fpm, после чего работа сайта стала намного стабильнее и производительнее.

Посещаемость сервиса растет. В 2019 году были достигнуты рекордные показатели за всю его историю. В месяц интернет-магазин посещают более 11 млн пользователей.

Чем популярнее становился сервис, тем чаще на него устраивали DDoS-атаки. Мы были к этому готовы: постоянно увеличивали серверные мощности, развивали серверную архитектуру. Удалось увеличить отказоустойчивость за счет перераспределения нагрузки и взаимозаменяемости серверов.

При массированных DDoS-атаках мы блокировали запросы с IP-адресов из других стран. Кроме того, в ноябре 2019 года подключили сервис DDoS-Guard для автоматизированной защиты от ботов. Это позволило значительно улучшить защиту от хакерских атак.

3. Оптимизация


Функционал сервиса с каждым годом расширялся. Возникали новые требования к производительности, качеству кода, сопровождаемости, читабельности. Для решения этих задач мы применяли два способа:

  • Рефакторинг кода позволяет уменьшить число ошибок пользователей, сделать работу сервиса более стабильной и безопасной.
  • Изменение стека технологий или механизма работы. Если необходимы более радикальные меры, мы предлагаем новые веб-решения.

Приведем пару примеров:

  • Интеграция Doctrine ORM. Раньше для работы с базами данных использовались нативные запросы, SQL-запросы или API Битрикса. Doctrine ORM представляет собой некое связующее звено между базой данных и кодом, чтобы помещать/извлекать создаваемые объекты из базы данных. Использование этой технологии позволило повысить скорость разработки, производительность и в целом удобство работы над проектом для программистов.
  • Логику работы корзины мобильного приложения перенесли на сторону сервера. Мы настроили передачу данных о пользователе, его корзине и выбранных товарах через API. До этого данные хранились в мобильном приложении автономно, что мешало оперативно вносить изменения. Например, на сайте цена товара уже изменилась, а в приложении – еще нет. Теперь бэкенд корзины хранится на сервере и одинаково доступен как для мобильной, и для десктопной версии.

Иногда сложнее всего было убедить заказчика сделать выбор в пользу конкретного решения. Для этого нужна проактивная позиция – обосновать свое мнение, показать конкретные выгоды. В итоге мы действуем в интересах клиента — помогаем сэкономить бюджет, предостерегаем от внедрения заведомо неэффективных решений. Заказчик начинает это ценить и доверять нашим рекомендациям.

image

Результаты


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

Это способствовало достижению бизнес-результатов заказчика. Сегодня Apteka.ru — единственный специализированный интернет-магазин, который получает заказы в количестве, соизмеримом с крупнейшими маркетплейсами. По данным Data Insight, в первом полугодии 2019 года сервис вошел в тройку лидеров по динамике роста наряду с Wildberries и Ozon.ru, а также стал сервисом №1 по трафику среди аптечных сетей.

image

Apteka.ru многократно получала высокую оценку профессионального сообщества и завоевывала престижные отраслевые премии. Последние награды 2019 года:

  • Первое место в рейтинге самых часто используемых провизорами профессиональных сайтов (по данным опроса сотрудников аптек аналитической компанией Ipsos).
  • Диплом лауреата фармацевтической премии «Зеленый крест» в номинации «Лучшая система заказа и бронирования».
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 12

    +2
    Много ли в итоге у вас битрикса осталось с точки зрения бизнес-логики? Вопрос без сарказма.
      0
      В конечном счете, от битрикса осталось мало. Почти все было либо полностью переписано, либо существенно доработано. От битрикса в неизменном виде остался только функционал CMS и некоторые структуры в БД
      0
      А расскажите поподробней как вы доктрину к битриксу прикрутили?
        0
        Было сложно. Вот некоторые проблемы, с которыми мы столкнулись:
        1) Хотелось бы, чтобы и битрикс и доктрина не создавали каждый свое подключение к базе данных, а использовали общее подключение. На практике, оказалось, все не так просто. Пришлось переопределять битриксовый класс подключения к базе, чтобы получить доступ к mysqli и использовать его, для создания доктриновского подключения через mysqli.
        2) Проблема с маршрутизацией sql запросов по репликам БД. Штатный механизм маршрутизации в битриксе по понятным причинам не работал для запросов, которые выполнялись доктриной. В итоге проблема самоустранилась после перехода на proxysql
        3) Выполнение вложенных транзакций. Если битрикс открывает транзакцию, находясь внутри доктриновской транзакции, то доктриновский механизм поддержки вложенных транзакций в этом случае не сработает и внешняя транзакция закроется раньше. Решили эту проблему перенаправлением всех TCL из битрикса в доктрину.
        0
        php 5.6? насколько я помню требуется версия php 7.1 минимальная
          0
          Битрикс требует PHP 7.1 и выше
            0
            У вас в технологическом стеке php 5.6
              0
              Когда сайт запускался, php 5.6 было актуальной версией PHP. Миграция на 7.1 была отдельной задачей, которая потребовала серьёзных усилий.
          0
          Что за странные дела — только ворчу на какой-то сервис, так выходит статья на Хабре: сначала Почта России, теперь вот Apteka.ru. Пользовательский опыт следующий — делаю заказ с (лайтовой?) регистрацией через номер телефона, ожидаю три дня, получаю смс о готовности, иду в аптеку, и тут понимаю, что точно не знаю адрес нужной (очень плотно расположены несколько аптек). В смс этой информации нет, после входа на сайт по тому же номеру в заказах тоже ничего нет… Взгрустнулось, пришлось методом проб и ошибок искать, причем еще человеческий фактор сработал, в правильной аптеке не нашлось по треку, хорошо прозвонил (номер из смс пригодился).
          Надеюсь, сочтете полезной обратную связь!
            0
            Спасибо за обратную связь!
            0
            28 000 наименований… Надо же, думал, что намного больше! )
            Спасибо за интересный опыт!
              0
              Спасибо за отзыв)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое