En

💎 Дневник разработчика CRYSTAL #2: Прототип — Enter Text (LARS)

1. Структура проекта и характеристики локального ПК

Строение:

Full code | Cargo.toml

Структура:

  • Leptos v0.8.2.
  • Actix Web v4.x.
  • Rust v1.92.0.
  • ScyllaDB v2025.4.0.

Характеристики локального ПК:

  • OS: Debian 12.

2. Введение

Enter Text (LARS) — это прототип, который был разработан для подготовки перехода CRYSTAL на новый технологический стек — LARS (Leptos, Actix Web, Rust, ScyllaDB).

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

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

3. Ключевые особенности

  • 3.1. Auto-Schema, Single-Row Architecture, and Constant-id
    При запуске приложения автоматически создается таблица data (если она еще не существует) для хранения введенного текста. В процессе сохранения в таблице формируется строка, состоящая из трех колонок: id (первичный ключ), content (текстовые данные) и created_at (метка времени). Для вводимого текста используется постоянный id в формате UUID (11111111-1111-1111-1111-111111111111). Вместо создания множества записей система использует операцию INSERT как «upsert» (обновление существующей записи). Так как id всегда один и тот же, любая операция сохранения просто перезаписывает данные в колонке content для этой конкретной строки:
    ssh-keygen

    Скрин 1: Single Row View

  • 3.2. Blocking SSR (SsrMode::PartiallyBlocked)
    Блокирующий режим рендеринга на стороне сервера. Это гарантирует, что динамический контент из ScyllaDB (и весь остальной текст на сайте) "вшивается" в структуру HTML прямо на сервере. В результате, поисковые роботы получают полностью готовый документ, что обеспечивает 100% индексацию и высокие позиции в SEO:
    ssh-keygen

    Скрин 2: Server-Side Rendered (SSR). Просмотр исходного кода в браузере (Ctrl+U)

  • 3.3. Fine-grained Reactivity
    При обновлении текста, перерисовывается только конкретный узел DOM, содержащий этот текст, остальная часть страницы остается нетронутой. Такое поведение достигается благодаря реактивным сигналам Leptos.
  • 3.4. Isomorphic Data Access & Reactive UI
    Использование Resource::new_blocking обеспечивает бесшовную синхронизацию состояния между сервером и клиентом. Оно автоматически отслеживает изменения в базе данных через версии действий, позволяя интерфейсу, мгновенно переключать кнопки (например, переключаться между «Добавить» и «Обновить» или показывать кнопку «Удалить») без перезагрузки страницы.
  • 3.5. Asynchronous ScyllaDB Integration
    Высокопроизводительное асинхронное соединение через scylla-rust-driver. Благодаря использованию общего Arc<Session>, сервер эффективно распределяет ресурсы и может обрабатывать тысячи одновременных запросов без блокировки потоков процессора. Пока база данных готовит ответ, CPU остается свободным для других задач, что гарантирует максимальную отзывчивость системы при экстремальных нагрузках.
  • 3.6. SSR Isolation
    Весь код взаимодействия с базой данных защищен макросами #[cfg(feature = "ssr")]. Это гарантирует, что драйверы базы данных и конфиденциальная логика никогда не покинут сервер.
  • 3.7. Информативное логирование на сервере
    Система выводит в консоль информативные отчеты об операциях:
    ssh-keygen

    Скрин 3: Журнал готовности ScyllaDB

4. Установка и настройка

Примечание о совместимости: Этот проект проверен и стабильно работает на Debian 12. Разработка на Windows не рекомендуется, так как процесс установки Leptos и ScyllaDB в этой системе, может вызвать критические ошибки. Для корректной работы требуется среда на базе Linux.

  • 4.1. Подготовка окружения (Debian 12 и аналогичные)

    Установка системных зависимостей:

    sudo apt update && sudo apt install build-essential pkg-config libssl-dev -y
  • 4.2. Установка Rust и инструментов Leptos

  • 4.2.1. Установка Rust (устанавливает текущую стабильную версию):

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • 4.2.2. Настройка переменных окружения:

    source $HOME/.cargo/env
  • 4.2.3. Добавление поддержки WebAssembly:

    rustup target add wasm32-unknown-unknown
  • 4.2.4. Установка инструмента сборки cargo-leptos:

    cargo install --locked cargo-leptos
  • 4.3. Установка и настройка ScyllaDB

    Установка выполняется непосредственно в систему Debian 12 с использованием официального репозитория ScyllaDB.

  • 4.3.1. Обновление индексов пакетов:

    sudo apt-get update
  • 4.3.2. Установка необходимых системных утилит:

    sudo apt-get install -y apt-transport-https curl gnupg
  • 4.3.3. Добавление официального репозитория ScyllaDB в систему:

    curl -sSf https://get.scylladb.com/server | sudo bash
  • 4.3.4. Интерактивная настройка и установка ScyllaDB:

    sudo scylla_setup
  • 4.3.5. Запуск службы сервера ScyllaDB:

    sudo systemctl start scylla-server
  • 4.3.6. Проверка статуса узлов кластера:

    nodetool status

5. Подготовка базы данных

Перед первым запуском проекта необходимо создать Keyspace в ScyllaDB.

  • Войдите в консоль базы данных:

    cqlsh
  • И выполните запрос:

    CREATE KEYSPACE IF NOT EXISTS prototype WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};

6. Запуск проекта

  • 6.1. Клонирование репозитория проекта:

    git clone https://github.com/AndrewShedov/enter-text--LARS && cd enter-text--LARS/main
  • 6.2. Запуск проекта:

    cargo leptos watch

После завершения сборки, приложение будет доступно по адресу:

http://127.0.0.1:3000

Таблица data внутри keyspace prototype будет создана автоматически при первом обращении приложения к базе данных, благодаря встроенной логике Auto-Schema.

По умолчанию ScyllaDB настроена на работу по адресу 127.0.0.1:9042.

Вы можете проверить адрес, введя команду в терминал:

  • cqlsh

    После ввода команды, должен отобразиться адрес:

    Connected to at 127.0.0.1:9042

CRYSTAL тестируется в

BrowserStack

Поделиться

Копировать

USDT (TRON (TRC20)): TTvJdwtL3VAZKSHbYi8B2eQEQDxbHUD4Ka

POL (Polygon PoS): 0x97377684b9a589eca92e2c6c8430e6dcf2bae8c2

ETH (Base Mainnet): 0x97377684b9a589eca92e2c6c8430e6dcf2bae8c2

ETH (ERC20): 0x97377684b9a589eca92e2c6c8430e6dcf2bae8c2

BTC (BTC): 12GkhJZWrdn23PUerGerN7nSZXHwWGm59U

Похожие посты

Этот сайт использует файлы cookies. Нажимая кнопку 'Принять' или продолжая пользоваться сайтом, вы соглашаетесь на использование файлов cookies.