Вам нужно спроектировать и реализовать на Java следующую систему:
1. Система подключается к непрерывному потоку событий (
EventStream).2. Каждое событие (
Event) имеет структуру:
class Event {
String entityId;
Instant timestamp;
String eventType;
Map<String, Object> payload;
}
3. В реальном времени нужно собирать и поддерживать текущее состояние каждой сущности (
Entity), применяя полученные события.4. Система должна поддерживать откат состояния:
- Пользователь может запросить состояние любой сущности на любую произвольную временную точку (
Instant timestamp).- После отката система должна продолжать обрабатывать новые события без остановки и потери данных.
- Потокобезопасность обработки событий и запросов на откат.
- Высокая производительность: обработка миллионов событий в минуту.
- Быстрый откат состояния (target: < 100 мс).
- Только стандартные библиотеки Java (
java.util.concurrent, java.time, коллекции и т.д.).- Архитектура должна позволять добавлять новые типы событий без модификации существующего кода.
- Реализация механизма снимков (
snapshot) состояний для оптимизации откатов.- Автоматическое создание snapshot'ов каждые N событий для каждой сущности.
- Поддержка нескольких стратегий отката (например, быстрый откат по ближайшему snapshot + события, или чистая перемотка всех событий).
Архитектура: Четкая декомпозиция слоёв, масштабируемость и возможность расширения системы без существенных изменений базового кода.
Работа с многопоточностью: Гарантия безопасности доступа к общим структурам данных в условиях параллельной обработки событий.
Производительность: Минимизация блокировок, эффективная работа с большими объёмами данных, оптимизация по времени отклика и использованию ресурсов.
Чистота кода: Понятные и логичные интерфейсы, чистая реализация без "грязных хака", хорошая читаемость и поддерживаемость кода.
Способность предвидеть риски: Умение анализировать потенциальные угрозы системе, например, рост очередей при перегрузке событий или замедление обработки данных.
Стратегии оптимизации: Эффективное использование snapshot'ов состояния, продуманная организация хранения и восстановления событий.
Обработка ошибок и отказоустойчивость: Умение проектировать систему так, чтобы она корректно вела себя при сбоях, сетевых ошибках и высоких нагрузках.
- Проблема гонки состояний: если одновременно приходит событие и запрашивается откат — что происходит?
- Рост памяти: если хранить все события, как не "убить" память?
- Перепутанные таймстемпы: что делать, если события приходят с задержкой или не по порядку?
- Обновление типов событий: как легко добавить новый
eventType без переписывания всей логики?- Производительность при откате: как не делать полный перебор событий за годы работы?
- Используйте copy-on-write подход для состояний сущностей.
- Используйте параллельные структуры данных (
ConcurrentHashMap, ConcurrentSkipListMap и т.д.).- Реализуйте инкапсуляцию логики обработки событий через паттерн "Event Handler" или "Command Handler".
- Внедрите отдельный менеджер snapshot'ов и менеджер событий.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍7❤5
🦉 Apache ZooKeeper — координация распределенных систем без лишней сложности
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
🖥 GitHub
✅ Java библиотека #java
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2
Наш чатик с вакансиями и резюме, присоединяйся: https://news.1rj.ru/str/job_java
Telegram
Java Job - Вакансии и резюме
Наш канал по Java @javalib
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
❤5👍3🔥1
—
choco install xpipeили
—
bash <(curl -sL https://github.com/xpipe-io/xpipe/raw/master/get-xpipe.sh) XPipe — open-source инструмент на Java, который позволяет получить доступ ко всей инфраструктуре сервера с локальной машины.
Он работает поверх установленных программ командной строки и не требует настройки на удаленных системах. Так что если вы используете такие инструменты, как ssh, docker, kubectl и т.д. для подключения к серверам, вы можете просто использовать XPipe поверх них.
XPipe полностью интегрируется с текстовыми редакторами, с терминалом, и с разными CLI утилитами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤6🔥4⚡1
— Порождающие паттерны:
— Структурные паттерны:
— Поведенческие паттерны:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤9🔥6
Agrona предоставляет набор структур данных и вспомогательных методов, которые часто требуются при создании высокопроизводительных приложений на Java.
Многие из этих компонентов используются, к примеру, в Aeron для эффективной и надежной передачи IPC-сообщений по протоколу UDP и обеспечивают высокопроизводительную реализацию буферов для поддержки кодека сообщений Simple Binary Encoding.
Например, с помощью Agrona можно переписать код:
List<Integer> numbers = new ArrayList<>();
// fill numbers somehow
Map<Integer, Integer> counters = new HashMap<>();
for (Integer x : numbers) {
counters.compute(x, (k, v) -> v == null ? 1 : v + 1);
}
вот так:
IntArrayList numbers = new IntArrayList();
// fill numbers somehow
Int2IntCounterMap counters = new Int2IntCounterMap(0);
for (int i = 0; i < numbers.size(); i++) {
counters.incrementAndGet(numbers.getInt(i));
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤7👍3🎄1
1691972027119 (1).gif
7.7 MB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤9🔥4
RoaringBitmap — это одна из лучших битовых карт;
используется в Apache Spark, Netflix Atlas, Apache Pinot, Tablesaw и во многих других компаниях.
RoaringBitmap превосходят обычные сжатые битовые карты, такие как WAH, EWAH или Concise. Изображения, сжатые с помощью RoaringBitmap могут быть до сотни раз легче обычных изображений
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3🔥2
⚙️ 7 эффективных стратегий для масштабирования базы данных
🟢 Индексация: Анализируйте запросы вашего приложения и создавайте подходящие индексы для ускорения работы.
🟢 Материализованные представления: Предварительно вычисляйте результаты сложных запросов и сохраняйте их для быстрого доступа.
🟢 Денормализация: Упрощайте сложные соединения для повышения скорости выполнения запросов.
🟢 Вертикальное масштабирование: Увеличивайте ресурсы сервера (процессоры, оперативную память, хранилище) для улучшения производительности.
🟢 Кэширование: Храните часто запрашиваемые данные в быстром хранилище, чтобы снизить нагрузку на базу данных.
🟢 Репликация: Создавайте копии основной базы данных на разных серверах для увеличения объема операций чтения.
🟢 Шардинг: Разделяйте таблицы на более мелкие части и распределяйте их по серверам для улучшения работы с записью и чтением.
💬 Какие еще методы масштабирования используете вы?
✅ Java библиотека #java
💬 Какие еще методы масштабирования используете вы?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥1
Piranha — это инструмент для автоматического рефакторинга кода, связанного с устаревшими флагами.
Входными данными для Piranha являются имя флага и ожидаемое поведение;
также необходимо указать список API, связанных с флагами, в файле свойств.
Piranha будет использовать эти данные для автоматического рефакторинга кода в соответствии с ожидаемым поведением.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥2
Media is too big
VIEW IN TELEGRAM
Выпуск 7. JAR или WAR - вот в чем вопрос.
В этом выпуске мы попробуем разобраться, что в конечном итоге вам надо собрать - JAR или WAR.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3❤2
Отличное понимание ролей API Gateway и Load Balancer является ключевым для проектирования масштабируемых и эффективных архитектур.
— API Gateway: Почтальон цифрового мира 📬
Работает как почтальон, направляя API-запросы к нужному сервису. А также выполняет роль охранника, управляя аутентификацией и авторизацией, переводчика, преобразуя запросы и ответы, и регулировщика движения, контролируя частоту запросов.
— Load Balancer: Регулировщик движения 🚦
Его задача — равномерно распределять трафик между серверами, предотвращая их перегрузку, улучшая надежность и обеспечивая автоматическое переключение в случае сбоя одного из серверов.
Оба компонента необходимы в современных архитектурах, но выполняют разные функции!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍7🔥2
Совет по Spring Boot 🚀
Еесли вы хотите узнать, когда начинается и заканчивается транзакция #JPA, как повторно использовать существующую транзакцию в
✅ Java библиотека #java
Еесли вы хотите узнать, когда начинается и заканчивается транзакция #JPA, как повторно использовать существующую транзакцию в
@Transactional или шаблоне TransactionTemplate, включите логирование DEBUG для `org.springframework.orm.jpa`.Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤3🔥2
Ответ на картинке.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍8🔥3
Media is too big
VIEW IN TELEGRAM
Want to build clean, scalable, and secure REST APIs with Spring Boot? In this video, you'll learn the top 10 best practices every Java developer should follow when building RESTful APIs using Spring Boot. From HTTP status codes to DTOs, pagination, exception handling, and security.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ every-programmer-should-know | Каждый кодер должен знать
Крутая подборка материалов про Computer Science. Неважно, какой ЯП вы используете, вам все равно стоит знать виды алгоритмов, структур данных, архитектуры и другую базу.
📌 Репозиторий проекта
✅ Java библиотека #java
Крутая подборка материалов про Computer Science. Неважно, какой ЯП вы используете, вам все равно стоит знать виды алгоритмов, структур данных, архитектуры и другую базу.
📌 Репозиторий проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤3👍2
Метод putAll()
Метод putAll() принадлежит интерфейсу Map и используется для добавления всех элементов из одной карты (Map) в другую. Этот метод принимает в качестве аргумента другую карту и добавляет все ее записи в вызывающую карту.
Например, если у вас есть две карты, содержащие данные, и вам нужно объединить их для выполнения операций на полном объеме данных, метод putAll() предоставляет простой способ объединения.
✅ Java библиотека #java
Метод putAll() принадлежит интерфейсу Map и используется для добавления всех элементов из одной карты (Map) в другую. Этот метод принимает в качестве аргумента другую карту и добавляет все ее записи в вызывающую карту.
Например, если у вас есть две карты, содержащие данные, и вам нужно объединить их для выполнения операций на полном объеме данных, метод putAll() предоставляет простой способ объединения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2
Библиотека Spring Boot Startup Report генерирует интерактивные отчеты о работе приложений Spring Boot,и помогает понять, что влияет на время загрузки и запуска приложения, что может помочь в оптимизации
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🔥3