<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><description>Senior Java Engineer; all my links: https://code-with-kyryl.carrd.co/</description><link>https://bsky.app/profile/code-with-kyryl.bsky.social</link><title>@code-with-kyryl.bsky.social - Kyryl</title><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mrscjitj3w2q</link><pubDate>29 Jul 2026 16:05 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mrscjitj3w2q</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mrnlzcavdc2u</link><pubDate>27 Jul 2026 19:11 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mrnlzcavdc2u</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mrdk6gfwdc2a</link><description>1/ You set Kafka to exactly-once, and a payment still got processed twice.</description><pubDate>23 Jul 2026 19:12 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mrdk6gfwdc2a</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mr3wkrrotc2i</link><description>Your Kafka retention.ms says 1 hour. The data is still on disk 6 hours later. Not a bug. Kafka deletes whole segments, never individual records.</description><pubDate>20 Jul 2026 18:32 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mr3wkrrotc2i</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mqrwnhhdw22h</link><description>Adding one consumer to a Kafka group can freeze every consumer for seconds.&#xA;&#xA;That is eager rebalancing, and it is still the default. Here is what actually happens, and the one config that fixes it.</description><pubDate>16 Jul 2026 19:07 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mqrwnhhdw22h</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mqee5xuadc2s</link><description>CDC turns your database into an event source. And it is the cleanest way to share data without sharing a schema. No dual-write, no &#34;remember to also emit an event&#34; discipline spread across every service.</description><pubDate>11 Jul 2026 09:32 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mqee5xuadc2s</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mq3acdqz2o2n</link><description>The database went down for ten minutes. The restart storm it triggered lasted forty. One `/actuator/health` endpoint wired to both the liveness and readiness probe. That is the whole bug.</description><pubDate>07 Jul 2026 18:29 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mq3acdqz2o2n</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mq342gnbz42x</link><description>CREATE INDEX without CONCURRENTLY locks out writes for the entire build. On a large live table that is not a migration. It is a multi-minute write outage for everything touching it.</description><pubDate>07 Jul 2026 17:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mq342gnbz42x</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpyn7ffldk2t</link><description>A path variable in your metrics tag will quietly bankrupt your Prometheus backend. It passes code review. It compiles. It works, for a while.</description><pubDate>06 Jul 2026 17:42 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpyn7ffldk2t</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpuvok2k762h</link><description>`@Transactional(readOnly = true)` gets slapped on every query method as a habit, treated as a marker for the next reader. It is not decorative. It changes Hibernate&#39;s flush mode.</description><pubDate>05 Jul 2026 06:03 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpuvok2k762h</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mptdmfaw6o2f</link><description>Called my own `@Async` method from inside the same class. No error. No async. Ran inline like a plain method call.</description><pubDate>04 Jul 2026 15:07 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mptdmfaw6o2f</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mptcpreqt52j</link><description>Retry aspect and `@Transactional` aspect on the same method. No `@Order` on either. Spring is free to nest them any way it likes, and it does not ask you first.</description><pubDate>04 Jul 2026 14:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mptcpreqt52j</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpravdittg2e</link><description>Prototype bean field-injected into a singleton. Created once. Spring resolves the constructor arg one time, the singleton holds that instance forever. State leaks between requests until someone finally traces it back.</description><pubDate>03 Jul 2026 19:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpravdittg2e</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpr3w6ssoe2f</link><description>A test with a 30-argument constructor call. Somewhere in there, the one field under test. Good luck spotting it without counting positions.</description><pubDate>03 Jul 2026 17:44 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpr3w6ssoe2f</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mplvsycisl2i</link><description>Good enough integration tests were fine until AI started writing them. The authoring cost is gone, so the bar moves from &#34;good enough&#34; to exact.</description><pubDate>01 Jul 2026 16:11 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mplvsycisl2i</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpjiryrqo52x</link><description>`@Enumerated(ORDINAL)` is the JPA default, and the default silently corrupts data. It stores the enum&#39;s position: 0, 1, 2. Add a constant mid-list later and every old row decodes wrong. No error. No failed query.</description><pubDate>30 Jun 2026 17:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpjiryrqo52x</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpgzww6yk526</link><description>Every team builds the same cost bot. A Lambda on a Cost Explorer cron, a CloudTrail lookup, a Slack ping for whoever tagged the runaway resource. It works. You just maintain every line of it yourself.&#xA;&#xA;AWS just shipped the managed version.</description><pubDate>29 Jun 2026 17:42 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpgzww6yk526</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpgrxdjeyf2k</link><description>Every `POST /search` you have shipped is a safe, idempotent read wearing a write&#39;s costume. You used POST because GET will not carry a body and your filters were too big for the URL.&#xA;&#xA;HTTP finally has the right verb. It is QUERY.</description><pubDate>29 Jun 2026 15:19 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpgrxdjeyf2k</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mpbphcoase2x</link><description>I created three Kafka quizzes and added them to my tech blog, one per level. A straightforward way to test your knowledge and see where the gaps actually are. 👇</description><pubDate>27 Jun 2026 14:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mpbphcoase2x</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mp7inq7kdm2l</link><description>`UserService` + `UserServiceImpl`. One interface, one impl, forever. The reason this pattern exists died around Spring Boot 2.0, and most of us never updated the habit.</description><pubDate>26 Jun 2026 17:44 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mp7inq7kdm2l</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3mp4zdwqioh2f</link><description>Your event fires. Your listener queries the DB for the entity just saved. It finds nothing.&#xA;&#xA;Add a log line — it starts working. Remove it — breaks again.&#xA;&#xA;That&#39;s not a race condition. That&#39;s `@EventListener`.</description><pubDate>25 Jun 2026 18:04 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3mp4zdwqioh2f</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3molg2zoib42q</link><description>MapStruct&#39;s default config quietly ships bugs. Add a field to a DTO, forget to map it, it&#39;s null in prod. The compiler knew and said nothing, because the default reporting policy is WARN. Three things I put on every mapper.</description><pubDate>18 Jun 2026 18:04 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3molg2zoib42q</guid></item><item><link>https://bsky.app/profile/code-with-kyryl.bsky.social/post/3moa3v7e2gf26</link><description>Confluence docs for your service are outdated the moment you push the code. Not a discipline problem. Structural. There&#39;s no mechanism keeping external docs in sync with code.</description><pubDate>14 Jun 2026 06:03 +0000</pubDate><guid isPermaLink="false">at://did:plc:rxtinms6aewicsigmv6nr464/app.bsky.feed.post/3moa3v7e2gf26</guid></item></channel></rss>