Microservices | Вопросы с Собеседований
Вопросы и авторские статьи по микросервисам, архитектуре, БД Контент по Kotlin/Java: t.me/KotlinQuestions
Ko'proq ko'rsatish- Kanalning o'sishi
- Post qamrovi
- ER - jalb qilish nisbati
Ma'lumot yuklanmoqda...
Ma'lumot yuklanmoqda...
create table folders
(
id bigserial not null,
parent_id bigint null references folders (id),
data jsonb not null
);
Самый простой подход, при котором храним идентификатор родительской сущности (либо null, если сущность и так корневая).
Плюсы:
- Простота модели
- Простая вставка
- Простой перенос поддерева
Минусы:
- “Дерево” может стать не деревом - МД не запрещает циклические ссылки
- Рекурсивные запросы, чтобы доставать поддерево по id корня
2. id, path + parent_id, parent_path
Помимо id добавляется path - путь по айдишникам до текущей сущности. Это нам позволяет сделать более интересные констрейнты и гарантировать, что мы гарантированно имеем дело с деревом.
create table folders
(
id bigserial not null,
path varchar not null,
parent_id bigint null,
parent_path varchar null,
data jsonb not null
constraint ck__folders__path
check (path = coalesce(parent_path, '/') || id || '/'),
-- нужен для FK
constraint uc__folders__path__id
unique (path, id),
constraint fk__folders__parent_id__parent_path
foreign key (parent_path, parent_id) references folders (path, id)
match full
);
Здесь мы гарантируем, что
1) path корневой папки - это /<id>/
2) path некорневой папки - это <parent_path><id>/
Что позволяет обеспечить отсутствие циклов
Плюсы:
- Гарантия отсутствия циклов
- Простой запрос поддерева - where path like ‘/1/2/3/%’
Минусы:
- Сложность модели
- Более сложная вставка
- Сложный перенос поддерева@Test
fun `test user creation`() {
// given
val userSaver = mock<UserSaver>()
val userService = UserService(userSaver)
// when
userService.createUser("username")
// then
verify(userSaver).save(any<User>())
}
Классическая:
- За редким исключением только внепроцессные зависимости (БД, брокер) заменяются на моки
- Под юнитом может подразумеваться набор классов
- Акцент на проверку результатов вызова методов и состояния
@Test
fun `test user creation`() {
// given
val userService = UserService(UserSaver())
// when
userService.createUser("username")
// then
assertEquals(User(“username”), userService.getUser(“username”))
}
Лондонская школа позволяет разрабатывать в стиле TDD, начиная с высокоуровневых тестов, поскольку нам не требуются реальные зависимости. И проверяют какой-то аспект поведения класса (что был вызов UserSaver::save при вызове UserService::createUser). В классической школе зачастую проверяется корректная работа конкретного сценария (что UserService::createUser корректно сохранил пользователя).
А какую школу используете вы и почему?static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
"postgres:15-alpine"
);
@BeforeAll
static void beforeAll() {
postgres.start();
}
@AfterAll
static void afterAll() {
postgres.stop();
}
На данный момент поддержано более 50 заранее сконфигурированных контейнеров, включая Postgres, Kafka, Elasticsearch, MySQL.
И сама реализация фреймворка существует для .NET, Go, Java, Node.js, также есть кастомные пользовательские реализации для многих других языков.Build invincible apps with Temporal's open-source durable execution platform to guarantee successful execution, even in the presence of failures.
workflow { firstCall() sleep(1 hour) secondCall() sleep(1 hour) thirdCall() }Если мы ее запустим, то нужно, чтобы воркер, который ее будет исполнять, был жив минимум два часа подряд. Если по-середине ожидания что-то пойдет не так, то весь прогресс потеряется. Именно на этом примере можно описать концепцию Durable executions: После того, как мы сделали
firstCall()
, мы не будем ждать, а сделаем следующее:
- Сохраним в состояние задачи, что мы уже сделали firstCall()
- Зашедулим ее на +1 час
Спустя час какой-то другой воркер сможет взять эту задачу и продолжить с прыдыдущего “чекпоинта”. То есть мы сохраняем прогресс по определенным частям задачи, что позволяет переживать отказы воркеров и позволяет исполнять задачу по частям разными воркерами.
И сейчас существует довольно много Workflow engines, которые строятся на этой концепции.A curated list of awesome open source workflow engines - meirwah/awesome-workflow-engines
Разбираем вопросы с собеседований на Java разработчика. Spring, Hibernate Сайт:
https://easyoffer.ru/Реклама:
https://telega.in/c/easy_java_ruПредложения: @easyoffer_ads
[info] [Friday, 20-Jan-23 11:17:55 UTC] The application has started.Будем записывать его в виде структуры определенного формата
{
"timestamp": "Friday, 20-Jan-23 11:17:55 UTC",
"level": "info",
"message": "The application has started."
}
Это позволит складывать логи в какую-нибудь БД, например, Elasticsearch, индексировать и эффективно производить поиск и фильтрацию.Joriy rejangiz faqat 5 ta kanal uchun analitika imkoniyatini beradi. Ko'proq olish uchun, iltimos, boshqa reja tanlang.