2672
Патерны программирования. Архитектура ПО. Микросервисы @anothertechrock
❓Хотите создавать масштабируемую и отказоустойчивую микросервисную архитектуру?
19 ноября в 20:00 мск приглашаем на открытый вебинар, где вы узнаете, как применять ключевые стратегии Circuit Breaker, Retry и Load Balancing для повышения стабильности систем.
В современном мире сбоев и перегрузок не избежать. Но с правильными паттернами они не будут вас пугать. Мы разберем на практике, как защитить приложения от краха и обеспечить их стабильную работу даже при высокой нагрузке.
👨💻🛠👨🏻💻 Вебинар будет полезен разработчикам, архитекторам и DevOps-инженерам, которые хотят повысить производительность своих микросервисов, внедрив современные решения для автоматического масштабирования и балансировки.
🔴 Регистрируйтесь прямо сейчас и получите скидку на курс «Software Architect»
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика".
Классификация
Тип: Порождающий
Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов.
С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию.
Из чего состоит и как работает данный паттерн
1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
...
@abstractmethod
def create_product_b(self):
...
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()
def create_product_b(self):
return ConcreteProductB2()
class AbstractProductA(ABC):
@abstractmethod
def very_important_super_function_a(self) -> str:
...
class AbstractProductB(ABC):
@abstractmethod
def very_important_super_function_b(self) -> str:
...
class ConcreteProductA1(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A1"
class ConcreteProductA2(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A2"
class ConcreteProductB1(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B1"
class ConcreteProductB2(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B2"
def client(factory: AbstractFactory) -> str:
return factory.create_product_a().very_important_super_function_a()
for factory in (ConcreteFactory1, ConcreteFactory2, ...):
client(factory)
🔍 Что такое MVC?
MVC (Model-View-Controller) — это популярный архитектурный паттерн, который разделяет приложение на три компонента:
Model — отвечает за бизнес-логику и управление данными. Это сердце приложения, где происходит взаимодействие с базой данных, выполнение бизнес-правил и другие операции.
View — представляет собой интерфейс пользователя. Он отвечает за отображение данных и взаимодействие с пользователем, но не содержит бизнес-логики.
Controller — посредник между Model и View. Он получает запросы от пользователя, передает их Model и возвращает результаты во View.
💡 MVC позволяет четко разделить обязанности между компонентами, облегчая поддержку и масштабирование кода.
Как эффективно разделять приложения на микросервисы?
Расскажет Евгений Непомнящий — разработчик в IT Sense. Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом:
- рассмотрите принципы функциональной декомпозиции;
- научитесь выделять отдельные компоненты приложения;
- погрузитесь в методику EventStorming;
- изучите подход API First Design;
- узнаете, как разрабатывать API.
🗓 Встречаемся 28 октября в 20:00 мск в рамках курса «Software Architect». Доступна рассрочка на обучение!
🔴 Ссылка для регистрацииРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
В кругах корпоративных архитекторов всё чаще говорят о «потоках создания ценности» или Value Streams. Это мощный инструмент для анализа и проектирования целевого состояния организации.
На открытом онлайн-уроке «Value Streams: инструмент анализа потоков создания ценности в организации» вы узнаете:
- что такое Value Streams
- для чего нужен Value Streams
- о примерах Value Streams
- о связи Value Streams и Capability Map
👨💻🛠👨🏻💻 Будет интересно: руководителям всех уровней, корпоративным и бизнес-архитекторам, бизнес-аналитикам, системным аналитикам, руководителям проектов и владельцам продуктов. После вебинара вы можете приобрести курс «Enterprise Architect».
🗓 6 ноября, 20:00
🆓 Бесплатно. Урок в рамках старта курса «Enterprise Architect»
🔴 Записаться на событие
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Какие брокеры использовать, чтобы обеспечить асинхронную связь между микросервисами?
Узнайте на открытом практическом уроке «Брокеры сообщений: RabbitMQ и Kafka» от OTUS, где мы узнаем:
✅ что такое брокеры сообщений и как они помогают в архитектуре микросервисов
✅ основные различия между RabbitMQ и Kafka, включая их архитектурные подходы
✅ как развернуть и настроить RabbitMQ и Kafka для ваших приложений
✅ практическое использование обоих брокеров на реальных примерах в live demo
🗓 Встречаемся 24 октября в 20:00 мск в преддверии старта курса «Microservice Architecture». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
➡️ Ссылка для регистрацииРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Используйте умные ссылки – создавайте и настраивайте сервисы для динамического управления редиректами
Как именно, спросите вы?
А очень просто: приходите на открытый урок OTUS «Проектирование сервиса умных ссылок»
Вы узнаете:
- как спроектировать сервис умных ссылок и создавать ссылки с динамическими правилами редиректа
- как настраивать редирект в зависимости от геолокации, устройства пользователя и других параметров
- как разрабатывать и оптимизировать масштабируемый и гибкий сервис умных ссылок
Вебинар проведёт действующий директор компании по разработке ПО, в прошлом – профессиональный разработчик на C++
👨💻🛠👨🏻💻 Будет интересно: бэкенд-разработчикам, фулстек-разработчикам, техническим архитекторам
📅 8 октября, 20:00
🆓 Бесплатно. Урок в рамках старта курса «Microservice Architecture»
🔴 Записаться на открытый урокРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как создавать код, который легко модифицировать и поддерживать?
Узнайте на открытом вебинаре «Практическое руководство по применению SOLID-принципов» 16 сентября в 20:00 мск, где мы разберем:
- основы и значение каждого из SOLID-принципов;
- пошаговый алгоритм применения SOLID для разработки расширяемого и поддерживаемого кода;
- примеры применения SOLID-принципов для решения реальных задач:
- как минимизировать затраты на изменение требований к ПО, следуя SOLID.
Урок для backend и fullstack-разработчиков, архитекторов ПО и начинающих программистов.
Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники вебинара получат специальную цену на обучение!
Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие.
Вопрос с собеседования
Для чего нужен Decorator паттерн в Javascript? Приведите пример.
Ответ:
Javascript предоставляет удивительно гибкие возможности по работе с функциями: их можно передавать, в них можно записывать данные как в объекты, у них есть свои встроенные методы.
Шаблон декоратора динамически расширяет (украшает) поведение объекта. Возможность добавления нового поведения во время выполнения достигается с помощью объекта Decorator, который «оборачивается» вокруг исходного объекта. Несколько декораторов могут добавлять или переопределять функциональность исходного объекта.
Примером декоратора является управление безопасностью, где бизнес-объектам предоставляется дополнительный доступ к привилегированной информации в зависимости от привилегий аутентифицированного пользователя. Например, менеджер по персоналу приступает к работе с объектом сотрудника, к которому добавлена (то есть украшена) запись о зарплате сотрудника, чтобы можно было просматривать информацию о зарплате.
Декораторы обеспечивают гибкость статически типизированных языков, позволяя вносить изменения во время выполнения, а не наследование, которое происходит во время компиляции. Однако JavaScript - это динамический язык, и возможность расширения объекта во время выполнения встроена в сам язык.
Пример использования декоратора в JavaScript:function User(name) {#interview
this.name = name,
this.print = () => console.log(this.name)
}
const jane = new User ('Jane Doe')
jane.print() // 'Jane Doe'
function DecorateWithCity(user, city) {
user.city = city
user.print = function() {
console.log (${this.name} from ${this.city})
}
}
DecorateWithCity(jane, 'NewYork')
jane.print(); //'Jane Doe from New York'
Вопрос с собеседования
Для чего нужен Decorator паттерн в Javascript? Приведите пример.
Ответ опубликуем вечером, а пока пишите свои варианты в комментариях!
#interview
Использование брокера сообщений Apache Kafka в распределенных очередях
24 июля в 20:00 мск
❓Хотите узнать, как эффективно управлять сообщениями в масштабируемых распределенных системах? Тогда этот открытый вебинар для вас!
Мы разберем основы и архитектуру Apache Kafka, принципы работы с распределенными очередями, а также научимся настраивать и развертывать кластер Kafka в Docker. Вы увидите реальные примеры использования Kafka для обмена сообщениями между сервисами и узнаете о лучших практиках и рекомендациях по интеграции Kafka в ваши проекты.
💻 Урок будет полезен Fullstack и Backend-разработчикам, DevOps-инженерам, архитекторам ПО и администраторам систем, а также всем, кто хочет углубить свои знания об Apache Kafka и его применении.
🔴 Регистрация открыта: https://vk.cc/cyt6ugРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Вопрос с собеседования
Что такое Dependency inversion principle?
Ответ опубликуем завтра, а пока пишите свои варианты в комментариях!
#interview
Лучшие практики разработки ПО, которые помогут строить высококачественные, поддерживаемые и расширяемые системы
Изучите их на открытом практическом уроке «Domain Driven Design» от OTUS, где мы разберем:
- основные принципы DDD;
- проектирование Bounded Context;
- применение DDD в архитектуре проекта.
Спикер — опытный разработчик в одной из крупнейших российских компаний.
Встречаемся 29 мая в 20:00 мск в рамках старта большого курса «Highload Architect». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
➡️ Ссылка для регистрации: https://vk.cc/cwQQDX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Шаблоны проектирования Node.JS
Авторы: М. Каскиаро, Л. Маммино
Год издания: 2017
#ru #nodejs
Скачать книгу
Хотите стать профессионалом в области разработки архитектуры ПО?
Тогда присоединяйтесь к нашему бесплатному вебинару «Взаимодействия на основе событийной модели»!
💻 Вебинар будет полезен для разработчиков и архитекторов, всего за 2 часа вы узнаете:
- как использовать события для асинхронного взаимодействия;
- какие это дает плюсы и минусы по сравнению с request-reply архитектурой;
- некоторые паттерны реализации систем с использованием событий.
🗓 Занятие пройдёт 22 апреля в 19:00 мск в рамках набора на онлайн-курс «Software Architect». Спикер — опытный разработчик на С++, Java, Kotlin и Kafka.
Для участников вебинара будет доступна специальная цена на обучение (может даже написать персональное предложение? или добавить в конце со скидкой) — вы сможете обсудить свое обучение с менеджерами OTUS.
Зарегистрируйтесь, чтобы посетить открытый урок: https://vk.cc/cw7sKGРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
В библиотеке aiogram dialog есть диалог менеджер, он реализует базовую функциональность управления диалогами: старт разным способом, доступ к контексту и т.п.
Также есть менеджер - это временный объект. Он создаётся на время обработки конкретного события. Соответственно, его надо постоянно пересоздавать.
В какой-то момент я решил что неплохо дать возможность что-то в менеджере переопределить, соответственно нужно и фабрику менять.
Для решения этой проблемы абстрактная фабрика подошла лучше всего.
❓Какой самый больной вопрос для IT-команд? Тестирование микросервисов!
Откройте все секреты! Как повысить отказоустойчивость и управлять взаимодействиями между сервисами?
👨💻🛠👨🏻💻 На открытом уроке мы разберем всё: от юнит-тестов до тестов производительности.
Присоединяйтесь к бесплатному вебинару 7 ноября в 20:00 мск и получите практические инструменты для работы с микросервисами. А еще скидку на обучение на курсе «Software Architect»!
🔴 Регистрируйтесь прямо сейчас и получите доступ к лучшим практикам тестирования в распределённых системахРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.
adapter = Adapter()
result = adapter.do() + "5"
2. Интерфейс с которым может работать клиентский код.
class Test1:
def do(self) -> str:
return "3"
3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.
class Test2:
def specific_do(self) -> float:
return 3.4
4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.
class Adapter(Test1, Test2):
def do(self) -> str:
return f"Translated: {round(self.specific_do())}"
Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.
Плюсы данного паттерна
1. Скрывает все "низкоуровневые" преобразования интерфейсов от клиента. Реализует принцип абстракция.
Минусы данного паттерна
Таковых я не обнаружил
Пример и задача
В качестве примера возьмём класс с методом do который возвращает небольшой текст. Также есть класс с методом secret_do который возвращает другую строку, зашифрованную шифром Цезаря со сдвигом 5, которая ещё и полностью развёрнута.
В виде клиента выступает функция которая постит текст в ваш блог.(Можете просто создать функцию которая выводит переданный в неё текст). Естественно она должна принимать только расшифрованный текст.
Реализуйте адаптер для второго класса, который спасёт ваш блог от зашифрованных постов.
Пример из реального кода
https://github.com/aiogram/aiogram/blob/b190bbba1915ed3b7f311a780f34723ebd6b5acd/aiogram/contrib/fsm_storage/redis.py#L280
Вот его объяснение какую задачу решает адаптер в данном случае:
Здесь адаптер дает возможность контроллеру хранилища (RedisStorage) работать с первой версией редиса, т.е. адаптирует aioredis-v1, там еще есть адаптер для aioredis-v2, но он в отличие от первой версии адаптирует только создание клиента редиса
Дополнительные материалы
https://habr.com/ru/post/85095/
🕯 Паттерн Proxy (Прокси)
Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту, обеспечивая контроль над его использованием.
Использование:
🔹 Когда необходимо контролировать доступ к ресурсоемким объектам или операциям.
🔹 Для добавления дополнительной функциональности без изменения исходного объекта.
Преимущества:
1️⃣ Позволяет контролировать доступ к реальному объекту, например, для ленивой инициализации или кэширования. Это может улучшить производительность, так как ресурсоемкие объекты создаются только тогда, когда они действительно нужны.
2️⃣ Позволяет контролировать доступ к объектам, добавляя проверки перед вызовом методов. Это полезно для управления доступом в сетевых приложениях или для защиты данных.
3️⃣ Позволяет оптимизировать работу с удаленными объектами, минимизируя количество вызовов или обрабатывая их асинхронно. Это снижает нагрузку на систему и повышает скорость работы приложения.
4️⃣ Может использоваться для логирования или отслеживания вызовов методов реального объекта, не внося изменений в сам объект. Это упрощает мониторинг и отладку системы.
Фабричный метод — это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
from __future__ import annotationsЧитать полностью…
from abc import ABC, abstractmethod
class Creator(ABC):
"""
Класс Создатель объявляет фабричный метод, который должен возвращать объект
класса Продукт. Подклассы Создателя обычно предоставляют реализацию этого
метода.
"""
@abstractmethod
def factory_method(self):
"""
Обратите внимание, что Создатель может также обеспечить реализацию
фабричного метода по умолчанию.
"""
pass
def some_operation(self) -> str:
"""
Также заметьте, что, несмотря на название, основная обязанность
Создателя не заключается в создании продуктов. Обычно он содержит
некоторую базовую бизнес-логику, которая основана на объектах Продуктов,
возвращаемых фабричным методом. Подклассы могут косвенно изменять эту
бизнес-логику, переопределяя фабричный метод и возвращая из него другой
тип продукта.
"""
# Вызываем фабричный метод, чтобы получить объект-продукт.
product = self.factory_method()
# Далее, работаем с этим продуктом.
result = f"Creator: The same creator's code has just worked with {product.operation()}"
return result
"""
Конкретные Создатели переопределяют фабричный метод для того, чтобы изменить тип
результирующего продукта.
"""
class ConcreteCreator1(Creator):
"""
Обратите внимание, что сигнатура метода по-прежнему использует тип
абстрактного продукта, хотя фактически из метода возвращается конкретный
продукт. Таким образом, Создатель может оставаться независимым от конкретных
классов продуктов.
"""
def factory_method(self) -> Product:
return ConcreteProduct1()
class ConcreteCreator2(Creator):
def factory_method(self) -> Product:
return ConcreteProduct2()
class Product(ABC):
"""
Интерфейс Продукта объявляет операции, которые должны выполнять все
конкретные продукты.
"""
@abstractmethod
def operation(self) -> str:
pass
"""
Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
"""
class ConcreteProduct1(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct1}"
class ConcreteProduct2(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct2}"
def client_code(creator: Creator) -> None:
"""
Клиентский код работает с экземпляром конкретного создателя, хотя и через
его базовый интерфейс. Пока клиент продолжает работать с создателем через
базовый интерфейс, вы можете передать ему любой подкласс создателя.
"""
print(f"Client: I'm not aware of the creator's class, but it still works.\n"
f"{creator.some_operation()}", end="")
if __name__ == "__main__":
print("App: Launched with the ConcreteCreator1.")
client_code(ConcreteCreator1())
print("\n")
print("App: Launched with the ConcreteCreator2.")
client_code(ConcreteCreator2())
Хотите узнать, как использовать Patroni для управления высокодоступными кластерами PostgreSQL?
Ждем вас на открытом вебинаре 24 октября в 20:00 мск, где мы разберем:
- что такое Patroni и как он помогает обеспечить высокую доступность для PostgreSQL;
- основные компоненты и архитектуру Patroni;
- настройку и конфигурацию Patroni для работы с PostgreSQL;
- примеры использования Patroni для управления кластером PostgreSQL;
- практические советы по оптимизации и мониторингу работы кластера.
👨💻🛠👨🏻💻 Урок для DevOps-инженеров, системных администраторов, backend-разработчиков и тимлидов, стремящихся обеспечить высокую доступность PostgreSQL.
Спикер Андрей Поляков — старший разработчик в Unlimint.
Встречаемся в преддверии старта курса «Highload Architect». Все участники вебинара получат специальную цену на обучение! Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Что поможет обеспечить стабильную работу высоконагруженной системы?
Эффективный мониторинг.
О том, как лучше отслеживать и поддерживать стабильность систем под высокой нагрузкой, вы узнаете на открытом уроке «Мониторинг в высоконагруженных проектах»
👨💻🛠👨🏻💻 Будет интересно: девопсам, сисадминам, бэкенд-разработчикам, тимлидам.
Вы научитесь:
Настраивать мониторинг для высоконагруженных проектов
Настраивать мониторинг для выявления и предотвращения проблем
Использовать данные мониторинга для повышения стабильности и производительности системы
Усиливать отказоустойчивость архитектуры
А ещё получите ценные советы для оптимизации мониторинга в реальных проектах.
Урок проведёт Олег Мифле, бэкенд-разработчик VK с 15-летним опытом в IT
🆓 Участие бесплатное. Урок в рамках старта курса «Highload Architect»
🔴 Записаться на открытый урокРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Не знаете, как эффективно управлять конфигурацией и обеспечивать консенсус данных? Ваши проекты сталкиваются с проблемами масштабируемости и надежности?
А теперь представьте, что ваши системы работают как часы, координация и синхронизация на высшем уровне, а конфигурация управляется легко и без ошибок. Вы освоили Apache Zookeeper и ваши проекты достигают новых высот надежности и масштабируемости!
Присоединяйтесь к открытому вебинару 21 августа в 20:00 мск. Там мы решим все эти проблемы и ответим на возникающие вопросы.
👨💻🛠👨🏻💻 Урок будет полезен разработчикам, DevOps-инженерам, администраторам систем и сетей, архитекторам ПО и всем, кто хочет глубже понять работу Apache Zookeeper.
🔴 Запишитесь прямо сейчас, чтобы не пропустить мероприятиеРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Готовы узнать, как настроить мониторинг RabbitMQ с помощью Telegraf, InfluxDB и Grafana?
🚀Ждем вас на открытом вебинаре 13 августа в 20:00 мск, где вы разберете:
- как настроить Telegraf для сбора метрик RabbitMQ;
- конфигурацию InfluxDB для хранения и обработки метрик;
- создание и настройку дашбордов в Grafana для мониторинга RabbitMQ;
- персонализацию дашбордов для отображения нужной информации;
- практическое руководство по работе с Grafana для визуализации данных.
👨💻 Урок будет полезен backend- и fullstack-разработчикам, DevOps-инженерам, архитекторам ПО и специалистам по мониторингу и анализу данных.
Спикер — эксперт по тестированию, работает в компании-разработчике инструмента нагрузочного тестирования, один из администраторов крупнейшего канала нагрузочных тестировщиков.
🔴 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятиеРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Хотите узнать, как справиться с высокой нагрузкой и обеспечить максимальную производительность вашего приложения? Присоединяйтесь к открытому вебинару «Роль Tarantool в высоконагруженной архитектуре», где мы разгадаем секреты использования Tarantool в high-load проектах.
Узнайте, как Tarantool может стать ключом к эффективной работе в условиях высокой нагрузки. Мы рассмотрим примеры использования Tarantool в реальных проектах и обсудим его основные особенности.
Получите доступ к архитектурным шаблонам и примерам применения Tarantool для оптимизации производительности и обеспечения отказоустойчивости систем.
🔴 Встречаемся 24 июля в 20:00 мск, регистрация открыта: https://vk.cc/cytzcCРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Вопрос с собеседования
Что такое Dependency inversion principle?
Ответ:
Dependency inversion principle - принцип инверсии зависимостей.
Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
#interview
Представления архитектуры — что это и как с ними работать?
Навыки работы с архитектурой увеличивают ценность любого IT-специалиста. Самое время погрузиться в тему подробнее — приходите на открытый практический урок от OTUS, где опытный эксперт разберет:
- метод ADR/ADL;
- артефакты архитектуры;
- варианты представления архитектуры;
- несколько интересных кейсов.
🗓 Встречаемся 30 мая в 20:00 мск в преддверии старта курса «Microservice Architecture». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
Ссылка для регистрации: https://vk.cc/cx1GNtРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Кто такой архитектор ПО и как им стать?
Архитектор ПО — одна из самых востребованных позиций на современном рынке IT.
Узнайте, что нужно, чтобы претендовать на эту должность, на бесплатном практическом уроке от OTUS. Спикер — опытный эксперт из крупной компании. На вебинаре разберём:
- какую роль выполняет архитектор и зачем он нужен;
- какие бывают архитекторы;
- чем отличается архитектура от проектирования.
Встречаемся 20 мая в 19:00 мск в рамках курса «Software Architect». Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!
Ссылка для регистрации: https://vk.cc/cwOXboРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🎯 Хотите на профессиональном уровне проектировать архитектуру, создавать масштабируемые отказоустойчивые приложения и решать нетривиальные задачи при их внедрении?
Тогда вам точно нужно посмотреть открытые уроки и программу курса «Microservice Architecture» от OTUS.
На курсе вы:
- рассмотрите вопросы проектирования backend-приложений и их дальнейшего сопровождения;
- изучите подходы к работе с legacy-сервисами;
- научитесь решать проблемы с согласованностью изменений или с оркестрацией сервисов;
- как разработчик научитесь базовым навыкам работы с Kubernetes.
Каждый студент самостоятельно создает микросервисное приложение, тестирует его на нагрузку и проблемы сетевой связности, подтверждая готовность к работе в реальном производственном окружении.
Пройдите короткий тест, чтобы получить спец.цену на курс: https://vk.cc/cwf56EРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
SQL Query Design Patterns and Best Practices
Автор: Chi Zhang
Год издания: 2023
#sql #en
Скачать книгу