You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Практика с Docker и Docker Compose, докеризация Spring Boot приложение (упаковка его в Docker образ)
38
37
- Знакомство и практика с брокером сообщений Kafka
39
38
- Самостоятельная разработка части схемы REST API
39
+
- Интеграция с LLM/AI
40
40
41
41
Дисклеймер. Планировщик задач - довольно простой и легковесный проект для микросервисного подхода. Но проект достаточной сложности вышел бы за рамки учебного по объёму и сложности.
42
42
@@ -56,11 +56,11 @@ weight = 7
56
56
57
57
Оповещение пользователей по email:
58
58
- Приветственное письмо
59
-
- Каждый день в полночь оповещение о том, сколько задач было сделано за прошедшие сутки, и какое количество осталось невыполненными
59
+
- Каждый день в полночь отчёт о том, какие задачи были сделаны за прошедшие сутки, какое количество осталось невыполненными
60
60
61
61
## Интерфейс приложения
62
62
63
-
Веб-приложение является одностраничным, всё общение с сервером происходит с помощью JavaScript/Ajax, интерфейс обновляется через jQuery.
63
+
Веб-приложение является одностраничным, всё общение с сервером происходит с помощью JavaScript/Ajax, интерфейс обновляется динамически.
64
64
65
65
- Заголовок
66
66
- Для неавторизованных пользователей - кнопки регистрации и авторизации
@@ -80,14 +80,13 @@ weight = 7
80
80
- Чекбокс, чтобы пометить задачу сделанной (и обратно - пометить несделанной)
81
81
- Кнопка "удалить"
82
82
83
-
84
83
У формы модального окна нет кнопки "сохранить". JavaScript должен сохранять состояние задачи с помощью Ajax запросов, каждый раз когда пользователь нажимает на чекбокс, или редактирует поля ввода.
85
84
86
85
## SQL база данных
87
86
88
87
В этом проекте студент самостоятельно разрабатывает структуру базы данных для хранения пользователей и задач. Отношение между пользователем и задачами - один ко многим.
89
88
90
-
Как и в предыдущем проекте, в таблице `Users` ориентироваться стоит на интеграцию с Spring Security. Эта библиотека экосистемы Spring подразумевает определённые атрибуты, которыми должен обладать пользователь, и список которых и станет основой колонок для таблицы.
89
+
Как и в предыдущем проекте, в таблице `Users` ориентироваться стоит на интеграцию с Spring Security. Эта библиотека экосистемы Spring подразумевает определённые атрибуты, которыми должен обладать пользователь, и список которых станет основой колонок для таблицы.
91
90
92
91
Таблица `Tasks` должна содержать поля для описания заметки - заголовок, текст, владелец, статус, и время (timestamp), когда задача была помечена как сделанная.
93
92
@@ -155,17 +154,19 @@ Spring Boot приложение, реализующее REST API для раб
155
154
156
155
### Фронтенд
157
156
158
-
Набор статических файлов:
159
-
- HTML разметка структуры главной страницы (динамические данные вставляются через JavaScript/jQuery)
160
-
- CSS
161
-
- JavaScript
157
+
Предлагаю ограничиться разработкой REST API. А для использования функционала проекта реализовать коллекцию REST запросов через Postman, REST Client в Intellij IDEA или аналогичный инструмент.
158
+
159
+
Альтернативно, по желанию, вы можете реализовать веб-приложение на React/Vue/Angular.
160
+
161
+
### Summarization сервис
162
+
163
+
Составление отчета по задачам через LLM.
164
+
165
+
Необходимо написать отдельный сервис, который будет интегрироваться с LLM по API и делать суммаризацию - генерировать отчет по итогам дня, сделанным и несделанным задачам.
162
166
163
-
При разработке, файлы можно раздавать локальным сервером встроенным в Intellij IDEA. В контексте Docker Compose стека, образ фронтенд сервиса будет содержать веб-сервер Nginx, раздающий статику.
167
+
Сервис принимает сообщение через кафку с данными по задачам за определенный период, полученный результат он также отправляет в кафку инициирующему сервису, реализуя паттерн RPC.
164
168
165
-
- При загрузке страницы, JavaScript делает запрос на получение текущего пользователя. Ответ 401 HTTP означает, что пользователь неавторизован, 200 - авторизован. Для авторизованного пользователя мы можем запросить и отобразить список задач
166
-
Работа с JavaScript/Ajax:
167
-
- Формы авторизации и регистрации должны быть сверстаны с помощью тега `form`, но вместо обработчика по-умолчанию (POST запрос и перезагрузка страницы), jQuery будет переопределять обработчик, исполнять POST запрос через Ajax и реагировать на результат, в соответствии с кодом ошибки
168
-
- Веб-страница и REST API будут доступны на разных портах - 80 и 8080. Для вызова методов REST API через Ajax может потребоваться выдача разрешения браузеру через CORS - https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
169
+
Также данный сервис может иметь свой отдельный экземпляр базы данных для хранения обработанных запросов и результатов.
169
170
170
171
### Рассыльщик писем
171
172
@@ -179,13 +180,12 @@ Spring Boot приложение с двумя модулями - Spring Mail и
179
180
180
181
Spring Boot приложение с двумя модулями - Spring Scheduler и Spring Kafka.
181
182
182
-
Задача сервиса - раз в сутки итерировать всех пользователей, и формировать для них отчёты о задачах и изменениях в них за сутки.
183
+
Задача сервиса - раз в сутки итерировать всех пользователей, и формировать для них отчёты о задачах и изменениях в них за сутки. Отчёт генерируется LLM через Summarization сервис
183
184
184
-
- Пользователям, у которых на конец дня есть невыполненные задача, отправляется емейл вида "У вас осталось N несделанных задач". Тело письма содержит заголовки этих задач (не более какого-то разумного количества, например 5)
185
-
- Пользователям, у которых за последние сутки 1 или более задач были отмечены как сделанные, отправляется емейл вида "За сегодня вы выполнили N задач". Тело письма содержит заголовки выполненных задач
186
-
- Пользователям, для которых верны оба условия выше, отправляется емейл и со списком несделанных, и сделанных за последние сутки задач
187
-
188
-
Spring Scheduler по Cron выражению каждую полночь вызывает метод, читающий список пользователей, анализирующий их заметки, и формирующий емейлы для отправки. Сформированные емейлы упаковываются в классы-модели и отправляются в Kafka топик.
185
+
Планировщик является оркестратором данного процесса:
186
+
- По расписанию находит всех пользователей, у которых есть сделанные за последние сутки задачи, и(или) остались несделанные
187
+
- Для каждого пользователя генерируем отчёт, запросив его по Kafka RPC у Summarization сервиса
188
+
- Сформированный отчёт, готовый к отправке, упаковываются в DTO и пересылается к сервис-рассыльщик писем через Kafka топик
189
189
190
190
## Работа с Kafka
191
191
@@ -194,13 +194,24 @@ Kafka в контексте Docker Compose стека запускается о
194
194
- Задачи для отправки емейлов будут попадать в топик `EMAIL_SENDING_TASKS`
195
195
- Бэкенд сервис и планировщик записывают сообщения в топик, рассыльщик писем - читает
196
196
- Формат сообщений - JSON, сереализуемый и десериализуемый по модели, описанной с помощью класса Java, подобно моделям для контроллеров REST API. Сообщения в топике `EMAIL_SENDING_TASKS` должны содержать следующие поля - адрес получателя, заголовок и текст письма
197
+
- Отдельно, необходимы топики для RPC общения планировщика с Summarization сервисом по RPC
197
198
- Для интеграции Spring c Kafka можно использовать модуль Spring Kafka
198
199
199
-
## Mailjet
200
+
## Работа с LLM
201
+
202
+
Предполагается напрямую интегрироваться с API LLM по HTTP, можно выбрать:
203
+
- Прямое использование [OpenAI API](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create)
204
+
- Прокси сервисы - [пример](https://aitunnel.ru/)
205
+
- Доступные в РФ LLM - [GigaCode](https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/post-chat), [YaGPT](https://aistudio.yandex.ru/docs/ru/ai-studio/concepts/api.html)
206
+
207
+
Необходимо поработать над системным промптом, предоставить желаемый формат и примеры, поработать с контекстом модели.
208
+
Предполагается прямое использование API, не используя SDK или библиотеки для агентов. Практикуемся работать с внешним API.
209
+
210
+
## Сервис для отправки писем
200
211
201
-
Для отправки SMTP нужны логин, пароль, хост и порт SMTP сервера. У емейл сервисов, например Gmail, mail.ru, есть SMTP сервера, с которыми работают емейл-клиенты. Теоретически, можно воспользоваться их сервером, и отправлять письма, авторизовываясь логином и паролем своего ящика, но в реальности, для писем и рассылок обычно пользуются специальными для этого созданными сервисами, например Mailjet, Mailchimp, Mailgun (и десятками аналогичных).
212
+
Для отправки SMTP нужны логин, пароль, хост и порт SMTP сервера. У емейл сервисов, например Gmail, mail.ru, есть SMTP сервера, с которыми работают емейл-клиенты. Теоретически, можно воспользоваться их сервером, и отправлять письма, авторизовываясь логином и паролем своего ящика, но в реальности, для писем и рассылок обычно пользуются специальными для этого созданными сервисами, например Unisender, Mailchimp, Mailgun (и десятками аналогичных).
202
213
203
-
Для примера рассмотрим [Mailjet](https://www.mailjet.com/). Бесплатный лимит сервиса - 200 писем на отправку в сутки. Необходимо зарегистрироваться там, сконфигурировать sender адрес (адрес отправителя писем), получить credentials (логин и пароль) и остальные SMTP настройки.
214
+
Предлагаю использовать [Unisender](https://www.unisender.com/). Необходимо зарегистрироваться там, сконфигурировать sender адрес (адрес отправителя писем), получить credentials (логин и пароль) и остальные настройки.
204
215
205
216
Логин и пароль - секретные данные, которые не должны попасть в git репозиторий. При запуске приложения из IDE или Docker Compose стека, секреты можно подключить к приложению через переменные окружения.
206
217
@@ -215,9 +226,9 @@ Kafka в контексте Docker Compose стека запускается о
215
226
216
227
Сервисы:
217
228
- task-tracker-backend (порт 8080)
218
-
- task-tracker-frontend (порт 80)
219
229
- task-tracker-scheduler
220
230
- task-tracker-email-sender
231
+
- task-tracker-summarization-server
221
232
- Postgres
222
233
- Kafka
223
234
@@ -234,7 +245,7 @@ Kafka в контексте Docker Compose стека запускается о
234
245
Приложение целиком будем деплоить через Docker.
235
246
236
247
Шаги:
237
-
- С помощью GitHub Actions (детали ниже) автоматизировать сборку докер образов для сервисов task-tracker-backend, task-tracker-frontend, task-tracker-scheduler, task-tracker-email-sender
248
+
- С помощью GitHub Actions (детали ниже) автоматизировать сборку докер образов для сервисов проекта
238
249
- В хостинг-провайдере по выбору арендовать облачный сервер на Linux
239
250
- Установить Docker
240
251
- Скопировать на удалённый сервер Docker Compose файл для запуска сервисов приложения, запустить
@@ -255,17 +266,16 @@ Kafka в контексте Docker Compose стека запускается о
255
266
- Docker Compose - добавить Postgres, Kafka
256
267
- Backend - работа с пользователями
257
268
- Backend - работа с JWT, авторизация
258
-
- Frontend - структура страницы, интерфейс и Javascript для регистрации и авторизации
259
269
- Backend - работа с задачами
260
-
- Frontend - листинг, добавление, редактирование, удаление задач
261
270
- Email sender - реализация получения сообщений от Kafka и отправки емейлов
262
-
- Backend - отправка приветственного письма при регистрации
271
+
- Отправка приветственного письма при регистрации
272
+
- Summarization сервис
263
273
- Scheduler - отправка пользовательских отчетов по сделанным и оставшимся задачам
264
274
- CI/CD, деплой
265
275
266
276
## Ресурсы для работы над ошибками
267
277
268
-
-[Реализации проекта](../finished-projects/task-tracker.md.md) другими студентами и мои ревью этих реализаций
278
+
-[Реализации проекта](../finished-projects/task-tracker.md.md) другими студентами и ревью этих реализаций
0 commit comments