Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Kotlin ###
.kotlin
/src/main/resources/config/application-local.yaml
Binary file removed .gradle/8.4/checksums/checksums.lock
Binary file not shown.
Binary file removed .gradle/8.4/checksums/md5-checksums.bin
Binary file not shown.
Binary file removed .gradle/8.4/checksums/sha1-checksums.bin
Binary file not shown.
Binary file not shown.
Empty file.
Binary file removed .gradle/8.4/executionHistory/executionHistory.bin
Binary file not shown.
Binary file removed .gradle/8.4/executionHistory/executionHistory.lock
Binary file not shown.
Binary file removed .gradle/8.4/fileChanges/last-build.bin
Binary file not shown.
Binary file removed .gradle/8.4/fileHashes/fileHashes.bin
Binary file not shown.
Binary file removed .gradle/8.4/fileHashes/fileHashes.lock
Binary file not shown.
Binary file removed .gradle/8.4/fileHashes/resourceHashesCache.bin
Binary file not shown.
Empty file removed .gradle/8.4/gc.properties
Empty file.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
4 changes: 2 additions & 2 deletions .gradle/buildOutputCleanup/cache.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#Tue Apr 09 14:58:45 MSK 2024
gradle.version=8.4
#Mon Nov 24 00:28:32 MSK 2025
gradle.version=8.14
Binary file modified .gradle/buildOutputCleanup/outputFiles.bin
Binary file not shown.
Binary file modified .gradle/file-system.probe
Binary file not shown.
6 changes: 6 additions & 0 deletions .idea/amplicode-jpa.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions .idea/git_toolbox_prj.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions .idea/libraries/KotlinJavaRuntime.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 0 additions & 9 deletions .idea/modules.xml

This file was deleted.

55 changes: 17 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,25 @@
# Распределенная обработка текстовых данных с использованием брокера сообщений
# 🤖 DUMB-MQ — Distributed Understanding of Messy Blocks of text with Message Queues

## Цель задания:
Реализовать распределённую систему обработки текстовых данных, где секции текста рассылаются на обработку через брокер сообщений (message broker). Несколько воркеров параллельно обрабатывают секции и отправляют результаты на агрегатор. Воркеры выполняют набор задач
> **DUMB-MQ** — потому что *your text is messy*, but the system isn’t.
> (Spoiler: DUMB stands for **D**istributed **U**nderstanding of **M**essy **B**locks of text — and no, *we’re not the
dumb ones*.)

## Шаги выполнения:
---

### Рекомендуемый брокер
RabbitMQ --- прост в развёртывании, понятная модель exchange/queue, есть клиенты для Java и C++. Подходит для предлагаемой задачи.
## 📡 What is DUMB-MQ?

### Подготовка данных:
Загрузите или создайте набор текстовых данных. Это могут быть, например, книги, статьи или большой корпус текста. Разделите данные на секции для распределения между узлами.
**DUMB-MQ** — это распределённая система обработки текстовых данных, построенная на архитектуре брокеров сообщений.
Она берёт *хаотичные, грязные, непонятные* текстовые блоки — и превращает их в *структурированную, осмысленную*
информацию.
И делает это быстро, масштабируемо и с чувством стиля.
---

### Разработка приложения:
Общая задача: Необходимо решить следующие задачи для обработки текстовых данных:
* Подсчёт количества слов.
* Поиск N наиболее часто встречающихся слов (top-N).
* Простой анализ тональности — выбрать и реализовать один из подходов:
* Лексиконный (словарь положительных/отрицательных слов) — прост в реализации.
* Наивный байес/предобученная модель.
* Замена всех имён в тексте на заданное подстановку. Для простоты можно:
* Использовать регулярные выражения (заглавные слова, контекст) или
* Подключить лёгкую NER-библиотеку (в Java — OpenNLP или StanfordNLP — опционально).
* Сортировка предложений по длине (в символах) и возврат отсортированного списка.
# todo

### Структура системы (компоненты)
1. Producer / Splitter
* Читает корпус, разбивает на секции (например, по параграфам, по N предложений или по байтам).
* Отправляет задания в очередь/exchange (сообщения с id задания и секцией текста).
## 🚀 Quick Start

2. Worker (несколько экземпляров)
* Подписывается на очередь задач.
* Обрабатывает секцию и отправляет результат в очередь результатов/на агрегатор.
1. Запусти брокер (например, Kafka):

3. Aggregator / Collector
* Получает частичные результаты от всех воркеров.
* Агрегирует: суммирует word counts, объединяет топ-N (merge топов), усредняет/агрегирует тональность, собирает модифицированный текст/заменённые имена (если нужно), объединяет отсортированные предложения (опционально — сохраняет per-section).

4. Result sink / storage
* Сохраняет финальные результаты в файл/JSON для отчёта.

### Формат сообщений можете придумать самостоятельно


## Эксперименты и анализ результатов:
Оцените масштабируемость приложения. Используйте различные объемы данных и количество воркеров для определения, насколько эффективно приложение масштабируется.
```bash
docker-compose up -d kafka
```
47 changes: 36 additions & 11 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,29 +1,54 @@
plugins {
kotlin("jvm") version "1.9.20"
val kotlinVersion = "1.9.20"
kotlin("jvm") version kotlinVersion
kotlin("plugin.spring") version kotlinVersion

id("org.springframework.boot") version "3.4.5"
id("io.spring.dependency-management") version "1.1.0"
application
}

group = "org.itmo"
group = "org.quicklybly.dumbmq"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}

dependencies {
implementation("javax.jms:jms-api:2.0.1")
implementation("org.apache.activemq:activemq-broker:6.1.1")
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation")

implementation("org.springframework.boot:spring-boot-starter-amqp")

implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")

implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

val stanfordNlpVersion = "4.5.4"
implementation("edu.stanford.nlp:stanford-corenlp:$stanfordNlpVersion")
implementation("edu.stanford.nlp:stanford-corenlp:$stanfordNlpVersion:models")

testImplementation(kotlin("test"))
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
testImplementation("org.assertj:assertj-core:3.24.2")
}

tasks.test {
useJUnitPlatform()
tasks {
test {
jvmArgs("-Xmx8g")
useJUnitPlatform()
}

wrapper {
gradleVersion = "8.14.10"
distributionType = Wrapper.DistributionType.BIN
}
}

kotlin {
jvmToolchain(8)
jvmToolchain(21)
}

application {
mainClass.set("MainKt")
}
16 changes: 16 additions & 0 deletions docker/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
version: '3.8'

services:
rabbitmq:
image: rabbitmq:3.12-management
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq

volumes:
rabbitmq_data:
61 changes: 61 additions & 0 deletions docs/TASK.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/QODoQuhO)

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

## Цель задания:

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

## Шаги выполнения:

### Рекомендуемый брокер

RabbitMQ --- прост в развёртывании, понятная модель exchange/queue, есть клиенты для Java и C++. Подходит для
предлагаемой задачи.

### Подготовка данных:

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

### Разработка приложения:

Общая задача: Необходимо решить следующие задачи для обработки текстовых данных:

* Подсчёт количества слов.
* Поиск N наиболее часто встречающихся слов (top-N).
* Простой анализ тональности — выбрать и реализовать один из подходов:
* Лексиконный (словарь положительных/отрицательных слов) — прост в реализации.
* Наивный байес/предобученная модель.
* Замена всех имён в тексте на заданное подстановку. Для простоты можно:
* Использовать регулярные выражения (заглавные слова, контекст) или
* Подключить лёгкую NER-библиотеку (в Java — OpenNLP или StanfordNLP — опционально).
* Сортировка предложений по длине (в символах) и возврат отсортированного списка.

### Структура системы (компоненты)

1. Producer / Splitter
* Читает корпус, разбивает на секции (например, по параграфам, по N предложений или по байтам).
* Отправляет задания в очередь/exchange (сообщения с id задания и секцией текста).

2. Worker (несколько экземпляров)
* Подписывается на очередь задач.
* Обрабатывает секцию и отправляет результат в очередь результатов/на агрегатор.

3. Aggregator / Collector
* Получает частичные результаты от всех воркеров.
* Агрегирует: суммирует word counts, объединяет топ-N (merge топов), усредняет/агрегирует тональность, собирает
модифицированный текст/заменённые имена (если нужно), объединяет отсортированные предложения (опционально —
сохраняет per-section).

4. Result sink / storage
* Сохраняет финальные результаты в файл/JSON для отчёта.

### Формат сообщений можете придумать самостоятельно

## Эксперименты и анализ результатов:

Оцените масштабируемость приложения. Используйте различные объемы данных и количество воркеров для определения,
насколько эффективно приложение масштабируется.
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.gradle.jvmargs=-Xmx8g -XX:+UseG1GC -Dfile.encoding=UTF-8
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
Loading