RSS

Комментарии

Если классическое решения не ваша история и базовые предложения на рынке только усложняют работу вашего бизнеса – выход точно есть.

Сделать MVP (простую версию) для своего проекта – отличная альтернатива дорогостоящим ИТ-разработкам и при этом полностью реализует весь потенциал вашего бизнеса, решая попутно все приходящие задачи.

Особенно если исполнитель обладает большим опытом создания CRM для различных видов бизнеса и понимает, что именно нужно клиенту (и без розовых пони).
В своей работе я постоянно сталкиваюсь с талантливыми и успешными бизнесменами, которые хороши в своей нише. Перед любым предпринимателем в определенный момент развития встаёт вопрос о масштабировании его бизнеса. И ему реально сложно принимать решения о том, как рост его бизнеса можно поддержать с точки зрения ИТ.

В поисках решения для автоматизации бизнеса собственники часто:

— покупают готовые программы и потом не знают, как к ним подобраться, используют 10% функционала, а нужных функций и вовсе нет;

— вкладываются по полной и нанимают ИТ команду или создают целый отдел;

— изучают nocode решения и пытаются сделать свою первую CRM систему своими руками;

— не найдя подходящего решения – ведут свои отчёты и финансы на коленке и в гугл-таблицах.

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

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

Обычно, у заказчика нет цели иметь свою СРМ-систему, как правило, обращаются ко мне совсем с другим запросом: есть проблема, которую нужно решить раз и навсегда. Заказчик не знает, чем именно ему может помочь программист, поэтому и ТЗ составить не в силах. Часто предприниматели не имеют представления о возможностях ИТ, да им и незачем. А с MVP они просто получают готовое решение под конкретную задачу с минимальными затратами.
По идее, хранилище для данных нужно выбирать исходя из тех данных, которые нужно хранить. Чтобы понять, что и как должно храниться, нужно построить модель предметной области, в которой обозначить потоки движения данных и отношения между сущностями.

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

Есть базы данных общего назначения, которые все знают — MySQL и PostgreSQL. Они применяются на большинстве проектов и при правильном обращении их вполне достаточно. Если перечислять специализированные решения, то получится большой список из десятков проектов. Наиболее популярные — это MongoDB, Redis (у Mail.ru есть своя NoSQL база данных Tarantool, которая тоже показывает неплохие результаты). Однако, для большинства проектов в общем случае будет достаточно стандартных MySQL или PostgreSQL.

База данных — это все-таки не просто слой хранения данных и инструмент. Это ответственность за данные, рискованным экспериментам здесь, скорее всего, не место. Отсюда следует, что очень важна экосистема вокруг проекта — то, что заставляет его развиваться. Важно большое сообщество, которое может помочь с решением практически любой задачи. Поэтому лучше пользоваться продуктами с хорошей поддержкой. Ну, это все лирика, давайте перейдем к более практическим темам.
Ранее я описывал подходы масштабирования фронтэнда и масштабирования бэкенда и теперь настал черед немного поговорить о наиболее важной части — масштабировании базы данных.

Масштабирование базы данных

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

Давайте кратко вспомним какие основные модели хранения данных обычно используют.

— Реляционные базы данных — все данные хранятся в виде набора отношений, связанных между собой данных.
— Иерархические базы данных — данные хранятся в объектах в виде отношений между этими объектами.
— Сетевые базы данных — данные хранятся в структуре в виде графа.
— Объектно-ориентированные базы данных — данные храняться в виде моделей объектов.

Выбор и использование модели базы данных зависит от самих данных и все вопросы, которые касаются работы с данными, должны решаться на стадии выбора способа хранения данных.

С ростом количества пользователей, растет и количество данных, а соответственно и количество запросов и действий для работы с этими данными.

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

Шардинг базы данных

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

Репликация

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

Репликация — это осуществление связи между серверами баз данных, перенос данных между этими серверами в тот момент, когда данные добавляются. При выходе из строя одного сервера базы данных, к работе подключается другой сервер, с точно такими же данными и все продолжает работать. Когда нерабочий сервер восстанавливается в работе, он вновь подключается для репликации и на него копируются данные добавленные в момент выхода из строя.Более подробней о репликации можно почитать в моем посте о репликации данных в MongoDB.

Партиционирование

Еще один метод масштабирования базы данных — партиционирование. Партиционирование — это функциональное разделение базы данных на некие отдельные места хранения: в разных таблицах, в разных типах баз данных (одни данные в MySQL, другие в MongoDB), в разных моделях хранения данных.

Денормализация

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

Масштабирование базы данных

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

Давайте кратко вспомним какие основные модели хранения данных обычно используют.

— Реляционные базы данных — все данные хранятся в виде набора отношений, связанных между собой данных.
— Иерархические базы данных — данные хранятся в объектах в виде отношений между этими объектами.
— Сетевые базы данных — данные хранятся в структуре в виде графа.
— Объектно-ориентированные базы данных — данные храняться в виде моделей объектов.

Выбор и использование модели базы данных зависит от самих данных и все вопросы, которые касаются работы с данными, должны решаться на стадии выбора способа хранения данных.

С ростом количества пользователей, растет и количество данных, а соответственно и количество запросов и действий для работы с этими данными.

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

Шардинг базы данных

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

Репликация

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

Репликация — это осуществление связи между серверами баз данных, перенос данных между этими серверами в тот момент, когда данные добавляются. При выходе из строя одного сервера базы данных, к работе подключается другой сервер, с точно такими же данными и все продолжает работать. Когда нерабочий сервер восстанавливается в работе, он вновь подключается для репликации и на него копируются данные добавленные в момент выхода из строя.Более подробней о репликации можно почитать в моем посте о репликации данных в MongoDB.

Партиционирование

Еще один метод масштабирования базы данных — партиционирование. Партиционирование — это функциональное разделение базы данных на некие отдельные места хранения: в разных таблицах, в разных типах баз данных (одни данные в MySQL, другие в MongoDB), в разных моделях хранения данных.

Денормализация

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

Масштабирование базы данных

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

Давайте кратко вспомним какие основные модели хранения данных обычно используют.

— Реляционные базы данных — все данные хранятся в виде набора отношений, связанных между собой данных.
— Иерархические базы данных — данные хранятся в объектах в виде отношений между этими объектами.
— Сетевые базы данных — данные хранятся в структуре в виде графа.
— Объектно-ориентированные базы данных — данные храняться в виде моделей объектов.

Выбор и использование модели базы данных зависит от самих данных и все вопросы, которые касаются работы с данными, должны решаться на стадии выбора способа хранения данных.

С ростом количества пользователей, растет и количество данных, а соответственно и количество запросов и действий для работы с этими данными.

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

Шардинг базы данных

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

Репликация

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

Репликация — это осуществление связи между серверами баз данных, перенос данных между этими серверами в тот момент, когда данные добавляются. При выходе из строя одного сервера базы данных, к работе подключается другой сервер, с точно такими же данными и все продолжает работать. Когда нерабочий сервер восстанавливается в работе, он вновь подключается для репликации и на него копируются данные добавленные в момент выхода из строя.Более подробней о репликации можно почитать в моем посте о репликации данных в MongoDB.

Партиционирование

Еще один метод масштабирования базы данных — партиционирование. Партиционирование — это функциональное разделение базы данных на некие отдельные места хранения: в разных таблицах, в разных типах баз данных (одни данные в MySQL, другие в MongoDB), в разных моделях хранения данных.

Денормализация

В некоторых случаях, разработчики прибегают к использованию денормализации для обеспечения быстрого доступа к данным. Денормализация — это когда данных дублируются при сохранении. Например, при создании поста для сайта, производится добавление тегов к этому посту. Вместо того, чтобы сохранять теги в отдельную таблицу, проверяя каждый раз тег на существование, чтобы не плодить дубли текста, а связь с постами и тегами во вторую таблицу, при денормализации все добавляет в одну таблицу, дублируя каждый раз текст. В некоторых случаях, денормализация данных приемлема, в остальных от нее лучше отказаться.
Итак, я сам пытался понять реальную разницу, когда дело доходит до NoSQL против RDBMS, и всегда получал ответ, который не совсем соответствовал этому. В моем поиске действительно есть 2 основных различия между NoSQL и SQL, и только 1 является истинным преимуществом.

ACID против BASE — NoSQL обычно не учитывает некоторые функции ACID SQL, своего рода «обманывая» его путь к повышению производительности, оставляя этот уровень абстракции программисту. Об этом уже говорилось в предыдущих постерах.

Горизонтальное масштабирование — Реальным преимуществом NoSQL является горизонтальное масштабирование, оно же сегментирование. Учитывая, что «документы» NoSQL являются своего рода «автономным» объектом, объекты могут находиться на разных серверах, не беспокоясь о соединении строк с нескольких серверов, как в случае с реляционной моделью.

Допустим, мы хотим вернуть объект, подобный этому:
post {
    id: 1
    title: 'My post'
    content: 'The content'
    comments: {
      comment: {
        id: 1
      }
      comment: {
        id: 2
      }
      ...
 
    views: {
      view: {
        user: 1
      }
      view: {
        user: 2
      }
      ...
    }
}


В NoSQL этот объект в основном хранится как есть и, следовательно, может находиться на одном сервере как своего рода автономный объект, без какой-либо необходимости объединяться с данными из других таблиц, которые могут находиться на других серверах БД.

Однако при использовании реляционных баз данных к сообщению необходимо будет присоединять комментарии из comments таблицы, а также представления из views таблицы. Это не было бы проблемой в SQL ~ ДО ~ тех пор, пока БД не будет разбита на сегменты, и в этом случае «комментарий 1» может находиться на одном сервере БД, а «комментарий 2» — на другом сервере БД. Это значительно затрудняет создание того же объекта в RDBMS, масштабируемой по горизонтали, чем в NoSQL DB.

Кто-нибудь из экспертов по БД подтвердит или оспорит эти тезисы?
Типичные RDBMs дают надежные гарантии согласованности. Это требует в некоторой степени взаимодействия между узлами для каждой транзакции. Это ограничивает возможности масштабирования, поскольку чем больше узлов, тем больше коммуникаций.

Системы NoSQL используют разные компромиссы. Например, они не гарантируют, что второй сеанс сразу увидит данные, переданные первым сеансом. Тем самым отделяя транзакцию хранения некоторых данных от процесса предоставления этих данных каждому пользователю. Google «в конечном итоге согласован». Таким образом, одной транзакции не нужно ждать какого-либо (или гораздо меньшего) взаимодействия между узлами. Следовательно, они могут гораздо проще использовать большое количество узлов.
Почему NoSQL лучше «масштабируется», чем RDBMS?

Я прочитал следующий текст в DST клубе, в котором обсуждаются преимущества и недостатки NoSQL:

«В течение многих лет, чтобы повысить производительность серверов баз данных, администраторам баз данных приходилось покупать серверы большего размера по мере увеличения нагрузки на базу данных (масштабирование) вместо распределения базы данных по нескольким “хостам” по мере увеличения нагрузки (масштабирование). RDBMS обычно нелегко масштабируются, но новые базы данных NoSQL на самом деле рассчитаны на легкое расширение для использования преимуществ новых узлов и обычно разрабатываются с учетом недорогого стандартного оборудования.»

Я запутался в масштабируемости RDBMS и NoSQL.

Мое замешательство заключается в следующем:

— Почему RDBMS менее способны к масштабированию? И причина покупки серверов большего размера вместо покупки более дешевых.
— Почему NoSQL лучше поддается масштабированию?
Если уточнить и расширить список фреймворков для микросервисов:

1. Java

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Java:

— Spring Boot — Spring Boot — это популярный фреймворк микросервисов на Java. Позволяет создавать как небольшие, так и крупномасштабные приложения. Spring boot легко интегрируется с другими популярными фреймворками с помощью инверсии управления.

— Dropwizard — фреймворк Dropwizard используется для разработки удобных, высокопроизводительных и Restful веб-сервисов. Без дополнительных настроек поддерживает инструменты конфигурации, метрики приложения, протоколирования и работы.

— Restlet — фреймворк Restlet следует архитектурному стилю RST, который помогает Java-разработчикам создавать микросервисы. Принят и поддерживается Apache Software License.

— Helidon — Коллекция библиотек Java для написания микросервисов. Простой в использовании, с инструментальными возможностями, поддержкой микропрофилей, реактивным веб-сервером, наблюдаемый и отказоустойчивый.

— AxonIQ — Событийно-ориентированный фреймворк микросервисов с открытым исходным кодом, сфокусированный на Command Query Responsibility Segregation (CQRS), Domain-Driven Design (DDD) и скоринге событий.

— Micronaut — full-stack фреймворк на основе JVM для построения модульных, легко тестируемых микросервисных и бессерверных приложений. Создает полнофункциональные микросервисы, включая внедрение зависимостей, автоконфигурацию, обнаружение служб, маршрутизацию HTTP и клиент HTTP. Micronaut стремится избежать недостатков фреймворков Spring, Spring Boot, обеспечивая более быстрое время запуска, уменьшение объема памяти, минимальное использование рефлексии и спокойное юнит-тестирование.

— Lagom — Реактивный фреймворк микросервисов с открытым исходным кодом для Java или Scala. Lagom базируется на Akka и Play.

2. GoLang

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Go

— GoMicro — подключаемая библиотека RPC предоставляет фундаментальные строительные блоки для написания микросервисов на языке Go. Поддерживаются API-шлюз, интерактивный CLI, сервисный прокси, шаблоны и веб-панели.

3. Python

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Python:

— Flask — Web Server Gateway Interface (WSGI) Веб-ориентированный легкий фреймворк микросервисов на языке Python. Flask-RESTPlus — расширение для Flask, которое предоставляет поддержку для быстрого создания REST API.

— Falcon — веб-фреймворк API для построения надежных бэкендов приложений и микросервисов в Python. Фреймворк отлично работает как с асинхронным интерфейсом шлюза сервера (ASGI), так и с WSGI.

— Bottle — Быстрый, легкий и простой WSGI микросервисный веб-фреймворк на основе Python. Распространяется одним файловым модулем и не имеет зависимостей, кроме стандартной библиотеки Python.

— Nameko — Фреймворк Nameko для построения микросервисов на Python со встроенной поддержкой RPC через AMQP, асинхронных событий, HTTP GET и POST, а также WebSocket RPC.

— CherryPy — CherryPy позволяет разработчикам создавать веб-приложения, используя объектно-ориентированное программирование на Python.

4. NodeJS

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языков программирования NodeJS

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

5. .NET

ASP.Net, фреймворк, используемый для веб-разработки и делающий ее API. Микросервисы поддерживают встроенные функции, для их (микросервисов) построения и развертывания с помощью контейнеров Docker.

6. MultiLanguage

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием нескольких языков

— Spark — создание веб-приложений микросервисов с использованием Kotlin и Java. Выразительный и простой веб-фреймворк DSL на Java/Kotlin, созданный для быстрой разработки.
Если уточнить и расширить список фреймворков для микросервисов:

1. Java

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Java:

— Spring Boot — Spring Boot — это популярный фреймворк микросервисов на Java. Позволяет создавать как небольшие, так и крупномасштабные приложения. Spring boot легко интегрируется с другими популярными фреймворками с помощью инверсии управления.

— Dropwizard — фреймворк Dropwizard используется для разработки удобных, высокопроизводительных и Restful веб-сервисов. Без дополнительных настроек поддерживает инструменты конфигурации, метрики приложения, протоколирования и работы.

— Restlet — фреймворк Restlet следует архитектурному стилю RST, который помогает Java-разработчикам создавать микросервисы. Принят и поддерживается Apache Software License.

— Helidon — Коллекция библиотек Java для написания микросервисов. Простой в использовании, с инструментальными возможностями, поддержкой микропрофилей, реактивным веб-сервером, наблюдаемый и отказоустойчивый.

— AxonIQ — Событийно-ориентированный фреймворк микросервисов с открытым исходным кодом, сфокусированный на Command Query Responsibility Segregation (CQRS), Domain-Driven Design (DDD) и скоринге событий.

— Micronaut — full-stack фреймворк на основе JVM для построения модульных, легко тестируемых микросервисных и бессерверных приложений. Создает полнофункциональные микросервисы, включая внедрение зависимостей, автоконфигурацию, обнаружение служб, маршрутизацию HTTP и клиент HTTP. Micronaut стремится избежать недостатков фреймворков Spring, Spring Boot, обеспечивая более быстрое время запуска, уменьшение объема памяти, минимальное использование рефлексии и спокойное юнит-тестирование.

— Lagom — Реактивный фреймворк микросервисов с открытым исходным кодом для Java или Scala. Lagom базируется на Akka и Play.

2. GoLang

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Go

— GoMicro — подключаемая библиотека RPC предоставляет фундаментальные строительные блоки для написания микросервисов на языке Go. Поддерживаются API-шлюз, интерактивный CLI, сервисный прокси, шаблоны и веб-панели.

3. Python

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Python:

— Flask — Web Server Gateway Interface (WSGI) Веб-ориентированный легкий фреймворк микросервисов на языке Python. Flask-RESTPlus — расширение для Flask, которое предоставляет поддержку для быстрого создания REST API.

— Falcon — веб-фреймворк API для построения надежных бэкендов приложений и микросервисов в Python. Фреймворк отлично работает как с асинхронным интерфейсом шлюза сервера (ASGI), так и с WSGI.

— Bottle — Быстрый, легкий и простой WSGI микросервисный веб-фреймворк на основе Python. Распространяется одним файловым модулем и не имеет зависимостей, кроме стандартной библиотеки Python.

— Nameko — Фреймворк Nameko для построения микросервисов на Python со встроенной поддержкой RPC через AMQP, асинхронных событий, HTTP GET и POST, а также WebSocket RPC.

— CherryPy — CherryPy позволяет разработчикам создавать веб-приложения, используя объектно-ориентированное программирование на Python.

4. NodeJS

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языков программирования NodeJS

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

5. .NET

ASP.Net, фреймворк, используемый для веб-разработки и делающий ее API. Микросервисы поддерживают встроенные функции, для их (микросервисов) построения и развертывания с помощью контейнеров Docker.

6. MultiLanguage

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием нескольких языков

— Spark — создание веб-приложений микросервисов с использованием Kotlin и Java. Выразительный и простой веб-фреймворк DSL на Java/Kotlin, созданный для быстрой разработки.
Если уточнить и расширить список фреймворков для микросервисов:

1. Java

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Java:

— Spring Boot — Spring Boot — это популярный фреймворк микросервисов на Java. Позволяет создавать как небольшие, так и крупномасштабные приложения. Spring boot легко интегрируется с другими популярными фреймворками с помощью инверсии управления.

— Dropwizard — фреймворк Dropwizard используется для разработки удобных, высокопроизводительных и Restful веб-сервисов. Без дополнительных настроек поддерживает инструменты конфигурации, метрики приложения, протоколирования и работы.

— Restlet — фреймворк Restlet следует архитектурному стилю RST, который помогает Java-разработчикам создавать микросервисы. Принят и поддерживается Apache Software License.

— Helidon — Коллекция библиотек Java для написания микросервисов. Простой в использовании, с инструментальными возможностями, поддержкой микропрофилей, реактивным веб-сервером, наблюдаемый и отказоустойчивый.

— AxonIQ — Событийно-ориентированный фреймворк микросервисов с открытым исходным кодом, сфокусированный на Command Query Responsibility Segregation (CQRS), Domain-Driven Design (DDD) и скоринге событий.

— Micronaut — full-stack фреймворк на основе JVM для построения модульных, легко тестируемых микросервисных и бессерверных приложений. Создает полнофункциональные микросервисы, включая внедрение зависимостей, автоконфигурацию, обнаружение служб, маршрутизацию HTTP и клиент HTTP. Micronaut стремится избежать недостатков фреймворков Spring, Spring Boot, обеспечивая более быстрое время запуска, уменьшение объема памяти, минимальное использование рефлексии и спокойное юнит-тестирование.

— Lagom — Реактивный фреймворк микросервисов с открытым исходным кодом для Java или Scala. Lagom базируется на Akka и Play.

2. GoLang

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Go

— GoMicro — подключаемая библиотека RPC предоставляет фундаментальные строительные блоки для написания микросервисов на языке Go. Поддерживаются API-шлюз, интерактивный CLI, сервисный прокси, шаблоны и веб-панели.

3. Python

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Python:

— Flask — Web Server Gateway Interface (WSGI) Веб-ориентированный легкий фреймворк микросервисов на языке Python. Flask-RESTPlus — расширение для Flask, которое предоставляет поддержку для быстрого создания REST API.

— Falcon — веб-фреймворк API для построения надежных бэкендов приложений и микросервисов в Python. Фреймворк отлично работает как с асинхронным интерфейсом шлюза сервера (ASGI), так и с WSGI.

— Bottle — Быстрый, легкий и простой WSGI микросервисный веб-фреймворк на основе Python. Распространяется одним файловым модулем и не имеет зависимостей, кроме стандартной библиотеки Python.

— Nameko — Фреймворк Nameko для построения микросервисов на Python со встроенной поддержкой RPC через AMQP, асинхронных событий, HTTP GET и POST, а также WebSocket RPC.

— CherryPy — CherryPy позволяет разработчикам создавать веб-приложения, используя объектно-ориентированное программирование на Python.

4. NodeJS

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языков программирования NodeJS

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

5. .NET

ASP.Net, фреймворк, используемый для веб-разработки и делающий ее API. Микросервисы поддерживают встроенные функции, для их (микросервисов) построения и развертывания с помощью контейнеров Docker.

6. MultiLanguage

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием нескольких языков

— Spark — создание веб-приложений микросервисов с использованием Kotlin и Java. Выразительный и простой веб-фреймворк DSL на Java/Kotlin, созданный для быстрой разработки.
Если уточнить и расширить список фреймворков для микросервисов:

1. Java

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Java:

— Spring Boot — Spring Boot — это популярный фреймворк микросервисов на Java. Позволяет создавать как небольшие, так и крупномасштабные приложения. Spring boot легко интегрируется с другими популярными фреймворками с помощью инверсии управления.

— Dropwizard — фреймворк Dropwizard используется для разработки удобных, высокопроизводительных и Restful веб-сервисов. Без дополнительных настроек поддерживает инструменты конфигурации, метрики приложения, протоколирования и работы.

— Restlet — фреймворк Restlet следует архитектурному стилю RST, который помогает Java-разработчикам создавать микросервисы. Принят и поддерживается Apache Software License.

— Helidon — Коллекция библиотек Java для написания микросервисов. Простой в использовании, с инструментальными возможностями, поддержкой микропрофилей, реактивным веб-сервером, наблюдаемый и отказоустойчивый.

— AxonIQ — Событийно-ориентированный фреймворк микросервисов с открытым исходным кодом, сфокусированный на Command Query Responsibility Segregation (CQRS), Domain-Driven Design (DDD) и скоринге событий.

— Micronaut — full-stack фреймворк на основе JVM для построения модульных, легко тестируемых микросервисных и бессерверных приложений. Создает полнофункциональные микросервисы, включая внедрение зависимостей, автоконфигурацию, обнаружение служб, маршрутизацию HTTP и клиент HTTP. Micronaut стремится избежать недостатков фреймворков Spring, Spring Boot, обеспечивая более быстрое время запуска, уменьшение объема памяти, минимальное использование рефлексии и спокойное юнит-тестирование.

— Lagom — Реактивный фреймворк микросервисов с открытым исходным кодом для Java или Scala. Lagom базируется на Akka и Play.

2. GoLang

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Go

— GoMicro — подключаемая библиотека RPC предоставляет фундаментальные строительные блоки для написания микросервисов на языке Go. Поддерживаются API-шлюз, интерактивный CLI, сервисный прокси, шаблоны и веб-панели.

3. Python

Доступно несколько фреймворков для разработки архитектуры микросервисов с использованием языка программирования Python:

— Flask — Web Server Gateway Interface (WSGI) Веб-ориентированный легкий фреймворк микросервисов на языке Python. Flask-RESTPlus — расширение для Flask, которое предоставляет поддержку для быстрого создания REST API.

— Falcon — веб-фреймворк API для построения надежных бэкендов приложений и микросервисов в Python. Фреймворк отлично работает как с асинхронным интерфейсом шлюза сервера (ASGI), так и с WSGI.

— Bottle — Быстрый, легкий и простой WSGI микросервисный веб-фреймворк на основе Python. Распространяется одним файловым модулем и не имеет зависимостей, кроме стандартной библиотеки Python.

— Nameko — Фреймворк Nameko для построения микросервисов на Python со встроенной поддержкой RPC через AMQP, асинхронных событий, HTTP GET и POST, а также WebSocket RPC.

— CherryPy — CherryPy позволяет разработчикам создавать веб-приложения, используя объектно-ориентированное программирование на Python.

4. NodeJS

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием языков программирования NodeJS

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

5. .NET

ASP.Net, фреймворк, используемый для веб-разработки и делающий ее API. Микросервисы поддерживают встроенные функции, для их (микросервисов) построения и развертывания с помощью контейнеров Docker.

6. MultiLanguage

Существует несколько фреймворков для разработки архитектуры микросервисов с использованием нескольких языков

— Spark — создание веб-приложений микросервисов с использованием Kotlin и Java. Выразительный и простой веб-фреймворк DSL на Java/Kotlin, созданный для быстрой разработки.
У Java есть отличные пара фреймворков (vertx.io и quarkus который базируется на первом) и они более популярны чем тот же упомянутый Micronaut. Так же у Java ничего не говорится про поддержку GraalVM, а именно здесь основная битва происходит у современных Java фреймворков.
Существует множество примеров успешного масштабирования приложений, которые демонстрируют высокий уровень технологического развития и инновационности отечественных компаний. Эти примеры подтверждают, что российские разработчики и предприниматели способны создавать и развивать конкурентоспособные продукты, способные успешно масштабироваться как на внутреннем, так и на международном рынке.

Один из ярких примеров успешного масштабирования приложений – это разработка и запуск мобильного приложения «Яндекс.Такси». Это приложение было создано в 2011 году и с тех пор стало одним из самых популярных и удобных способов вызова такси в России. Благодаря высокому качеству сервиса и удобству использования, «Яндекс.Такси» быстро завоевало доверие пользователей и стало популярным не только в России, но и за ее пределами. Сегодня это приложение предоставляет свои услуги в нескольких странах и активно развивается, привлекая все больше пользователей.

Еще одним примером успешного масштабирования приложений является разработка и запуск мессенджера «Telegram». Это приложение было создано в 2013 году и с тех пор стало одним из самых популярных и безопасных способов общения в мире. Благодаря своей простоте, надежности и высокому уровню защиты данных, «Telegram» привлек миллионы пользователей со всего мира. Команда разработчиков «Telegram» активно работает над улучшением функционала и расширением возможностей приложения, что позволяет ему успешно масштабироваться и привлекать все больше пользователей.

Еще одним примером успешного масштабирования приложений является разработка и запуск онлайн-сервиса «Delivery Club». Этот сервис был создан в 2009 году и стал одним из самых популярных способов заказа еды с доставкой. Благодаря широкой сети партнеров и удобному интерфейсу, «Delivery Club» быстро завоевал популярность среди пользователей и начал активно развиваться. Сегодня этот сервис предоставляет свои услуги во многих городах России и активно расширяется за ее пределами.

Еще одним примером успешного масштабирования приложений является разработка и запуск онлайн-платформы «Wildberries». Эта платформа была создана в 2004 году и стала одной из крупнейших интернет-магазинов в России и СНГ. Благодаря широкому ассортименту товаров, удобному интерфейсу и быстрой доставке, «Wildberries» завоевал доверие миллионов пользователей и стал популярным не только в России, но и за ее пределами. Сегодня платформа «Wildberries» успешно масштабируется и продолжает привлекать все больше клиентов, предлагая им широкий выбор товаров и удобные условия покупки.
Ключевые факторы, влияющие на производительность и масштабируемость

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

— Проектирование программного обеспечения. Правильная разработка программного обеспечения имеет решающее значение для достижения масштабируемости и производительности. Такие методы, как модульность, развязка и разделение задач, могут помочь создать более удобные в обслуживании и масштабируемые приложения.
— Хранение и извлечение данных. Эффективная обработка данных необходима для масштабируемого программного обеспечения. Различные системы хранения, такие как реляционные базы данных, базы данных NoSQL и механизмы кэширования, могут использоваться для оптимизации операций хранения и извлечения данных.
— Сети. Задержка, пропускная способность и надежность сети существенно влияют на производительность программного обеспечения. Использование соответствующих сетевых протоколов, алгоритмов сжатия и сетей доставки контента (CDN) может помочь устранить узкие места сети и повысить производительность.
— Аппаратное обеспечение. Базовое оборудование, на котором работает программное обеспечение, включая серверы, хранилища и сетевые устройства, может ограничивать производительность и масштабируемость. Регулярные обновления оборудования и стратегии эффективного использования ресурсов могут помочь решить эти проблемы.
— Шаблоны пользователей: прогнозирование поведения пользователей и соответствующая разработка программного обеспечения могут значительно повысить производительность. Анализ пользовательских шаблонов для выявления часто используемых функций, пикового времени использования и распространенных узких мест может помочь в оптимизации программного обеспечения.
У вас задача, которая решается с помощью OLAP.
Поэтому копать нужно в эту сторону, решений достаточно много.
Партицируйте прямо по суткам.

Убирайте транзакции, нафиг вам тут innodb когда хватит myisam, оно на запись быстрее, у вас база write once read… тоже once.

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

На время обработки аналитики можно потюнить файловую систему и отключить flush для файлов таблиц (например ext4 data writeback и можно отключить журнал) — сильно ускоряет именно запись, особенно если много ram, это включает большой риск потери/порчи данных при сбросе ос но с другой стороны вероятность этого очень мала и как я понимаю, данные в базу и так пишутся из какого то другого хранилища, т.е. при проблеме с сервером просто перезапускается обработка за текущие сутки.

Уберите индексы на запись, все, сначала пусть идет вставка данных без их индексации, затем создаете индекс (это на порядок быстрее) и уже потом строите аналитику.

Общая аналитика должна не работать с самими данными, а с их посуточной выжимкой (возможно в результате и хранить их не придется) считай это самодельные индексы. Грубо говоря если в запросе на аналитику стоит count,max,min,… то достаточно сложить посуточные значения и для глобальных считать уже по ним… само собой если запросы с условиями и сложными группировками, то надо думать но все решаемо… грубый пример нужно считать агрегацию по часам, вот в индексы и пиши суточные значения по часам, а если надо постранично то для каждой страницы для каждых суток считаешь, потом агрегируешь уже по этим результатам.
Порекомендуйте подходящую базу данных?
День добрый.

Хотелось бы получить мнение экспертов по базам данных или кого то, кто уже работал с какими либо базами данных для Big Data.

Дано
Имеется некая аналитическая система которая работает на нескольких сайтах. Она для каждой страницы, для каждого элемента сохраняет некую статистику (к примеру, сколько раз элемент был виден, сколько раз на него кликнули и т.д., но в целом это не так важно). Все данные аггрегируются в памяти, а затем раз в сутки скидываются в табличку в БД. Затем аналитики могут генерировать отчет за определенный период для определенного сайта + определенной страницы + определенного сегмента. Либо за определенный период для определенного сайта + определенной страницы + отдельного элемента.

Структура таблицы примерно такая:
1. ID сайта
2. ID страницы
3. ID елемента
4. Дата (день)
5. ID сегмента пользователя (все пользователи поделены на некое количество разных сегментов)
6+. Все остальные поля с данными

На данный момент мы используем Amazon Aurora (MySQL 5.7) с движком InnoDB
Поля с 1-5 это первичный ключ.
Ежедневно в таблицу записывается порядка 80М строчек (но это не конечная цель, в будущем возможна запись и намного большего количества)
Запись оптимизированна и происходит блоками по 1000 строчек в каждом INSERT запросе.

Проблемы текущего подхода
1. Когда таблица пустая, то запись такого количества данных занимает несколько часов, но уже через месяц, из-за увеличения индекса, скорость падает до примерно 12 часов. Т.е. если данных будет в 2 раза больше, то уже не получится вложиться в 24 часовое окно, когда еще не закончилась запись предыдущего дня, а надо уже писать следующий.
2. Скорость генерации отчет оставляет желать лучшего. Для страницы с большим количеством элементов, генерация репорта за месяц может занимать 2-3 минуты, это слишком долго.
3. Иногда нужно удалить данные для определенного сайта, изза огромного количества данных такая процедура блокирует не только саму таблицу, но и всю БД, в которой еще много других таблиц к которым постоянно идет обращение чтение/запись. Пытались решить данную проблему партицированием, но это не особо помогло.

Какие будут предложения?
Serverless — это очень урезанный docker контейнер со своим API и временем жизни до 5 минут. При этом 1 контейнер обслуживает 1 запрос. В течении 5 минут после исполнения контейнер остается «горячим», т.е. содержит все данные после прошлого исполнения. Соответственно, если у вас память течет, то под нагрузкой память освобождаться не будет, т.к. контейнеры переиспользуются.

Кроме того, если вы хотите обслуживать внешние запросы, то нужно еще использовать прокладку в виде api gateway (за это тоже нужно платить).

Мороки с настройками тоже свои есть. Мониторить лямбды тоже задача со своими нюансами. Если у вас просто сайт/api и более-менее регулярная загрузка есть, то я бы serverless не советовал. Elastic beanstalk на самом деле удобнее и практичнее. А вот для задач вроде selenium тестирования, когда нужно 1000 тестов параллельно запустить и потом до следующего билда вам мощности не нужны — serverless это очень хорошо.

Заявка на услуги DST

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

Адрес

Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон