Эффективное использование mockk
На заре изучения kotlin, наткнулся на статью о том как писать юнит тесты с использованием mockk
1.
2. Create mocks only once and reset them in a
3. Initialize the required objects in the constructor (init) or in a field declaration (apply() is helpful). This way, the fields can be immutable (val) and non-nullable.
И я долгое время придерживался этих советов, но однажды решил переписать тест с использованием
и оказалось что это сократило время выполнения теста в среднем на 16% процентов.
Библиотеки развиваются, пересматривайте подходы их использования в своих проектах.
На заре изучения kotlin, наткнулся на статью о том как писать юнит тесты с использованием mockk
1.
@TestInstance(Lifecycle.PER_CLASS)
2. Create mocks only once and reset them in a
@BeforeEach
3. Initialize the required objects in the constructor (init) or in a field declaration (apply() is helpful). This way, the fields can be immutable (val) and non-nullable.
И я долгое время придерживался этих советов, но однажды решил переписать тест с использованием
@ExtendWith(MockKExtension::class)
и оказалось что это сократило время выполнения теста в среднем на 16% процентов.
Библиотеки развиваются, пересматривайте подходы их использования в своих проектах.
Наконец-то поддержка асинхронного KafkaListener!
Обычная вещь вызывать
С версии spring-kafka v3.2 появилась поддержка асинхронных типов, в том числе и
А вчера вышла версия 3.3.3 с фиксом бага manual ack!
Можете пробовать в своих проектах.
Обычная вещь вызывать
suspend
функцию при реализации @KafkaListener
, приходилось блокироваться через runBlocking
, но не теперь.С версии spring-kafka v3.2 появилась поддержка асинхронных типов, в том числе и
suspend
функций. А вчера вышла версия 3.3.3 с фиксом бага manual ack!
Можете пробовать в своих проектах.
GitHub
Release v3.3.3 · spring-projects/spring-kafka
🐞 Bug Fixes
Using ConcurrentMessageListenerContainer section of reference doc is a bit confusing #3759
Metric collection for errors always report the same error "ListenerExecutionFailedExcept...
Using ConcurrentMessageListenerContainer section of reference doc is a bit confusing #3759
Metric collection for errors always report the same error "ListenerExecutionFailedExcept...
Безболезненный shutdown в k8s 🐗
При разворачивании приложений в k8s можно столкнуться с проблемами при удалении pods.
При удалении выполняются два параллельных процесса:
1. Удаление сетевых правил
2. Удаление pod
Можно представить это в виде диаграммы (failed_shutdown)
Это может приводить к двум проблемам:
1. Pod удаляется, не закончив обработку запросов, что приводит к несогласованному состоянию
2. Запросы направляются на уже удаленный pod, в ответ получая ошибки
Чтобы согласовать происходящие процессы необходимо:
1. Сконфигурировать graceful shutdown для контейнера
2. Добавить preStopHook
3. Выставить terminationGracePeriodSeconds
В результате получим последовательное, предсказуемое завершение работы приложения (graceful_shutdown).
оригинал
При разворачивании приложений в k8s можно столкнуться с проблемами при удалении pods.
При удалении выполняются два параллельных процесса:
1. Удаление сетевых правил
2. Удаление pod
Можно представить это в виде диаграммы (failed_shutdown)
Это может приводить к двум проблемам:
1. Pod удаляется, не закончив обработку запросов, что приводит к несогласованному состоянию
2. Запросы направляются на уже удаленный pod, в ответ получая ошибки
Чтобы согласовать происходящие процессы необходимо:
1. Сконфигурировать graceful shutdown для контейнера
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s
2. Добавить preStopHook
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]
3. Выставить terminationGracePeriodSeconds
terminationGracePeriodSeconds: 45
В результате получим последовательное, предсказуемое завершение работы приложения (graceful_shutdown).
оригинал
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Программист спит, а ScheduledExecutorService ⏰ идет..
Когда хочется запустить повторяющуюся задачу, на помощь приходит scheduleWithFixedDelay. Это может выглядеть например так
Проблема заключается в том, что если
Молча, без предупреждения..
Об этом говорит документация метода:
Самым простым решением будет оборачивать код
Читайте документацию, спите спокойно 💤
Когда хочется запустить повторяющуюся задачу, на помощь приходит scheduleWithFixedDelay. Это может выглядеть например так
val scheduler = Executors.newSingleThreadScheduledExecutor()
scheduler.scheduleWithFixedDelay(
{ doSmth() }, 0, 30, TimeUnit.SECONDS
)
Проблема заключается в том, что если
doSmth()
выбросит исключение и оно не будет отловлено, то дальнейшая работа будет остановлена. Молча, без предупреждения..
Об этом говорит документация метода:
If any execution of the task encounters an exception, subsequent executions are suppressed
Самым простым решением будет оборачивать код
try/catch
fun doSmth() {
try {
//business logic
} catch(e: Exception) {
}
}
Читайте документацию, спите спокойно 💤