Add week 8 materials

This commit is contained in:
osukhoroslov committed 2026-11-04 19:23:39 +03:00
1 parent a987b82834
commit 0bf71ed374
38 files changed
+2908

No files matched your search

@@ -0,0 +1,35 @@
import requests
# put your shards for experiments here
shards = {
'server1': 'http://localhost:8001/',
'server2': 'http://localhost:8002/'
}
keys = [
'aasdjkahsdl',
'clkjhlkajhsd',
'basdjahlkj',
'dakjshd',
]
MAX_HASH = 1000000
def hashf(x: str):
# sum of ascii codes
return sum([ord(c) for c in x]) % MAX_HASH
def get_shard(k, shards):
i = hashf(k) % len(shards)
return list(shards)[i]
def call_by_key(key):
shard = get_shard(key, shards.keys())
resp = requests.get(shards[shard])
return resp.text
if __name__=='__main__':
for k in keys:
print(call_by_key(k))
@@ -0,0 +1,21 @@
# Пример шардирования
Обычно под шардированием понимают "распределение чего-либо по множеству узлов (*шардов*) детерминированно и постоянно для указанного ключа". Например, шардирование данных в key-value хранилище обычно происходит на основе ключа. Шардирование запросов между http серверами может происходить на основе имени пользователя или его id. Такое свойство обычно называют *ключом шардирования*.
В этом примере написан самый простой пример шардирования запросов: в словаре указываются url куда слать запрос и имена серверов. Ниже указан список ключей для проверки алгоритма шардирования. Для каждого ключа скрипт выбирает сервер и отправляет на него get запрос, после чего печатает результат в *stdout*.
Запуск:
```bash
# 1. Запустить какие-то сервера, которые будут принимать запрос. Например, [hello-world](../nginx-balancing/README.md) из примера с nginx или [key-value](../kv/README.md) из примера с шардированием ключей.
cd ../nginx-balancing
docker compose up
# 2. Поправить словарь shards, добавить туда свои url (если они отличны от уже указанных)
# 3. Запустить скрипт, выполняющий запросы
python3 client.py
# 4. Посмотреть на результаты, что для указанного списка ключей запросы были сделаны на разные сервера
```