BufWriter<Master<'_>> – Telegram
BufWriter<Master<'_>>
105 subscribers
451 photos
28 videos
34 files
1.7K links
https://www.patreon.com/alxe_master

Видео/статьи. Конспект и мои вольные комментарии по инженерии. тут только то, что считаю полезным для себя или других =)

#os, #cloud, #rust, #golang, #python, #javaScript, #cpp, etc
Download Telegram
Иногда я задаюсь вопросом: почему мы продолжаем писать бизнес-приложения на PHP с бексконечными CRUD/REST. Почему бы не взять Low-code/No-code систему типа Airtable или Fibery? Вот почему (картинка):
== Архитектурные стили
https://youtu.be/8DHO85Pqx9Y
- монолит
- микросервисы
- сервис ориентированная
- многоуровневая
- шестигранная

масштабирование
- путем клонирования (один балансер, несколько копий приложения)
- путем секционирования данных (маршрутизатор, несколько экземпляров). АЛЯ шардирование
- путем разбиения приложения на сервисы (распределение запросов на разные сервисы)

разбиение на сервисы:
- по бизнес возможностям
- по проблемным областям

Многоуровневый стиль
- представление
- бизнес логика
- хранение данных

Гегксагональный стиль
- бизнеслогика
- входящие/исходящие адаптеры
- интерфейсы
== УСКОРЬ СВОЙ КОД В МИЛЛИОН РАЗ | РЕКУРСИЯ | АЛГОРИТМЫ
https://youtu.be/cyIw3NKfdGw

- рекурсия
- полиндром
- рекурсия и стек
- факториал
- переполнение стека
- обход дерева
- виды рекурсии
- фибоначи
- проблемы рекурсии
- динамическое программирование
- эмуляция стека

проблемы:
- нехватка места на стеке
- нехватка времени в жизни

любой алгоритм можно сделать итеративным

динамическое программирование
= memoization (кэширование)
= tabulation (отказ от рекурсии). работа от листиков к корню. сохраняя все собранные значения

эмуляция стэка - позволяет переписать все на итерации.
== Паттерны CQRS и Event Sourcing
https://bool.dev/blog/detail/pattern-cqrs-i-event-sourcing

== Основы CQRS
https://habr.com/ru/company/simbirsoft/blog/329970/

== Типы CQRS
https://habr.com/ru/post/268627/
Тип 0: без CQRS
Тип 1: отдельная иерархия классов
Тип 2: отдельные модели
Тип 3: раздельное хранилище

== Как мы попробовали DDD, CQRS и Event Sourcing и какие выводы сделали
https://habr.com/ru/post/313110/
DDD. Выводы
1. ОЧЕНЬ дорого
2. Работает хорошо в устоявшихся бизнес-процессах
3. Иногда – это единственный способ сделать то, что нужно
4. Плохо масштабируется
5. Сложно реализовать в высоконагруженных приложениях
6. Плохо работает в стартапах
7. Не подходит для построения отчетов
8. Требует особого внимания с ORM
9. Слова Entity лучше избегать, потому что его все понимают по-своему
10. С LINQ стандартная реализация Specification «не работает»

CQRS основные выводы
1. Event Sourcing требует CQRS, но не наоборот
2. Дешево
3. Подходит везде
4. Масштабируется
5. Не требует 2 хранилища данных. Эта одна из возможных реализаций, а не обязаловка
6. Обработчик команды может возвращать значение. Если не согласны спорьте с Грегом Янгом и Дино Эспозито, а не со мной
7. Если обработчик возвращает значение он хуже масштабируется, однако есть async/await, но надо понимать как они работают

Мы договорились о том, что:
1. Query всегда только получает данные, но не изменяет состояние системы. Для изменения системы используются команды
2. Query могут возвращать необходимые проекции на прямую, в обход доменной модели

== Введение в CQRS + Event Sourcing: Часть 1. Основы
https://habr.com/ru/post/146429/

== Введение в CQRS + Event Sourcing: Часть 2
https://habr.com/ru/post/149464/

== Command and Query Responsibility Segregation (CQRS) на практике
https://blog.byndyu.ru/2014/07/command-and-query-responsibility.html
== CRDT: Conflict-free Replicated Data Types
https://habr.com/ru/post/418897/

Strong consistency (SC): все операции записи строго упорядочены, запрос на чтение на любой реплике возвращает одинаковый, последний записанный результат. Необходим консенсус в реальном времени для разрешения конфликтов (с вытекающими последствиями), выдерживает падение до n/2 — 1 нод.

Eventual consistency (EC): обновляем данные локально, рассылаем обновление дальше. Чтение на разных репликах может вернуть устаревшие данные. В случае конфликтов либо откатываем, либо как-то решаем, что делать. Т.о. консенсус всё ещё необходим, но уже не в реальном времени.

Strong eventual consistency (SEC): EC + для разрешения конфликтов у реплик есть заранее определённый алгоритм. Т.о. консенсус не нужен, выдерживает падение до n — 1 нод.

Модели синхронизации
- State-based (реплики обмениваются состояниями, принимающая реплика сливает (merge) полученное состояние со своим текущим состоянием.) = мы можем терять сообщения с новым состоянием, отправлять их несколько раз, и даже отправлять в любом порядке.
- Operation-based (реплики обмениваются операциями обновления состояния.)
- Delta-based (если обновление изменяет только часть состояния, то нет смысла пересылать состояние целиком, а также если большое количество изменений затрагивает одно состояние (например, счётчик), то можно выслать одно, агрегированное изменение, а не все операции изменения.)
- Pure operation-based (чистая синхронизация операциями)

бесконфликтные типы:
- Counter
- Last-Write-Wins Register (LWW) (Вводим полный порядок через генерацию уникальных id на каждую операцию (timestamp, например).)
- Multi-Value Register, MV-Register (Подход похож на G-счётчик — храним набор (значение, вектор версий). Значение регистра — все значения, при слиянии — LWW по отдельности на каждое значение в векторе.)
- Grow-Only Set, G-Set (Самое простое решение — запретить удалять элементы. Остаётся только операция add, которая коммутативна. Функция слияния — объединение множеств.)
- 2P-Set (Двухфазное множество. Разрешаем удалять, но после удаления добавить ещё раз нельзя. )
- LWW-element Set (генерация уникальных timestamp для каждого элемента. Заводим два множества — add-set и remove-set, при вызове add() добавляем (element, unique_id()), при проверке есть ли элемент в множестве — смотрим где timestamp больше — в remove-set или в add-set)
- PN-Set (— на каждый элемент заводим счётчик, при добавлении — увеличиваем, при удалении — уменьшаем. Элемент находится в множестве, если его счётчик положителен.)
- Observe-Remove Set, OR-Set, Add-Win Set (add имеет приоритет над remove)
- Remove-win Set (при одновременном add/rmv выигрывает rmv.)
- 2P2P-Graph (строится на освное двух 2P-Set. один для вершин, второй для ребёр)
- Map of literals
- Map of CRDTs

== Репликация без конфликтов: CRDT в теории и на практике
https://habr.com/ru/post/272987/

CRDT решает обеспечением strong eventual consistency (SEC) и монотонности состояний.

Полурешётка — это полугруппа, бинарная операция в которой коммутативна и идемпотентна

Полурешётка — частично упорядоченное множество: элементы (не обязательно все) связаны отношением «следует за».

Operational Transformation — подход, применяемый обычно в редактировании текста. Оба подхода обеспечивают консистентность (EC). У OT более высокие требования к серверу, более сложные и менее стабильные алгоритмы. Также, в некоторых исследованиях показано, что алгоритмы OT иногда не сходятся (converge), как это заявлено в реализации. Однако однозначно сделать выбор и сказать, «что лучше», нельзя.

== Я был неправ. Будущее за CRDT
https://habr.com/ru/company/dcmiran/blog/521288/
АААА. замечательная статья. все понятия достаточно хорошо разьяснены... где ты была раньше блиН ?!?!

== Консистентно о Консенсусе
https://habr.com/ru/company/timeweb/blog/575136/

консистентности или согласованности— логическая непротиворечивость хранимых данных.

Консенсус — это согласие группы участников касательно значения некоторого состояния.

Пессимистичная блокировка — сначала участник запирает ресурс, затем производит его обновление, по завершении которого ресурс отпирается. Это если ему повезло прийти первым. Если же он пришёл, а ресурс уже кем-то заперт, то он сидит, ничего не делает, и ждёт его отпирания.

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

Оптимистичная блокировка — участник сначала готовит новое состояние, а потом атомарно применяет его к источнику истины. Если повезёт. А если не повезёт, и кто-то успеет раньше него, то вся проделанная работа выкидывается, и начинается заново. Висеть в таком цикле участник может неограниченно долго.

Упорядоченная сходимость = Operational Transformation — после слияния всех изменений каждым участником, любой из них должен получить одну и ту же цепочку изменений, что даст им одно и то же финальное состояние. То есть конвергенцию.

Полу-упорядоченная сходимость = CmRDT: Conflict-free Commutative Replicated Data Type — изменения от одного участника применяются лишь в том же порядке, в котором этот участник их вносил. А вот изменения разных участников можно переставлять друг относительно друга как угодно, но результат будет одинаковым.

Беспорядочная сходимость = CvRDT: Conflict-free Convergent Replicated Data Type — изменения могут приходить в произвольном порядке, могут дублироваться, а могут и вообще потеряться, но последующие изменения всё же обеспечат конвергенцию.

CROWD — CvRDT нового поколения
== архитектура ИТ-решений
https://youtu.be/VJrj5pcdPYI
== толковый плейлист по Rabbitmq
https://youtube.com/playlist?list=PLprvDkBQwz6ZC1iwd4y80Qqi43sswECdX
- общая инфа
- установка/настройка кластера
- принципы работы работы кролика на практике
- назначение прав доступа в Rabbitmq на практике
- Тесты HA кластера и метод балансировки

есть очереди типа КВОРУМ для кластера

пермишны можно настроить вплоть до конкретного эксченжа и топика

один балансер это одна точка отказа

можно делать балансировку на уровне L3

можно физический интерфейс хоста обьединить в бридж с ВМ

пока не будет всех нод Реббит не стартует !!!
== небольшой плейлист по Network
https://youtube.com/playlist?list=PLprvDkBQwz6bOaO1N0vDaHX-jqlvlKIhp
- Routing VS Nat
- Построение отказоустойчивой сети (Bonding, LAG, LACP)
- Построение отказоустойчивой сети VPC
- Обеспечение бесперебойного интернета (VRRP)
- настройка DNS балансировки и failover
- Тесты на боевой системе

NAT - это медленно
Ip Tables - Это медленно
при NAT нагрузка на ЦПУ выше
при использовании Kubernates/swarm и пр сеть нельзя обьединить с физическим интерфейсом хоста (а при использовании ВМ это сделать МОЖНО)
== DNS Best Practices, Network Protections, and Attack Identification

https://tools.cisco.com/security/center/resources/dns_best_practices

шикарное чтиво если сложно заснуть
== Представление о структуре отказоустойчивого кластера
https://youtu.be/hBrc-jJFbAw

CEPH как кластерная система хранения файлов . ВАРИАНТОВ НЕТ

каждый сервак должен иметь МИНИМУМ две раздельнче сетевые карты с оптикой. настроен бондинг

два физических роутера

два узла nginx
== Установка кластера кафки на 3 ноды.
https://youtu.be/OTxnQ289pvg
проперти, кластер, настройка
- кафка
- зукипер

== Понимание принципов работы kafka на практике
https://youtu.be/Ep9ZQjrn1Rs
- продюссер всегда пишет в лидера. остальные партиции на одной ноде только для чтения
все время хотелось понять как оно работает. шикаааарная статья. лайк

== Знакомство с хранилищем Ceph в картинках
https://habr.com/ru/post/313644/

Алгоритм CRUSH (Controlled Replicated Under Scalable Hashing)
- позволяет однозначно определить местоположение объекта на основе хеша имени объекта и определенной карты, которая формируется исходя из физической и логической структур кластера (датацентры, залы, ряды, стойки, узлы, диски)

== Как мы отказоустойчивый кластер запускали
https://habr.com/ru/company/first/blog/314106/
🔥1
== толковый плейлист по кластеру Postgres & Patroni
https://youtube.com/playlist?list=PLprvDkBQwz6YQLJQ_qlm3-gkk-BXYuuR0

== Что такое кластер Postgres, как он работает и для чего нужен Patroni
https://youtu.be/GtHtRyPcmIM

кластер постгреса работает из коробки

split-brain = разделение двух мастеров

постгрес не поддерживает мастер-мастер !

демон патрони занимается синхронизацием знанием о том кто мастер а кто реплика.

база etcd используется как транспорт и состояние для patroni

haproxy просто разруливает трафик на запись и на чтение. его мутирует patroni напрямую

НО хапрокси это единственная точка отказа

pgbouncer множественный коннект к постгресу . АБСОЛЮТНО БЕСПОЛЕЗЕН ЕСЛИ ИСПОЛЬЗУЮТСЯ ПЕРСИСТЕНТНЫЕ КОННЕКШНЫ
нужен только что бы использовать много частых коннекшнов, не создавая их часто физически

НИКОГДА НЕ ПОДНИМАЙТЕСЬ ПО СЕТЕВОМУ УРОВНЮ ЕСЛИ В ЭТОМ НЕТ НЕОБХОДИМОСТИ
container-ecosystem.drawio.png
181.7 KB
📝 Docker, Kubernetes, OCI, CRI-O, containerd & runc: How do they work together?

Взял вот в этой статье - An attempt to understand container runtime.

#containers #runc #containerd