Добавлены разделы о ВПК, алгоритме, ИИ
This commit is contained in:
@@ -2,8 +2,7 @@
|
||||
' Увеличенный растр для вставки в отчёт (Word / печать)
|
||||
scale 3
|
||||
title
|
||||
Wallenc — старт приложения и параллельная синхронизация
|
||||
(проектное решение; фоновая синхронизация к реализации)
|
||||
Wallenc — старт приложения и фоновая синхронизация
|
||||
end title
|
||||
|
||||
skinparam defaultFontName "DejaVu Sans"
|
||||
@@ -45,32 +44,18 @@ partition "**Основной поток (UI)**" {
|
||||
fork
|
||||
partition "**Фон: синхронизация (по таймеру)**" #E8F5E9 {
|
||||
note right
|
||||
**Проектная механика (не реализовано в коде)**
|
||||
• Таймер / WorkManager Android
|
||||
• Таблица в Room: UUID **storage_id**
|
||||
для очереди синхронизации
|
||||
• Для каждого storage — **история коммитов**
|
||||
(аналог git): дерево/цепочка снимков
|
||||
• Сервис: сравнение коммитов
|
||||
локально vs удалённо → вычисление diff
|
||||
• Применение изменений →
|
||||
**одинаковое зашифрованное содержимое**
|
||||
на клиенте и у провайдера
|
||||
(ключи на сервер не передаются)
|
||||
**Реализовано:** StorageSyncEngine,
|
||||
журнал изменений по путям, merge ревизий
|
||||
• Room: DbStorageSyncGroup (UUID группы)
|
||||
• WorkManager / debounce — запуск sync
|
||||
• Ключи шифрования провайдеру не передаются
|
||||
Подробный алгоритм — гл. 4, рис. 35
|
||||
end note
|
||||
:По срабатыванию таймера:
|
||||
запуск **SyncService** / Worker;
|
||||
:Чтение из БД списка
|
||||
**UUID storage** из очереди;
|
||||
while (Есть необработанный UUID?) is (да)
|
||||
:Загрузить историю **коммитов**
|
||||
для этого Storage (локально + у провайдера);
|
||||
:Найти расхождения
|
||||
(common ancestor / merge);
|
||||
:Свести содержимое
|
||||
к единому состоянию;
|
||||
:Обновить очередь /
|
||||
метаданные синхронизации;
|
||||
:Запуск sync (Worker / debounce);
|
||||
:StorageSyncEngine.syncAllGroups;
|
||||
while (Есть группа синхронизации?) is (да)
|
||||
:Слияние журналов → победитель по пути;
|
||||
:findSourceStorage → applyEntry\nна отстающие Storage;
|
||||
endwhile (нет)
|
||||
}
|
||||
end fork
|
||||
|
||||
44
Report/puml/fig_35_sync_merge_algorithm.puml
Normal file
44
Report/puml/fig_35_sync_merge_algorithm.puml
Normal file
@@ -0,0 +1,44 @@
|
||||
@startuml fig_35_sync_merge_algorithm
|
||||
scale 2.5
|
||||
title Wallenc — алгоритм согласования журналов синхронизации (StorageSyncEngine)
|
||||
|
||||
skinparam defaultFontName "DejaVu Sans"
|
||||
skinparam activity {
|
||||
BackgroundColor #F8F8F8
|
||||
BorderColor #333333
|
||||
DiamondBackgroundColor #E8F4FF
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
:Группа Storage (≥ 2 UUID из DbStorageSyncGroup);
|
||||
:Захват блокировок sync (lease);
|
||||
:Параллельно: flush + readSyncJournal\nдля каждого Storage;
|
||||
|
||||
partition "Слияние (StorageSyncJournalMerge)" {
|
||||
:Для каждого пути — запись\nс максимальной ревизией;
|
||||
note right
|
||||
compare: sequence → actorId → createdAt
|
||||
end note
|
||||
}
|
||||
|
||||
while (Есть необработанный путь?) is (да)
|
||||
:winnerEntry = победитель по пути;
|
||||
:sourceStorage = findSourceStorage(winnerEntry);
|
||||
if (operation == UPSERT\nи source == null?) then (да)
|
||||
:пропуск пути;
|
||||
else (нет)
|
||||
while (Есть target Storage?) is (да)
|
||||
if (ревизия target ≥ winner?) then (да)
|
||||
:пропуск target;
|
||||
else (нет)
|
||||
:applyEntry:\nUPSERT — copy stream\nDELETE/TRASH — на target\n(recordSyncJournal = false);
|
||||
endif
|
||||
endwhile (нет)
|
||||
endif
|
||||
endwhile (нет)
|
||||
|
||||
:Снятие блокировок;
|
||||
stop
|
||||
|
||||
@enduml
|
||||
30
Report/puml/fig_36_ml_on_device.puml
Normal file
30
Report/puml/fig_36_ml_on_device.puml
Normal file
@@ -0,0 +1,30 @@
|
||||
@startuml fig_36_ml_on_device
|
||||
scale 2.5
|
||||
title Wallenc — гипотетический контур on-device ML (без расшифровки на сервере)
|
||||
|
||||
skinparam defaultFontName "DejaVu Sans"
|
||||
skinparam componentStyle rectangle
|
||||
|
||||
package "Приложение Wallenc" {
|
||||
[UI / use cases] as UI
|
||||
[Метаданные:\nжурнал sync, имена,\nразмеры] as Meta
|
||||
[TFLite / ML Kit\n(inference)] as ML
|
||||
[Зашифрованные\nфайлы storage] as Enc
|
||||
}
|
||||
|
||||
cloud "Провайдер\n(недоверенный)" as Cloud {
|
||||
[Зашифрованные\nобъекты] as Obj
|
||||
}
|
||||
|
||||
UI --> Meta : анализ
|
||||
Meta --> ML : признаки\nбез plaintext
|
||||
ML --> UI : решение /\nподсказка
|
||||
Enc --> Cloud : только ciphertext
|
||||
Enc ..> ML : опционально\nлокальные эмбеддинги\nпосле decrypt на устройстве
|
||||
|
||||
note bottom of ML
|
||||
Обучение: офлайн на размеченных\nсинтетических/агрегированных данных;
|
||||
выгрузка содержимого vault\nна облако для train — не используется
|
||||
end note
|
||||
|
||||
@enduml
|
||||
Reference in New Issue
Block a user