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
> В противном случае ваши данные могут быть удалены, а аккаунты забанены.
23
23
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
+
24
69
## Overview
25
70
`tgdb` - это СУБД хранящая данные в чатах телеграмма и предоставляющая доступ к ним в виде реляционной модели и ACID транзакций.
26
71
27
-
Всё взаимодействие с Telegram происходит через ботов/юзерботов, которые имеют фиксированные [лимиты](https://limits.tginfo.me/en) для отправки запросов в некотором промежутке времени и фактически являюстя арендой очень маленького кусочка инфраструктуры Telegram-а.
72
+
Всё взаимодействие с Telegram происходит через ботов/юзерботов, которые имеют фиксированные [лимиты](https://limits.tginfo.me/en) для отправки запросов в некотором промежутке времени и фактически являюстя арендой очень маленького кусочка инфраструктуры Telegram-а, поэтому они считаются IO ресурсами, такими, как например пропусктная способность сети.
28
73
29
-
Из-за специфичных лимитов, операции над сообщениями имеют слишком разную цену, чем у операций, которыми можно обращатся с памятью или дисковым пространством, что требует альтернативных решений даже над простыми вещами, которые имеют устоявшиеся подходы:
30
-
- Все операции можно выполнять за константное время (обычно от 200мс до 400мс), но чтение гораздо дороже операций записи, из-за того что читать сообщения могут только юзерботы.
31
-
Для регистрации юзерботов нужен отдельный номер (а по закону РФ одно физ. лицо может иметь только 20 номеров любых провайдеров), когда для обычных ботов нужно только регестрация у BotFather.
74
+
Из-за специфичных лимитов, операции над сообщениями имеют слишком разную цену, чем у операций, которыми можно обращатся с памятью или дисковым пространством:
75
+
- Все операции можно выполнять за константное время (обычно от 200мс до 400мс), но чтение гораздо дороже операций записи, из-за того что читать сообщения могут только юзерботы. Для регистрации юзерботов нужен отдельный номер (а по закону РФ одно физ. лицо может иметь только 20 номеров любых провайдеров), когда для обычных ботов нужно только регестрация у BotFather.
32
76
- Несмотря на сложность создания юзерботов, можно читать сразу много сообщений за одно обращение, а писать новые сообщения можно только по обращению на каждое новое сообщение.
33
77
Обновления само по себе является записью, но для него первоначально необходимо найти то сообщение, которое нужно обновить.
34
78
Удалять можно сразу много сообщений, которых также необходимо найти, но в отличии от обновления, удалять можно сразу много сообщений за одно обращение.
35
79
80
+
## Отношения
81
+
На данный момент можно только создавать отношения без возможности миграций. Они не поддерживают ограничения, кроме ограничений доменов на размер данных.
82
+
83
+
Физически кортежи не хранятся сгруппированными по своим отношениям, а располгаются в едином чате - куче. Каждый кортеж хранится в ровно одном сообщении или странице, которая может вместить всего 4096 символа. Из-за этого нельзя создавать отношения с такими схемами, кортежи которых могут не вместится в одну страницу.
84
+
36
85
## Операции
37
86
На данный момент можно читать кортежи только до записи, а сама запись возможна только одним bulk запросом вместе с коммитом. В дальнейшем возможно сделать выполнение операторов таким же, как в обычных СУБД, но пока это не сделано.
> Если паралельно выполняются несколько транзакций с разным уровнем изоляции, то у всей группы будут гарантии минимального уровня изоляции.
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