Skip to content

Commit 59b6b3e

Browse files
authored
doc(README): add info
1 parent 2e56421 commit 59b6b3e

File tree

1 file changed

+74
-5
lines changed

1 file changed

+74
-5
lines changed

README.md

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,67 @@ docker pull n255/tgdb:0.1.0-slim
2121
>
2222
> В противном случае ваши данные могут быть удалены, а аккаунты забанены.
2323
24+
## Запуск
25+
26+
Для запуска сервера нужно передать путь yaml конфига через переменную окружения `CONFIG_PATH`.
27+
28+
Пример конфига:
29+
```yaml
30+
conf:
31+
uvicorn:
32+
host: "0.0.0.0"
33+
port: 8000
34+
35+
api:
36+
id: 23598539
37+
hash: "6d9d7305ffc6f148dab120d24541b127"
38+
39+
clients:
40+
bots: "/etc/tgdb/clients/bots"
41+
userbots: "/etc/tgdb/clients/userbots"
42+
43+
horizon:
44+
max_len: 800
45+
transaction:
46+
max_age_seconds: 30
47+
48+
message_cache:
49+
max_len: 100_000
50+
51+
heap:
52+
chat: -1000000000000
53+
page:
54+
max_fullness: 0.8
55+
56+
relations:
57+
chat: -1000000000000
58+
59+
buffer:
60+
chat: -1000000000000
61+
overflow:
62+
len: 5000
63+
timeout_seconds: 0.1
64+
```
65+
66+
> [!IMPORTANT]
67+
> С этой конфигурацией один сервер будет потреблять максимум 200MB памяти без учёта обработки входящих запросов.
68+
2469
## Overview
2570
`tgdb` - это СУБД хранящая данные в чатах телеграмма и предоставляющая доступ к ним в виде реляционной модели и ACID транзакций.
2671

27-
Всё взаимодействие с Telegram происходит через ботов/юзерботов, которые имеют фиксированные [лимиты](https://limits.tginfo.me/en) для отправки запросов в некотором промежутке времени и фактически являюстя арендой очень маленького кусочка инфраструктуры Telegram-а.
72+
Всё взаимодействие с Telegram происходит через ботов/юзерботов, которые имеют фиксированные [лимиты](https://limits.tginfo.me/en) для отправки запросов в некотором промежутке времени и фактически являюстя арендой очень маленького кусочка инфраструктуры Telegram-а, поэтому они считаются IO ресурсами, такими, как например пропусктная способность сети.
2873

29-
Из-за специфичных лимитов, операции над сообщениями имеют слишком разную цену, чем у операций, которыми можно обращатся с памятью или дисковым пространством, что требует альтернативных решений даже над простыми вещами, которые имеют устоявшиеся подходы:
30-
- Все операции можно выполнять за константное время (обычно от 200мс до 400мс), но чтение гораздо дороже операций записи, из-за того что читать сообщения могут только юзерботы.
31-
Для регистрации юзерботов нужен отдельный номер (а по закону РФ одно физ. лицо может иметь только 20 номеров любых провайдеров), когда для обычных ботов нужно только регестрация у BotFather.
74+
Из-за специфичных лимитов, операции над сообщениями имеют слишком разную цену, чем у операций, которыми можно обращатся с памятью или дисковым пространством:
75+
- Все операции можно выполнять за константное время (обычно от 200мс до 400мс), но чтение гораздо дороже операций записи, из-за того что читать сообщения могут только юзерботы. Для регистрации юзерботов нужен отдельный номер (а по закону РФ одно физ. лицо может иметь только 20 номеров любых провайдеров), когда для обычных ботов нужно только регестрация у BotFather.
3276
- Несмотря на сложность создания юзерботов, можно читать сразу много сообщений за одно обращение, а писать новые сообщения можно только по обращению на каждое новое сообщение.
3377
Обновления само по себе является записью, но для него первоначально необходимо найти то сообщение, которое нужно обновить.
3478
Удалять можно сразу много сообщений, которых также необходимо найти, но в отличии от обновления, удалять можно сразу много сообщений за одно обращение.
3579

80+
## Отношения
81+
На данный момент можно только создавать отношения без возможности миграций. Они не поддерживают ограничения, кроме ограничений доменов на размер данных.
82+
83+
Физически кортежи не хранятся сгруппированными по своим отношениям, а располгаются в едином чате - куче. Каждый кортеж хранится в ровно одном сообщении или странице, которая может вместить всего 4096 символа. Из-за этого нельзя создавать отношения с такими схемами, кортежи которых могут не вместится в одну страницу.
84+
3685
## Операции
3786
На данный момент можно читать кортежи только до записи, а сама запись возможна только одним bulk запросом вместе с коммитом. В дальнейшем возможно сделать выполнение операторов таким же, как в обычных СУБД, но пока это не сделано.
3887

@@ -80,4 +129,24 @@ docker pull n255/tgdb:0.1.0-slim
80129
</table>
81130

82131
> [!IMPORTANT]
83-
> Если паралельно выполняются несколько транзакций с разным уровнем изоляции, то у всей группы будут гарантии минимального уровня изоляции.
132+
> Если паралельно выполняются несколько транзакций с разным уровнем изоляции, то у всей группы будут гарантии минимального уровня изоляции из этой группы.
133+
134+
Дополнительно можно читать кортежи из отношений без транзакций, что по уровню изоляции = **Read Uncommited**, но создаёт меньшую нагрузку на сервер.
135+
136+
Коммиты транзакций буфферизируются и хранятся в отдельном чате, перед тем, как они будут конкурентно записаны в кучу. В случае достаточного количества ботов, это значит, что задержка для транзакции, которая посылает 10 конкурентных запросов на чтение, а после коммит с 10 операторами записи, будет равна трём обращением к телеграму, что в среднем ~= 0.75 секунд.
137+
138+
Буффер хранится на самом сервере и только при переполнении сохранятся в своём чате. В таком случае изменения записанные в буффер переносятся в кучу только после сохранения в чате буффера, что позволяет востанавливатся серверу в консистетное состояние даже в случае любого сбоя и не ограничевает сервер пропусктной способностью в одно обращению к телеграму.
139+
140+
В этом случае скорость выполнения одной транзакции будет ограничена следующими шагами:
141+
1. Старт транзакции - задержка сети с `tgdb` сервером
142+
2. Чтение из кучи - задержка сети с `telegram`
143+
3. Начало коммита - задержка сети с `tgdb` сервером
144+
4. Ожижание переполнения буфера - `conf.buffer.overflow.timeout_seconds` (в худшем случае)
145+
5. Сохранение буффера в своём чате - задержка сети с `telegram`
146+
6. Запись в кучу - задержка сети с `telegram`
147+
7. Оповещение об успешном коммите - задержка сети с `tgdb` сервером
148+
149+
## Маштабирование
150+
На данный момент все данные хранятся в одной куче, которая может вмещать только 1 000 000 сообщений (после 1 000 000 Telegram будет удалять сообщения до 500 000), что даже в случае полного заполнения страниц ~= 16 ГБ (включая метаданные) и сам по себе сервер однопоточный.
151+
152+
В таком случае нужно секционировать данные между несколькими серверами практически всегда, даже в случае одной ноды, но сейчас нет встроенных механизмов для этого.

0 commit comments

Comments
 (0)