Skip to main content

RDBMS over Telegram

Project description

tgdb

CI CD GitHub Release Wakatime Lines codecov

РСУБД поверх Telegram.

pip install tgdb
docker pull n255/tgdb:0.1.0-slim

[!CAUTION] Не используйте этот проект с большим количеством ботов, так как он нарушает правила Telegram и создаёт паразитическую нагрузку на его инфраструктуру.

В противном случае ваши данные могут быть удалены, а аккаунты — заблокированы.

Запуск

Для запуска сервера укажите путь к YAML-конфигу через переменную окружения CONFIG_PATH.

Пример конфигурации:

conf:
  uvicorn:
    host: "0.0.0.0"
    port: 8000

  api:
    id: 23598539
    hash: "6d9d7305ffc6f148dab120d24541b127"

  clients:
    bots: "/etc/tgdb/clients/bots"
    userbots: "/etc/tgdb/clients/userbots"

  horizon:
    max_len: 800
    transaction:
      max_age_seconds: 30

  message_cache:
    max_len: 100_000

  heap:
    chat: -1000000000000
    page:
      max_fullness: 0.8

  relations:
    chat: -1000000000000

  buffer:
    chat: -1000000000000
    overflow:
      len: 5000
      timeout_seconds: 0.1

[!IMPORTANT] С данной конфигурацией один сервер потребляет не более 200 МБ памяти (без учёта обработки входящих запросов).

Обзор

tgdb — это СУБД, хранящая данные в Telegram-чатах и предоставляющая доступ к ним через реляционную модель с поддержкой ACID-транзакций.

Взаимодействие с Telegram происходит через ботов/юзерботов, имеющих фиксированные лимиты на количество запросов в определённый промежуток времени. Фактически они представляют собой аренду небольшой части инфраструктуры Telegram, поэтому считаются ресурсами ввода-вывода (аналогично пропускной способности сети).

Из-за специфики лимитов операции с сообщениями имеют существенно разную стоимость по сравнению с операциями в памяти/на диске:

  • Все операции выполняются за константное время (200–400 мс), но чтение значительно дороже записи, так как доступно только через юзерботов. Для регистрации юзербота требуется отдельный номер (по закону РФ физическое лицо может иметь не более 20 номеров), тогда как для обычных ботов достаточно регистрации у BotFather.
  • Несмотря на сложность создания юзерботов, за один запрос можно прочитать множество сообщений. Запись новых сообщений требует отдельного запроса для каждого сообщения.
  • Обновление сообщений требует предварительного поиска целевого сообщения.
  • Удаление поддерживает пакетную обработку, но также требует поиска сообщений.

Отношения

Текущая реализация позволяет создавать отношения без поддержки миграций. Ограничения включают только доменные ограничения на размер данных.

Физически кортежи не группируются по отношениям, а хранятся в едином чате (куче). Каждый кортеж размещается в отдельном сообщении (странице) размером до 4096 символов. Следовательно, невозможно создать отношение, кортежи которого не помещаются в одну страницу.

Операции

На данный момент можно читать кортежи только до записи, а сама запись возможна только через bulk-запрос в рамках коммита.

tgdb не использует MVCC, поэтому невозможно сделать Repeatable Read в том виде, что бы он был легче Serializable. В этом случае может быть только три уровня изоляции:

n — количество транзакций уровня изоляции.

Уровень изоляции Особенности Старт Коммит Откат Память
Serializable Требует повторения транзакций при ошибках сериализации O(n) O(n) O(n) O(n²)
Read Committed В разработке. Операции чтения могут выполняться в 3 раза дольше O(1) O(1) O(1) O(n)
Read Uncommitted O(1) O(1) O(1) O(n)

[!IMPORTANT] При параллельном выполнении транзакций с разными уровнями изоляции вся группа получает гарантии минимального уровня из группы.

Чтение кортежей вне транзакций эквивалентно уровню Read Uncommitted, но создаёт меньшую нагрузку.

Коммиты буферизируются и хранятся в отдельном чате перед конкурентной записью в кучу. При достаточном количестве ботов задержка транзакции (10 чтений + 10 записей) составляет ~3 обращения к Telegram (~0.75 с).

Буфер хранится на сервере и сохраняется в чате только при переполнении. Это гарантирует восстановление консистентного состояния после сбоев и не ограничивает сервер пропускной способностью в одно обращение к Telegram.

Этапы выполнения транзакции:

  1. Старт транзакции — сетевая задержка до сервера tgdb
  2. Чтение из кучи — сетевая задержка до telegram
  3. Начало коммита — сетевая задержка до сервера tgdb
  4. Ожидание переполнения буфера — conf.buffer.overflow.timeout_seconds (макс.)
  5. Сохранение буфера в чате — сетевая задержка до telegram
  6. Запись в кучу — сетевая задержка до telegram
  7. Подтверждение коммита — сетевая задержка до сервера tgdb

Масштабирование

На данный момент все данные хранятся в одной куче, которая может вмещать только 1 млн сообщений (после 1 млн Telegram будет удалять сообщения до 500 тыс.), что даже в случае полного заполнения страниц ~16 ГБ (включая метаданные) и сам по себе сервер однопоточный.

В таком случае нужно секционировать данные между несколькими серверами практически всегда, даже в случае одной ноды, но сейчас нет встроенных механизмов для этого.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tgdb-0.1.0.tar.gz (67.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tgdb-0.1.0-py3-none-any.whl (81.1 kB view details)

Uploaded Python 3

File details

Details for the file tgdb-0.1.0.tar.gz.

File metadata

  • Download URL: tgdb-0.1.0.tar.gz
  • Upload date:
  • Size: 67.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.12

File hashes

Hashes for tgdb-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f8818eb81afdbff17e1940d16df55c77b03b98c565aa96da013493b00783d77c
MD5 739a387cd95584228684705bb00f87f6
BLAKE2b-256 90f4ee09cc130a7a1e4c913f3d1201eb4f914d18b11ae0f5a226e9146a0254bf

See more details on using hashes here.

File details

Details for the file tgdb-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: tgdb-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 81.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.12

File hashes

Hashes for tgdb-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9fbf4c9be873f15bd381ad0c01eefcf8e274aa30fd7d9c1d5fea5788c2634aaf
MD5 8b5d81820500925a8de72ea462d74c88
BLAKE2b-256 692bac8183a4469d5149297046d7db7ec819039261b1be45e31ea0b9672c8307

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page