Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mark1708/spring-yoomoney-db-queue

Исследование влияния различных параметров таблиц в работе с очередями сообщений на основе базы данных
https://github.com/mark1708/spring-yoomoney-db-queue

db db-queue postgresql queue spring-boot

Last synced: about 2 months ago
JSON representation

Исследование влияния различных параметров таблиц в работе с очередями сообщений на основе базы данных

Awesome Lists containing this project

README

        

# spring-yoomoney-db-queue
## Тема: Исследование влияния различных параметров таблиц в работе с очередями сообщений на основе базы данных

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

Основной акцент будет сделан на оптимизацию пропускной способности очереди сообщений, с целью достичь **1000 RPS**.

### Задачи и этапы исследования
1. Разработка библиотеки для взаимодействия с базой данных в качестве брокера сообщений.
2. Подготовка базы данных для проведения экспериментов.
3. Проектирование и реализация двух сервисов - Producer и Consumer, обеспечивающих передачу и прием данных через брокера сообщений.
4. Оптимизация базы данных
5. Тестирование различных параметров таблицы и их влияния на эффективность системы.

## Результаты
Для тестирования использовалась база данных PostgreSQL.

С таблицами на которых проводились тесты можно ознакомиться в файле `sql/create_tables.sql`
* `queue_tasks_1` - Обычная таблица
* `queue_tasks_2` - Вакумация + индекс btree
* `queue_tasks_3` - Вакумация + индекс btree + fillfactor
* `queue_tasks_4` - Вакумация + индекс btree + fillfactor + партиционировани с секционированием на 6 частей
* `queue_tasks_5` - Вакумация + индекс btree + fillfactor + партиционировани с секционированием на 8 частей

### Что получилось?
| Конфигурация | Batch | RPS | Изменение | Изменение в % |
|:-----------------:|:------:|:-----------:|:------------------:|:------------------:|
| queue_tasks_1 | 1 | 334,69 | Будем считать за 0 | Будем считать за 0 |
| queue_tasks_1 | 10 | 1222,82 | 888,12 | 265,35 |
| queue_tasks_2 | 10 | 1275,85 | 941,15 | 281,20 |
| queue_tasks_3 | 10 | 1230,76 | 896,06 | 267,73 |
| queue_tasks_4 | 10 | 1310,81 | 976,11 | 291,64 |
| **queue_tasks_5** | **10** | **1314,12** | **979,42** | **292,63** |
| queue_tasks_5 | 20 | 1289,58 | 954,88 | 285,30 |
> Тестирование проводилось в достаточно щадящем режиме)

Как можно заметить самым эффективным вариантом оказалось использование сетапа таблицы `queue_tasks_5` с записью/чтением батчами по **10** записей.

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




Рисунок 1. Задержка (min/avg/max)




Рисунок 2. Кол-во запросов в секунду

### Преимущества и недостатки подхода
Преимущества:
* Низкая стоимость масштабирования.
* Достойная пропускная способность.
* Гибкая платформа для реализации разных способов взаимодействия с очередью сообщений.

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

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

## Инструкция по запуску
```shell
docker compose up -d
```

## Технологии
* Spring-Boot 3
* Java 21
* PostgreSQL
* [db-queue](https://github.com/db-queue/db-queue)

## Статус
Проект _закончен_

## Цель
Проект сделан в образовательных целях

## Контакты
Выполнен [Гурьяновым Марком](https://mark1708.github.io/) под чутким руководством [kartzum](https://github.com/kartzum)
#### +7(962)024-50-04 | [email protected] | [github](http://github.com/Mark1708)

![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=Mark1708&repo=spring-yoomoney-db-queue&theme=chartreuse-dark&show_icons=true)