Skip to content

Commit 7ecf0de

Browse files
committed
feat: add microservices page
1 parent 6085cb9 commit 7ecf0de

3 files changed

Lines changed: 176 additions & 17 deletions

File tree

docs/python/microservices.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
!!! info ""
2+
**Микросервисная архитектура** — это подход к разработке программного обеспечения, при котором приложение строится как набор небольших, независимых сервисов, каждый из которых отвечает за конкретную бизнес-функцию.
3+
4+
## Преимущества
5+
6+
<span class="badge">Microservices</span> обеспечивают высокую гибкость разработки, позволяя независимым командам работать над разными частями системы одновременно.
7+
8+
Основными достоинствами этого подхода являются:
9+
10+
- <span class="badge">Масштабируемость</span>: возможность расширять только те компоненты, которые испытывают высокую нагрузку, без затрат ресурсов на остальную систему.
11+
- <span class="badge">Отказоустойчивость</span>: сбой в одном микросервисе не приводит к падению всего приложения, так как остальные компоненты продолжают функционировать в изолированном режиме.
12+
- <span class="badge">Технологическая свобода</span>: каждый сервис может быть написан на своём языке программирования и использовать собственную базу данных, наиболее подходящую для его задач.
13+
14+
Сравнение с монолитом
15+
16+
| Характеристика | Монолитная архитектура | Микросервисная архитектура |
17+
|-----------------|--------------------------------------|-------------------------------------------------|
18+
| Структура | Единый код, компоненты тесно связаны | Множество независимых, слабо связанных сервисов |
19+
| Развертывание | Развертывается как единый модуль | Каждый сервис деплоится независимо |
20+
| Масштабирование | Масштабируется только целиком | Масштабируются отдельные компоненты |
21+
| Сложность | Проще в управлении и тестировании | Высокая сложность взаимодействия и DevOps |
22+
23+
## Популярные паттерны
24+
25+
Для эффективной работы распределённой системы используются проверенные архитектурные схемы:
26+
27+
- <span class="badge">API Gateway</span> — единая точка входа для клиентов, которая занимается маршрутизацией запросов, аутентификацией и кэшированием.
28+
- <span class="badge">Service Discovery</span> — механизм, позволяющий сервисам динамически находить адреса друг друга в сети без жёсткой привязки к IP-адресам.
29+
- <span class="badge">Circuit Breaker</span> — «предохранитель», который временно блокирует запросы к упавшему сервису, предотвращая каскадные сбои во всей системе.
30+
31+
## Вызовы и сложности
32+
33+
Переход на микросервисы требует высокого уровня зрелости инженерной культуры и автоматизации.
34+
35+
Главными трудностями являются поддержание согласованности данных между распределёнными базами и сетевые задержки при общении сервисов между собой.
36+
37+
Кроме того, диагностика ошибок становится значительно сложнее, требуя внедрения систем распределённого логирования и трассировки.

notes/merge_sort.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from random import randint
2+
3+
# Создаём тестовый неотсортированный массив.
4+
arr = []
5+
for i in range(10):
6+
arr.append(randint(1,9))
7+
print(f'Изначальный:\n{arr}\n')
8+
9+
# Сортировка слиянием (Merge sort)
10+
def merge_sort(arr):
11+
# Проверка: Если массив из 1 или 0 элемента - он уже отсортирован
12+
if len(arr) <= 1:
13+
return arr
14+
# 1. Разделение (Divide)
15+
mid = len(arr) // 2 # Делим попалам длинну массива, для нахождения середины
16+
left_half = merge_sort(arr[:mid]) # Левая отсортированная половина, потому что рекурсивно вызывается merge_sort(), который сортирует половину
17+
right_half = merge_sort(arr[mid:]) # Правая отсортированная половина, потому что рекурсивно вызывается merge_sort(), который сортирует половину
18+
# 2. Слияние (Merge)
19+
return merge(left_half, right_half) # Здесь мы обращаемся к функции merge, которая будет соединять эти 2 части
20+
21+
def merge(left, right):
22+
result = [] # Создаём пустой массив для дальнейшего хранения в нём отсортированного списка
23+
i = j = 0 # Задаём указатели для прохождения по элементам, со стартовыми индексами "0"
24+
25+
# Сравниваем элементы из обеих половин по указателям
26+
while i < len(left) and j < len(right): # Проходимся до того момента, пока не закончатся элементы в одной из половин
27+
if left[i] <= right[j]:
28+
result.append(left[i]) # Если Left <= Right - вставляем Left (наименьший элемент).
29+
i += 1 # Идём дальше
30+
else:
31+
result.append(right[j]) # Если Right <= Left - вставляем Right (наименьший элемент).
32+
j += 1 # Идём дальше
33+
34+
result.extend(left[i:]) # Добавляем остаток элементов из Left половины в конец массива (если остались)
35+
result.extend(right[j:]) # Добавляем остаток элементов из Right половины в конец массива (если остались)
36+
return result # Возвращаем результат ( ͡° ͜ʖ ͡°)
37+
38+
print(f'Отсортированный, при помощи Merge Sort:\n{merge_sort(arr)}\n')

notes/test.py

Lines changed: 101 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,104 @@
11
from random import randint
22

3-
a = []
3+
arr = []
44
for i in range(10):
5-
a.append(randint(1,9))
6-
print(f'Изначальный: {a}')
7-
8-
def bubble_sort(a):
9-
n = len(a)
10-
for i in range(2):
11-
for j in range(n - i - 1):
12-
if a[j] > a[j+1]:
13-
a[j], a[j+1] = a[j+1], a[j]
14-
return a
15-
16-
bubble_sort(a)
17-
18-
max_value = ((a[-1]-1)*(a[-2]-1))
19-
print(f'Отсортированный: {a}')
20-
print(max_value)
5+
arr.append(randint(1,9))
6+
print(f'Изначальный:\n{arr}\n')
7+
8+
# # Bubble sort
9+
# # def Bubble_sort(arr):
10+
# # x = len(arr)
11+
# # for i in range(x):
12+
# # for j in range(x - i - 1):
13+
# # if arr[j] > arr[j+1]:
14+
# # arr[j], arr[j+1] = arr[j+1], arr[j]
15+
# # return arr
16+
17+
18+
# # Bubble_sort(arr)
19+
# # max_value = ((arr[-1]-1)*(arr[-2]-1))
20+
# # print(f'Отсортированный: {arr}')
21+
# # print(max_value)
22+
23+
# def merge_sort(arr):
24+
# # Проверка: Если массив из 1 или 0 элемента - он уже отсортирован
25+
# if len(arr) <= 1:
26+
# return arr
27+
# # 1. Разделение (Divide)
28+
# mid = len(arr) // 2 # Делим попалам длинну массива, для нахождения середины
29+
# left_half = merge_sort(arr[:mid]) # Левая отсортированная половина, потому что рекурсивно вызывается merge_sort(), который сортирует половину
30+
# right_half = merge_sort(arr[mid:]) # Правая отсортированная половина, потому что рекурсивно вызывается merge_sort(), который сортирует половину
31+
# # 2. Слияние (Merge)
32+
# return merge(left_half, right_half) # Здесь мы обращаемся к функции merge, которая будет соединять эти 2 части
33+
34+
# def merge(left, right):
35+
# result = [] # Создаём пустой массив для дальнейшего хранения в нём отсортированного списка
36+
# i = j = 0 # Задаём указатели для прохождения по элементам, со стартовыми индексами "0"
37+
38+
# # Сравниваем элементы из обеих половин по указателям
39+
# while i < len(left) and j < len(right): # Проходимся до того момента, пока не закончатся элементы в одной из половин
40+
# if left[i] <= right[j]:
41+
# result.append(left[i]) # Если Left <= Right - вставляем Left (наименьший элемент).
42+
# i += 1 # Идём дальше
43+
# else:
44+
# result.append(right[j]) # Если Right <= Left - вставляем Right (наименьший элемент).
45+
# j += 1 # Идём дальше
46+
47+
# result.extend(left[i:]) # Добавляем остаток элементов из Left половины в конец массива (если остались)
48+
# result.extend(right[j:]) # Добавляем остаток элементов из Right половины в конец массива (если остались)
49+
# return result # Возвращаем результат ( ͡° ͜ʖ ͡°)
50+
51+
52+
# def merge_sort(arr):
53+
# if len(arr) <= 1:
54+
# return arr
55+
# mid = len(arr) // 2
56+
# left_half = merge_sort(arr[:mid])
57+
# right_half = merge_sort(arr[mid:])
58+
59+
# return merge(left_half, right_half)
60+
61+
# def merge(left, right):
62+
# result = []
63+
# i = j = 0
64+
# while i < len(left) and j < len(right):
65+
# if left[i] <= right[j]:
66+
# result.append(left[i])
67+
# i += 1
68+
# else:
69+
# result.append(right[j])
70+
# j += 1
71+
72+
# result.extend(left[i:])
73+
# result.extend(right[j:])
74+
# return result
75+
76+
77+
# print(f'Отсортированный, при помощи Merge Sort:\n{merge_sort(arr)}\n')
78+
79+
def merge_sort(arr):
80+
if len(arr) <= 1:
81+
return arr
82+
83+
mid = len(arr) // 2
84+
left_half = merge_sort(arr[:mid])
85+
right_half = merge_sort(arr[mid:])
86+
87+
return merge(left_half, right_half)
88+
89+
def merge(left, right):
90+
result = []
91+
i = j = 0
92+
while i < len(left) and j < len(right):
93+
if left[i] <= right[j]:
94+
result.append(left[i])
95+
i += 1
96+
else:
97+
result.append(right[j])
98+
j += 1
99+
100+
result.extend(left[i:])
101+
result.extend(right[j:])
102+
return result
103+
104+
print(f'Отсортированный, при помощи Merge Sort:\n{merge_sort(arr)}\n')

0 commit comments

Comments
 (0)