{"id":14293,"url":"\/distributions\/14293\/click?bit=1&hash=05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","hash":"05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0438 \u043a\u043e\u043f\u0435\u0439\u043a\u0438","buttonText":"","imageUuid":""}

Имеет ли смысл решать вопрос нагрузки в приложении?

Денис Гордиенко, руководитель Bright Mobile, о нагрузке на примере приложения для оптовых покупателей цветов.

Решил рассказать про опыт разработки приложения для оптового дистрибьютора цветов в Краснодаре и вопросе нагрузки на БД. Отличие от большинства «цветочных» приложений в том, что оно сделано не для конечных покупателей, а для розничных продавцов, которые оформляют заказ удалённо, либо приезжая на базу.

Идея приложения

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

Каталог отображает все цветы сразу или группирует их по типу. В каждой из лент можно добавить выбранные позиции в корзину и указать их количество (цена указана за определённую партию), отметить, что заказывается сейчас, отложить остальное на потом – и отправить заказ менеджеру на обработку.

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

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

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

Багфикс ленты товаров

История могла бы быть очень сладенькой и не интересной, как одна из тысяч, описывающих очередное портфолио в стиле «была проблема, сделали вот так, проблемы нет, клиент доволен». Поэтому решил рассказать об одном из багов, который появился в процессе.

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

Технологии

Для начала приведу список технологий, на которых делалось приложение:

  • Сборка Ionic.Framework
  • БД FireStore
  • Push — FCM
  • Обмен данных с 1C — Node.JS
  • Авторизация — Firebase Authentication

Кроссплатформенная сборка дала плюсы в скорости и цене разработки. Требования к телефону у бизнес-приложения низкие и переплачивать за натив смысла нет. БД выбрана для работы в режиме реального времени — приложение держит соединение с базой по сокету и моментально получает обновления. Авторизация от Firebase даёт 10 тыс бесплатных СМС, что более чем достаточно для планируемой клиентской базы.

Пропадание списка товаров

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

К слову, у программистов всегда чешутся руки пооптимизировать запросы. Это хорошо, но важно понимать экономическую целесообразность. К примеру, при плановой нагрузке в 200 тыс чтений оплата составит $0,06 за 100 тыс чтений. То есть в сутки $0,09, это $2,7 в месяц.

Выгоднее платить по 167р в мес на платном тарифе, чем дополнительно заложить 40 часов разработчика на кеширование и пакетные запросы. Если ориентироваться на стандартную ставку в 1200р в час, то это добавило бы лишние 48 000р в бюджет.

Когда делать оптимизацию?

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

Предположим, что бизнес пошёл резко в гору и ежемесячно количество пользователей приложения увеличивается. Соответственно, незначительные 167р на текущем этапе будут постоянно расти. Обычно, сравнивая облачный FireStore коллеги приводят как альтернативу собственный сервер. Мол там нет аналогичной тарификации и можно не париться по количеству запросов.

Оставляю за скобками стоимость создания и развёртывания серверной архитектуры. Самый минимальный VDS можно взять примерно за 400р ($6,67) в мес, «нормальный» сервер — в районе 4000р ($66,67) в мес.

Адекватно задумываться об оптимизации было бы на этапе, когда эта самая оптимизация давала значительную выгоду перед арендой собственного сервера. То есть когда количество запросов к БД будет от минимальных 100 000 х $6,67 / $0,06 = 11 111 111 до «нормальных» 100 000 х $66,67 / $0,06 = 111 111 111.

111 миллионов запросов это достаточно абстрактная для бизнеса цифра. Поэтому переведём на заказы. В среднем, на одного пользователя, в этом приложении, чтоб он вдумчиво посидел и оформил корзину нужно 200 запросов к БД. То есть дойдя до платежа в 4000р в мес, клиент получит 10%(средняя конверсия в оплату) х 555 555 = ±55 555 заказов.

Получается за 50 тыс заказов нужно заплатить 4000р. Думаю, что загорая на Бали от такого количества денег, владелец приложения найдёт эту сумму.

0
59 комментариев
Написать комментарий...
Yuri Trenin

Мой голословный ответ на заголовок поста.

Для b2b проекта на ранней стадии преждевременные оптимизации естественно не имеют смысла. Тем более, что в адекватном проекте клиент всегда будет иметь встроенную телеметрию, которая не даст проспать момент ухода латенси бэка в красную зону. В этом случае, пожалуйста, хоть десять облаков, saas, paas, faas, maas и любой ass на выбор создателей. Вероятность выжить все равно в районе 5%.

Все становится намного интереснее когда ты изучаешь разбивку костов более-менее популярного проекта,  который уже вроде бы и выжил, но развивал кодовую базу в упоре на облака. Опуская постоянную борьбу ops-стафа с латенси на чужой бесконтрольной территории с узлами имеющими отвратительный интерконнект и неспособными обработать единый стэйт проекта на одном узле, мы увидим шокирующие адекватного CFO счета от ажура, авса и прочих гулов в  30-35% от operational costs.  Упс, технологический и экономический тупик для любителей облаков.

И когда ты считаешь затраты на серверную стойку пусть даже не нового железа, но с сильным интерконнектом на 40 Gbe для изначально правильно выбранной архитектуры с in-memory db и даже пусть отстающей персистенцией на энергонезависимые носители, то понимаешь, что ее срок окупаемости  - 1 месяц начислений от облаков. Полный и быстрый контроль над всей инфраструктурой и правильный Ux для клиентов, как минимум с точки зрения латенси. Как же хорошо жить! В мечтах.

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

Ответить
Развернуть ветку
Денис Гордиенко
Автор

Вы всё круто написали, но пример из статьи - это офлайн бизнес, а не сферический стартап в вакууме.
 
Я и показывал, что если заказы идут, то не жалко и на облако, а если нет, то нужно либо оптимизировать запросы, либо идею. 

Ответить
Развернуть ветку
Yuri Trenin

Когда ваше API дергает 1000+ клиентов, повторюсь, любой ass и любой архитектурный франкинштейн.

Когда проект капитализируется по количеству пользователей - нужно сто раз подумать, прежде чем инвестировать в разработку cloud based app.

Ответить
Развернуть ветку
Денис Гордиенко
Автор

Ну здесь скорее вопрос того во что верит архитектор проекта.

Вон Битрикс24 уже сделал выводы размещения своих ресурсов на собственных серверах в датацентре, переехали на Amazon AWS. Там явно больше 1000 онлайна. 

Уверен, есть примеры, где крупные проекты размещаются "на своих". Но мне это больше напоминает таксишные проекты, где заказчикам принципиально, чтоб сервак стоял под столом, чтоб базу не спёрли. 

Ответить
Развернуть ветку
Ванга Штанга

Не могли бы вы подробнее раскрыть "веру" архитектора? Это зависит от уровня развития- на базовом уровне свое "железо" под столом, на продвинутом уровне облачное решение?

Ответить
Развернуть ветку
Денис Гордиенко
Автор

Нет. Я специально не указал превосходство одного над другим. Это как с религией. 

Хороший проект можно сделать и на облаке и на своём сервере. И так же можно запороть в обоих случаях

Ответить
Развернуть ветку
56 комментариев
Раскрывать всегда