Кузница бэкенда
4 subscribers
3 photos
4 links
Разрабатывал проекты электронной коммерции, онлайн-кинотеатр, финтех.
Java/Kotlin/Spring/Kafka/k8s

Делюсь мыслями по профессиональным, интересным мне темам.

https://dev.to/backend_forge
Download Telegram
Channel name was changed to «Backend Forge»
Channel name was changed to «Кузница бэкенда»
Channel photo updated
Эффективное использование mockk

На заре изучения 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!

Обычная вещь вызывать suspend функцию при реализации @KafkaListener, приходилось блокироваться через runBlocking, но не теперь.

С версии spring-kafka v3.2 появилась поддержка асинхронных типов, в том числе и suspend функций.

А вчера вышла версия 3.3.3 с фиксом бага manual ack!
Можете пробовать в своих проектах.
Безболезненный shutdown в k8s 🐗

При разворачивании приложений в 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. Это может выглядеть например так
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) {
}
}


Читайте документацию, спите спокойно 💤