Том Демарко (также ДеМарко, род. 20 августа 1940 года, Хейзлтон, штат Пенсильвания, США) — классик инженерии ПО; «Peopleware», структурный анализ, влияние на практику менеджмента проектов.
Мартин Догиамас (Martin Dougiamas 1969) — основатель Moodle, одной из самых распространённых LMS в мире.
Эрик Голес Чакк (Антофагаста, 21 августа 1951) — учёный в области дискретной математики и клеточных автоматов, лауреат премий за вклад в информатику Чили.
1912 — Томас Эдисон патентует электробатарею.
1956 — Начала действовать ядерная электростанция «Колдер Холл», первая ядерная электростанция Британии.
1964 — Основан Интелсат — компания, владеющая группировкой телекоммуникационных спутников.
1975 — запуск американской межпланетной станции Viking 1 к Марсу.
2024 — прекращена работа мессенджера «Агент Mail.ru» (пользователям предложено перейти на VK).
#Biography #Birth_Date #Events #20Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
[Совет по Java #073]
Тема:
Проблема: Классы, реализующие
Методы
Методы
Существуют также перегруженные версии
Решение: Четко различайте сценарии использования. Если поток должен ждать неопределенно долго, пока операция не станет возможной — используйте
Если вы хотите только попытаться выполнить операцию и немедленно вернуть результат — используйте
В многопоточных приложениях предпочтительнее использовать таймауты, чтобы система могла корректно реагировать на перегрузки и завершать потоки.
Объяснение:
При использовании таймаутов всегда проверяйте возвращаемые значения, чтобы отличить успех от таймаута (для
#Java #советы
Тема:
BlockingQueue методы put() и take() блокируются, а offer() и poll() с таймаутом — нет.Проблема: Классы, реализующие
BlockingQueue (например, ArrayBlockingQueue, LinkedBlockingQueue), предоставляют два набора методов для добавления и извлечения элементов. Методы
put() и take() блокируют поток до тех пор, пока не появится возможность выполнить операцию (для put() — пока не освободится место, для take() — пока не появится элемент). Методы
offer() и poll() являются неблокирующими: они пытаются выполнить операцию и сразу возвращают результат (true/false или элемент/null). Существуют также перегруженные версии
offer(e, timeout, unit) и poll(timeout, unit), которые ожидают указанное время и затем возвращают результат. Разработчики часто путают их, полагая, что put() и take() — это просто синонимы, и используют их в ситуациях, где нужна неблокирующая проверка, что приводит к зависанию потоков. В других случаях они используют offer() и poll() без таймаута, когда нужно дождаться освобождения места или появления элемента, что приводит к частым повторным попыткам и busy-wait.Решение: Четко различайте сценарии использования. Если поток должен ждать неопределенно долго, пока операция не станет возможной — используйте
put() и take(). Если вы хотите только попытаться выполнить операцию и немедленно вернуть результат — используйте
offer() и poll() без таймаута. Если нужно ожидать в течение ограниченного времени, а затем отступить — используйте перегруженные версии с таймаутом и обязательно проверяйте возвращаемое значение: offer возвращает true при успешной вставке, poll возвращает null при отсутствии элемента по истечении таймаута. Всегда обрабатывайте случай null или false, чтобы избежать NullPointerException или бесконечных циклов. В многопоточных приложениях предпочтительнее использовать таймауты, чтобы система могла корректно реагировать на перегрузки и завершать потоки.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class BlockingQueueMethods {
private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
//Опасный вариант: put() блокирует навсегда
public void badPut() throws InterruptedException {
queue.put("item"); // Если очередь полна, поток зависнет навсегда
// Никогда не вернется, если никто не потребит
}
//Правильно: try с таймаутом
public boolean safeOffer(String item) throws InterruptedException {
if (queue.offer(item, 1, TimeUnit.SECONDS)) {
System.out.println("Элемент добавлен");
return true;
} else {
System.out.println("Очередь заполнена, таймаут");
return false;
}
}
//Опасный вариант: poll() без таймаута возвращает null немедленно
public String badPoll() {
return queue.poll(); // null, если очередь пуста — нужно проверять!
}
//Блокирующее извлечение, когда нужно ждать
public String takeItem() throws InterruptedException {
return queue.take(); // ждет, пока появится элемент
}
//Извлечение с таймаутом
public String pollWithTimeout() throws InterruptedException {
String item = queue.poll(500, TimeUnit.MILLISECONDS);
if (item != null) {
System.out.println("Получен: " + item);
} else {
System.out.println("Таймаут, элемент не появился");
}
return item;
}
}
Объяснение:
put() и take() используют внутренние условия (Condition) для блокировки, освобождая монитор и вновь захватывая его после пробуждения. Они не возвращают управление до выполнения операции. offer() и poll() без таймаута проверяют состояние очереди и немедленно возвращают результат. Версии с таймаутом реализованы через циклы с ожиданием, но прерываются по истечении времени. При использовании таймаутов всегда проверяйте возвращаемые значения, чтобы отличить успех от таймаута (для
offer — false, для poll — null). Важно также помнить, что null может быть допустимым значением в некоторых очередях (например, LinkedTransferQueue), но в стандартных реализациях null не разрешен, поэтому null однозначно указывает на таймаут.#Java #советы
👍3
Что выведет код?
#Tasks
import java.util.concurrent.*;
public class Task200826 {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(1);
queue.put(1);
Thread consumer = new Thread(() -> {
try {
Thread.sleep(2000);
queue.take();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
consumer.start();
boolean added = queue.offer(2, 1, TimeUnit.SECONDS);
System.out.println(added);
System.out.println(queue.size());
}
}
#Tasks
👍4
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2
Что такое 🤓
Ответ:
Circuit Breaker (паттерн, реализованный в Resilience4j, Hystrix) — защищает систему от каскадных отказов. Он отслеживает вызовы внешних сервисов.
Если количество неудачных вызовов превышает порог, цепь размыкается (open) — все последующие вызовы немедленно возвращают ошибку (или fallback), не делая запроса. Через некоторое время цепь переходит в полуоткрытое (half-open) состояние — пропускает пробные запросы, и если они успешны, цепь снова замыкается.
Это предотвращает тайм-ауты и перегрузку сбойных сервисов, давая им время восстановиться.
#собеседование
Circuit Breaker и какую роль играет в микросервисах? Ответ:
Если количество неудачных вызовов превышает порог, цепь размыкается (open) — все последующие вызовы немедленно возвращают ошибку (или fallback), не делая запроса. Через некоторое время цепь переходит в полуоткрытое (half-open) состояние — пропускает пробные запросы, и если они успешны, цепь снова замыкается.
Это предотвращает тайм-ауты и перегрузку сбойных сервисов, давая им время восстановиться.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
19. Read Model на событиях: выбор между JOIN, REST, Replica и CQRS
В этом видео я разбираю реальный вызов: бизнес хочет аналитику по жизненному циклу заказа – время создания, оплаты, отправки уведомления. Данные живут в трёх независимых микросервисах (Order, Payment, Notification) у двух из которых свои базы данных.
Как построить аналитику, не нарушая инкапсуляцию и не создавая синхронной связанности?
Я пройду через все популярные альтернативы:
🔹 SQL JOIN между базами – почему это антипаттерн
🔹REST-агрегация – почему не масштабируется
🔹Read Replica – почему не решает проблему агрегации
🔹CDC → ClickHouse – когда это оправдано, а когда избыточно
🔹CQRS + Event‑driven Read Model Projection – наш выбор и его цена
Я не просто показываю «как сделать CQRS», а объясняю процесс принятия решения: оцениваю стоимость, производительность, надёжность, сложность и поддерживаемость.
Что вы узнаете:
🔹Как отличить операционную аналитику от OLAP-хранилища
🔹Почему CQRS – это не «две базы данных», а принцип разделения команд и запросов
🔹Как строить идемпотентные проекции с помощью INSERT ... ON CONFLICT
🔹Как защитить read-модель от старых событий
🔹Как оценивать архитектурные альтернативы по таблице критериев
Исходный код проекта на GitHub наверняка заслуживает Ваших звезд!🙂
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Жду ваших реакций и оценок🙂
В этом видео я разбираю реальный вызов: бизнес хочет аналитику по жизненному циклу заказа – время создания, оплаты, отправки уведомления. Данные живут в трёх независимых микросервисах (Order, Payment, Notification) у двух из которых свои базы данных.
Как построить аналитику, не нарушая инкапсуляцию и не создавая синхронной связанности?
Я пройду через все популярные альтернативы:
🔹 SQL JOIN между базами – почему это антипаттерн
🔹REST-агрегация – почему не масштабируется
🔹Read Replica – почему не решает проблему агрегации
🔹CDC → ClickHouse – когда это оправдано, а когда избыточно
🔹CQRS + Event‑driven Read Model Projection – наш выбор и его цена
Я не просто показываю «как сделать CQRS», а объясняю процесс принятия решения: оцениваю стоимость, производительность, надёжность, сложность и поддерживаемость.
Что вы узнаете:
🔹Как отличить операционную аналитику от OLAP-хранилища
🔹Почему CQRS – это не «две базы данных», а принцип разделения команд и запросов
🔹Как строить идемпотентные проекции с помощью INSERT ... ON CONFLICT
🔹Как защитить read-модель от старых событий
🔹Как оценивать архитектурные альтернативы по таблице критериев
Исходный код проекта на GitHub наверняка заслуживает Ваших звезд!
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
Жду ваших реакций и оценок
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2🤯1
Серге́й Брин (англ. Sergey Brin; род. 21 августа 1973, Москва, СССР) — американский программист и интернет-предприниматель. Вместе с Ларри Пейджем он стал создателем Google и одноимённой крупнейшей в мире поисковой системы. Брин был президентом Alphabet Inc., материнской компании Google, пока не ушёл с этой должности 3 декабря 2019 года. Брин и Пейдж остаются в Alphabet в качестве соучредителей, контролирующих акционеров, членов совета директоров и сотрудников. По данным Форбс 2025 года, Брин занимает 8-е место в списке самых богатых людей в мире ($110B).
Джон Д. Кармак II (англ. John D. Carmack II; род. 21 августа 1970 года, Канзас, США) — американский разработчик компьютерных игр; инженер в областях информатики, аэрокосмической техники и виртуальной реальности; предприниматель, соучредитель и совладелец компаний id Software и Armadillo Aerospace. В 1991 году Кармак стал одним из основателей компании id Software, которая прославилась разработкой основополагающих игр в жанре FPS — Wolfenstein 3D, Doom, Quake, — ведущим программистом которых был Кармак. Его революционные методы программирования и уникальные дизайнерские решения Джона Ромеро способствовали популярности этого жанра в 1990-х годах.
Стивен Макконнелл Кейс (родился 21 августа 1958 года) — со-основатель и CEO AOL; один из драйверов массового выхода пользователей в интернет в 1990-х.
1888 — патент У. С. Бэрроуза на счётную машину. Важная веха в линии, ведущей к офисной механизации и ранним вычислительным устройствам.
1957 — первый успешный пуск МБР Р-7 с Байконура. Полёт на ~6000–6500 км до Камчатки; именно этот носитель стал «прародителем» спутниковых и пилотируемых ракет семейства «Союз». 27 августа ТАСС официально сообщил об успешном испытании.
1965 — старт Gemini 5 (NASA). Первый длительный полёт по программе Gemini (8 суток), ключевая проверка топливных элементов как источника энергии для лунных экспедиций.
1989 — исследовательский зонд «Вояджер-2» делает снимки Тритона, спутника планеты Нептун.
2006 — началась регистрация доменных имён в новом домене общего пользования .mobi, предназначенном для мобильных устройств.
#Biography #Birth_Date #Events #21Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Раздел 12. Работа с файлами, I/O и сетью (NIO.2)
Глава 4. Работа с сетью (Socket, HTTP, HttpClient)
Тема: HttpClient в Java 11+: современный HTTP-клиент
Читаем на devforge.ru - ссылка, тык
#Java #для_новичков #beginner #HttpClient #http
Глава 4. Работа с сетью (Socket, HTTP, HttpClient)
Тема: HttpClient в Java 11+: современный HTTP-клиент
Читаем на devforge.ru - ссылка, тык
#Java #для_новичков #beginner #HttpClient #http
👍1
Что выведет код?
#Tasks
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Task210826 {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.POST(HttpRequest.BodyPublishers.ofString("data"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
63%
200
0%
405
13%
Исключение IllegalArgumentException
25%
Исключение IllegalStateException
👍2
Что такое 🤓
Ответ:
Retry (повтор) — паттерн для повторных попыток выполнения операции в случае временных сбоев (сетевые проблемы, блокировки БД).
В Spring реализован через @Retryable (Spring Retry).
Параметры: maxAttempts, backoff (задержка между попытками, с экспоненциальным увеличением).
Пример: @Retryable (value = SQLException.class, maxAttempts = 3, backoff = @Backoff (delay = 1000)).
Важно: использовать с idempotent операциями (повтор безопасен). Интегрируется с Circuit Breaker (например, Resilience4j).
#собеседование
Retry паттерн и как его реализовать в Spring? Ответ:
В Spring реализован через
Параметры: maxAttempts, backoff (задержка между попытками, с экспоненциальным увеличением).
Пример:
Важно: использовать с idempotent операциями (повтор безопасен). Интегрируется с Circuit Breaker (например, Resilience4j).
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2