conductor-oss/conductor
Conductor - это платформа, изначально созданная в Netflix для оркестровки микросервисов и событий, написанный на Java.
Conductor OSS поддерживается командой разработчиков в Orkes вместе с членами сообщества с открытым исходным кодом.git remote set-url origin https://github.com/conductor-oss/conductor
https://github.com/conductor-oss/conductor
Хотите узнать, как работает логистическая платформа в Яндекс Маркете? 🔥
В новом выпуске подкаста I like techno от Яндекса герои обсудили, как устроена платформа сейчас и как она менялась за последние 10 лет.
Команда логистики разрабатывает всё для собственной доставки Маркета: от создания заказа до его перевозки между сортировочными центрами и доставки курьером или в пункт выдачи заказов. Ребята делают код осязаемым, а офлайн технологичным, используют математические структуры, конвейерные системы, собственных роботов и немного магии.
Спикеры — спецы, погруженные в тему:
👉 Слава Цыкин, СТО логистической платформы
👉 Рома Кульчицкий, руководитель службы стабильности и инфраструктуры
👉 Андрей Захрямин, руководитель команды разработки инфраструктуры Логистики
👉 Кирилл Дмитриев, руководитель службы разработки складских систем и систем учёта
Слушать на Яндекс Музыке
Смотреть на Youtube
Дайте определение терминам «простой», «составной» (composite), «потенциальный» (candidate) и «альтернативный» (alternate) ключ.
Простой ключ состоит из одного атрибута (поля). Составной — из двух и более.
Потенциальный ключ - простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись.
Из множества всех потенциальных ключей набора данных выбирают первичный ключ, все остальные ключи называют альтернативными.
#вопросы_с_собеседований
Что такое «пул потоков»?
Создание потока является затратной по времени и ресурсам операцией. Количество потоков, которое может быть запущено в рамках одного процесса также ограниченно. Чтобы избежать этих проблем и в целом управлять множеством потоков более эффективно в Java
был реализован механизм пула потоков (thread pool
), который создаётся во время запуска приложения и в дальнейшем потоки для обработки запросов берутся и переиспользуются уже из него. Таким образом, появляется возможность не терять потоки, сбалансировать приложение по количеству потоков и частоте их создания.
Начиная с Java 1.5 Java API
предоставляет фреймворк Executor
, который позволяет создавать различные типы пула потоков:
• Executor
- упрощенный интерфейс пула, содержит один метод для передачи задачи на выполнение;
• ExecutorService
- расширенный интерфейс пула, с возможностью завершения всех потоков;
• AbstractExecutorService
- базовый класс пула, реализующий интерфейс ExecutorService
;
• Executors
- фабрика объектов связанных с пулом потоков, в том числе позволяет создать основные типы пулов;
• ThreadPoolExecutor
- пул потоков с гибкой настройкой, может служить базовым классом для нестандартных пулов;
• ForkJoinPool
- пул для выполнения задач типа ForkJoinTask;
... и другие.
Методы Executors
для создания пулов:
• newCachedThreadPool()
- если есть свободный поток, то задача выполняется в нем, иначе добавляется новый поток в пул. Потоки не используемые больше минуты завершаются и удалются и кэша. Размер пула неограничен. Предназначен для выполнения множество небольших асинхронных задач;
• newCachedThreadPool(ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newFixedThreadPool(int nThreads)
- создает пул на указанное число потоков. Если новые задачи добавлены, когда все потоки активны, то они будут сохранены в очереди для выполнения позже. Если один из потоков завершился из-за ошибки, на его место будет запущен другой поток. Потоки живут до тех пор, пока пул не будет закрыт явно методом shutdown()
.
• newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newSingleThreadScheduledExecutor()
- однопотоковый пул с возможностью выполнять задачу через указанное время или выполнять периодически. Если поток был завершен из-за каких-либо ошибок, то для выполнения следующей задачи будет создан новый поток.
• newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newScheduledThreadPool(int corePoolSize)
- пул для выполнения задач через указанное время или переодически;
• newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• unconfigurableExecutorService(ExecutorService executor)
- обертка на пул, запрещающая изменять его конфигурацию;
Что представляет собой «обмен сообщениями»?
Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. В ООП
посылка сообщения (вызов метода) — это единственный путь передать управление объекту. Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод. Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding
).
Пусть требуется создать физическую модель, описывающую сталкивающиеся шары разных размеров. Традиционный подход к решению этой задачи примерно таков: определяется набор данных, описывающих каждый шар (например, его координаты, массу и ускорение); каждому шару присваивается уникальный идентификатор (например, организуется массив, значение индекса которого соответствует номеру шара), который позволит отличать каждый из шаров от всех других. Наконец, пишется подпрограмма с названием, скажем, bounce; эта процедура должна на основе номера шара и его начальных параметров соответствующим образом изменять данные, описывающие шар. В отличие от традиционного подхода объектно-ориентированная версия программы моделирует каждый из шаров посредством объекта. При этом объект, соответствующий конкретному шару, содержит не только его параметры, но и весь код, описывающий поведение шара при различных взаимодействиях. Так, каждый шар будет иметь собственный метод bounce(). Вместо того, чтобы вызывать подпрограмму bounce с аргументом, определяющим, скажем, шар №3, необходимо будет передать объекту «шар №3» сообщение, предписывающее ему выполнить столкновение.
Java-программа для преобразования десятичной системы счисления в двоичную
Воспользуемся побитовыми операторами для решения данной задачи.
Временная сложность: O (1)
Вспомогательное пространство: O (1).
Если бы вы могли сравнить принципы работы Garbage Collector в Java с процессами в живой природе, какой был бы самый подходящий аналог и почему?
Garbage Collector в Java можно сравнить с процессом опадания и разложения листьев в лесу. Так же, как опавшие листья удаляются из экосистемы леса, освобождая место и питательные вещества для новых растений, Garbage Collector удаляет неиспользуемые объекты из памяти, освобождая ресурсы для новых объектов.
#вопросы_с_собеседований
Объясните принципы работы и применение «стримов» (streams) в Java. Какие операции можно выполнять с использованием стримов? Приведите пример кода с использованием стримов.
Ответ:
Стримы представляют собой последовательность элементов, которую можно обрабатывать функциональными операциями. Стримы применяют в фильтрации для выборки элементов, для отображения (Mapping), сортировки и свертки (Reduction).
Объяснение кода:words.stream()
: Создание стрима из списка слов..filter(word -> word.length() > 5)
: Фильтрация слов, оставляя только те, у которых длина больше 5 символов..map(String::toUpperCase)
: Преобразование каждого слова в верхний регистр..sorted()
: Сортировка слов..collect(Collectors.toList())
: Сбор результатов в список.
Результат выводится на экран: [BANANA, ORANGE].
ForkJoinPool.ManagedBlockerForkJoinPool.ManagedBlocker
является интерфейсом в Java, который предоставляет механизм для блокировки потока внутри фреймворка ForkJoinPool
. ForkJoinPool
— это фреймворк параллельного выполнения введенный в Java 7.
Интерфейс ManagedBlocker
предоставляет метод boolean block()
и используется для реализации пользовательских операций, которые могут вызвать блокировку потока. Этот интерфейс обычно используется в ситуациях, когда задача внутри ForkJoinPool
ожидает результат выполнения другой задачи, но не хочет приводить к блокировке потока.
#для_продвинутых
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке
#вопросы_с_собеседований
Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
☕️ При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass).
☕️ Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type.
☕️ Можно сузить возвращаемое значение, если они совместимы.
Пример на картинке.
Byteman
Byteman — это инструмент для трассировки, мониторинга и тестирования поведения приложений Java и кода среды выполнения JDK. Он позволяет вставлять Java-код в методы приложения или методы среды выполнения Java без необходимости повторной компиляции, повторной упаковки или даже повторного развертывания приложения.
#для_продвинутых
А вы знали, что 70% опрошенных Stack Overflow разработчиков уже используют инструменты ИИ-кодинга в 2024 году? 🤔
Интеграция нейросетей не только сократит объем вашей работы, но и поможет на этом заработать.
Присоединяйся к их числу и залетай на наш бесплатный вебинар по промт-инжинирингу 😉
По итогам эфира ты узнаешь:
— Кто такой промт-инженер и чем он занимается;
— Кому в действительности нужны его услуги и какие результаты это даст;
— Где компаниям ищут промт-инженера;
— Сколько платят промт-инженеру в России и мире;
— Кто может стать промт-инженером и какой порог входа;
Кликай на ссылку и забирай подробную информацию вместе с классными бонусами 👈🏼
erid: LjN8K85J7
ООО Зерокодер, ИНН 9715401631, ОГРН - 1217700246026
#вопросы_с_собеседований
Что такое сигнатура метода?
Это уникальная строка, которая описывает типы и порядок аргументов, а также возвращаемый тип метода. Сигнатура используется компилятором Java для различения методов с одинаковым именем, но отличающихся по своим параметрам.
#вопросы_с_собеседований
Что такое «фреймворк Fork/Join»?
Фреймворк Fork/Join
, представленный в JDK 7
, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.
• Этап Fork
: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.
• Этап Join
: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort
— массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join
будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.
Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует work-stealing
алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.
💯Как сделать код более понятным и надежным с помощью структур данных Clojure?
Узнайте на практическом открытом уроке "Структуры данных Clojure" от OTUS, где мы:
- познакомимся с основными примитивными типами данных и персистентными структурами, которые являются основой функционального программирования не только в Clojure;
- рассмотрим использование transient-структур для повышения производительности;
- поговорим про Structural Sharing и почему неизменяемые структуры тоже могут быть быстрыми.
Полученные знания пригодятся для работы с Clojure и другими функциональными языками программирования!
⏰ Встречаемся 13 июня в 20:00 мск в рамках курса «Clojure Developer». Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйся прямо сейчас, чтобы не пропустить бесплатный урок: https://otus.pw/eIBy/
Azure Event Hubs и Java – потоковая обработка больших данных
Azure Event Hubs – это большая часть платформы облачных сервисов Microsoft, предоставляющая решение для потоковой обработки больших объемов данных. Сегодня мы кратко рассмотрим, как Java разработчики могут использовать Event Hubs в своих проектах.
Давайте рассмотрим Github репозиторий Microsoft с SDK для работы с Azure Event Hubs на Java.
1. Подключение к Event Hubs: Вы можете использовать EventHubProducerClient для отправки событий и EventHubConsumerClient для получения событий. Вам нужно будет предоставить строку подключения и имя вашего Event Hub.
2. Отправка событий: Метод send позволяет отправить одно событие или пакет событий.
3. Получение событий: Создайте EventProcessorClient для обработки входящих событий. Вам нужно будет реализовать ProcessEvent и ProcessError методы.
Пример кода из репозитория демонстрирует базовые операции с Azure Event Hubs на Java. Он поможет вам понять, как использовать эту технологию в своих проектах.
Более подробную информацию можно найти в официальной документации Microsoft.
Потоковая обработка данных является критически важной для многих предприятий, и Azure Event Hubs предоставляет мощный инструмент для эффективного управления этими данными. Будьте готовы к облачной эре с Azure!
Преобразуем строку в объект
Используем метод Class.forName(). Этот метод принимает параметр className , который является классом, для которого требуется его экземпляр.
Инструментация байт-кода Java
В рамках текущей статьи будет рассказано о способах инструментации байт-кода java или, другим языком, внесения изменений в компилированные файлы java .class. Здесь будут приведены примеры работы с фреймворками Javaassist и ASM и базовое описание байт-кода.
Смотреть статью
#вопросы_с_собеседований
Объясните принципы работы и использование Future и Callable в Java для выполнения асинхронных задач. Приведите пример кода с использованием Future и Callable.
Ответ:
— Callable
: Представляет собой задачу, которую можно выполнить и получить результат.
— Future
: Интерфейс, предназначенный для представления результата асинхронной операции. Он позволяет проверять статус завершения задачи, ожидать завершения и получать результат.
Объяснение:ExecutorService executorService = Executors.newSingleThreadExecutor();
: Создание ExecutorService
с одним потоком.Callable<String> callableTask = ...;
: Создание объекта Callable
, представляющего асинхронную задачу.Future<String> future = executorService.submit(callableTask);
: Подача задачи на выполнение и получение объекта Future
, с помощью которого можно управлять и получать результат асинхронной задачи.String result = future.get();
: Ожидание завершения задачи и получение результата. Если задача еще не завершена, метод get()
будет блокировать текущий поток до завершения задачи.executorService.shutdown();
: Завершение работы ExecutorService после завершения всех задач.
Примечание:
Использование Callable
и Future
полезно в ситуациях, когда вы хотите выполнить асинхронную задачу и получить результат её выполнения. Это может быть полезно в приложениях, где необходимо избегать блокировки главного потока ожиданием завершения долгих операций.
#вопросы_с_собеседований
Расскажите о принципах работы и применении ExecutorService в Java для управления потоками. Приведите пример использования ExecutorService.
Ответ:
ExecutorService — это фреймворк в Java для управления выполнением потоков. Он предоставляет высокоуровневый интерфейс для управления потоками, скрывая детали создания, управления и завершения потоков.
Преимущества:
— Управление пулом потоков.
— Переиспользование потоков.
— Управление жизненным циклом потоков.
Объяснение:Executors.newFixedThreadPool(2)
: Создание пула потоков с фиксированным числом (в данном случае, 2) потоков.executorService.execute(...)
: Подача задач на выполнение. ExecutorService
автоматически управляет потоками из пула для выполнения этих задач.shutdown()
: Вызывается для завершения работы ExecutorService
после завершения всех задач. После вызова shutdown, ExecutorService
больше не принимает новые задачи, но выполняет ранее добавленные.
Примечание:ExecutorService
предоставляет также методы для выполнения задач с возвращаемым значением, планирования задач на определенное время и другие возможности управления потоками. Он является частью более общего фреймворка управления выполнением (Executor framework) в Java.
TimeUnitTimeUnit
— этоперечисление (enum), которое предоставляет удобные константы для работы с временем. Этот класс обычно используется вместе с классом ExecutorService
из пакета java.util.concurrent
для управления временем ожидания выполнения задач.TimeUnit
содержит константы для различных временных единиц, таких как наносекунды, микросекунды, миллисекунды, секунды, минуты и часы. Он предоставляет методы для конвертации времени из одной единицы в другую.
#для_продвинутых
RejectedExecutionHandlerRejectedExecutionHandler
— это интерфейс, используемый для определения стратегии обработки задач, когда они не могут быть приняты для выполнения в пуле потоков. Этот интерфейс содержит единственный метод rejectedExecution
, который вызывается, когда пул потоков не может принять задачу. Разработчики могут предоставить свою реализацию RejectedExecutionHandler
для определения способа обработки отклоненных задач.
#для_продвинутых
Объясните процесс загрузки, инициализации, выполнения и выгрузки класса в Java Virtual Machine (JVM). Какие шаги выполняются на каждом этапе?
Ответ:
Загрузка (Loading):
— Нахождение и загрузка класс-файла: Class Loader ищет и загружает байт-код класса из файловой системы, JAR-архива, сети или другого источника.
— Создание структур данных: Создаются структуры данных для представления класса в памяти JVM, такие как Class объект.
Подготовка (Preparation):
— Выделение памяти для статических переменных: Выделяется память для статических переменных, инициализированных значением по умолчанию.
Инициализация (Initialization):
— Инициализация статических переменных и выполнение статических блоков: Статические переменные получают значения из кода инициализации, выполняются статические блоки.
Выполнение (Execution):
— Вызов метода main()
: Если класс содержит метод public static void main(String[] args)
, JVM вызывает этот метод для выполнения программы.
— Вызов других методов: JVM вызывает другие методы по мере необходимости.
Выгрузка (Unloading):
— Освобождение памяти: Если класс больше не используется и нет активных ссылок на его объекты, JVM может выгрузить класс и освободить память.
#вопросы_с_собеседований
Лучше покупать USDT, BTC и ETH, чем вообще не заходить в крипту, однако БОЛЬШИЕ ИКСЫ делаются на другом.
Евгений Абрамов заходит в уникальные проекты, куда не может попасть рядовой инвестор, и вы можете делать это вместе с ним. Чтобы узнать, как ВОВРЕМЯ и БЕЗОПАСНО заходить в "жирные" криптопроекты, перейдите и посмотрите обучающие видео в его боте.
Если вы:
- Ищете новые инструменты для увеличения капитала
- Имеете деньги, но не знаете, как лучше инвестировать в криптовалюту
- Желаете быть среди первых, кто зарабатывает на глобальных криптопроектах
ССЫЛКА НА БОТ
Запустите бота и получите доступ к этой бесплатной возможности! 🚀
Реклама ИП Пикаев Д. И.
ИНН 773138608129
Erid: 2Vtzqv1HuWm
Byte Buddy
Byte Buddy — это библиотека Java для генерации байт-кода во время выполнения. Она позволяет создавать новые классы, модифицировать существующие и перехватывать вызовы методов.
#для_продвинутых
CGLIB
CGLIB (Code Generation Library) — это библиотека Java, предназначенная для динамической генерации байт-кода. Она позволяет создавать новые классы и модифицировать существующие во время выполнения программы. CGLIB используется в различных фреймворках, таких как Spring, Hibernate и Mockito.
#для_продвинутых
Jansi
Jansi — это библиотека Java, которая позволяет форматировать текстовый вывод в консоли. Она предоставляет широкий спектр функций для управления цветами, шрифтами и другими аспектами отображения текста.
#для_продвинутых