<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>o612 — notes on distributed systems, Java, Kotlin and other JVM based technologies</title><description>I write about Kafka, Spring Boot, Postgres, and the unglamorous parts of backend engineering where the interesting bugs actually live.</description><link>https://o612.in/</link><item><title>git-pro — an Electron GUI that shares its state with a bash CLI</title><link>https://o612.in/articles/git-pro-electron-gui-git-profiles/</link><guid isPermaLink="true">https://o612.in/articles/git-pro-electron-gui-git-profiles/</guid><description>How git-pro, a small Electron app, manages multiple git identities by sharing one on-disk file format with a bash CLI — no database, no daemon.</description><pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate><category>Electron</category><category>JavaScript</category><category>Git</category></item><item><title>Building a lightweight method tracer with Byte Buddy — from runtime subclassing to a Java agent</title><link>https://o612.in/articles/byte-buddy-method-tracer-java-agent/</link><guid isPermaLink="true">https://o612.in/articles/byte-buddy-method-tracer-java-agent/</guid><description>Trace Java methods without touching their source, using Byte Buddy — runtime subclasses, method delegation, inlined advice, and a premain Java agent, all verified.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>JVM</category></item><item><title>Part 10: Turning the DSL into a maintainable workflow authoring library</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/10-packaging-evolution/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/10-packaging-evolution/</guid><description>Package the pipeline as a library — module boundaries, DSL versioning, extension seams, and the honest list of what was deliberately left out.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 9: Deploying the generated buyer process to Flowable</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/09-flowable-integration/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/09-flowable-integration/</guid><description>Keep the core model engine-neutral — map DSL metadata to flowable:* via a serializer seam, and deploy only the executable buyer pool to Flowable.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 8: Testing BPMN semantics, DI, and visual output</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/08-testing-rendering/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/08-testing-rendering/</guid><description>Assert the real contract — every node shaped, every edge resolved, containment, determinism — then prove bpmn-js renders it without warnings.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 7: Generating BPMN diagrams that actually render</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/07-bpmn-di-layout/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/07-bpmn-di-layout/</guid><description>Build a deterministic layered layout engine — flow-graph columns, lane rows, pinned boundary events, orthogonal routing — and emit BPMN DI XML.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 6: Generating BPMN 2.0 XML safely from the AST</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/06-semantic-xml-generation/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/06-semantic-xml-generation/</guid><description>Serialize the validated AST to BPMN 2.0 XML with StAX — namespaces, event definitions, condition expressions, and the engine-extension seam.</description><pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 5: Validation as a first-class feature</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/05-validation-first-class/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/05-validation-first-class/</guid><description>Build BpmnValidator — structured diagnostics for identifiers, flow semantics, gateways, lanes, collaboration, boundary events, and diagrams.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 4: Modeling the procurement collaboration end to end</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/04-procurement-collaboration/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/04-procurement-collaboration/</guid><description>The full running example — two pools, six lanes, inclusive-gateway conditional approvals, SLA timers, renegotiation, and an exception subprocess.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 3: Designing a type-safe Kotlin DSL for BPMN</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/03-type-safe-dsl-builders/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/03-type-safe-dsl-builders/</guid><description>Turn the AST into a fluent internal DSL — lambdas with receivers, @DslMarker scope control, and builders that compile into immutable definitions.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 2: Modeling BPMN collaborations, pools, lanes, and flow nodes</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/02-modeling-collaborations-pools-lanes/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/02-modeling-collaborations-pools-lanes/</guid><description>Define the immutable BPMN AST — collaborations vs processes, participants vs pools, lanes as references, and a sealed flow-node type hierarchy.</description><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Part 1: Why build a Kotlin DSL for BPMN 2.0?</title><link>https://o612.in/tutorials/kotlin-bpmn-dsl/01-why-a-kotlin-dsl-for-bpmn/</link><guid isPermaLink="true">https://o612.in/tutorials/kotlin-bpmn-dsl/01-why-a-kotlin-dsl-for-bpmn/</guid><description>Why handwritten BPMN XML and visual modelers fall short for generated workflows — and the AST-first architecture this series builds around them.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>BPMN</category></item><item><title>Production hardening and the final exercise: prove it, then ship it</title><link>https://o612.in/tutorials/production-ai-agent-jvm/16-production-hardening-final/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/16-production-hardening-final/</guid><description>The final architecture review, threat-model update, failure drills, secret rotation, upgrade strategy, and the incident scenario that exercises every mechanism at once — v1.0.0.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>AI</category><category>Architecture</category></item><item><title>Containerize and deploy: Compose for real, Kubernetes without lies</title><link>https://o612.in/tutorials/production-ai-agent-jvm/15-compose-kubernetes-deployment/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/15-compose-kubernetes-deployment/</guid><description>Production-shaped container images, the full Compose stack, Kustomize overlays, probes, NetworkPolicies, resource limits, and rollout guidance that matches what we actually built.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><category>Kubernetes</category><category>Spring Boot</category><category>Microservices</category></item><item><title>Test performance and resilience: measuring the framework, not the model</title><link>https://o612.in/tutorials/production-ai-agent-jvm/14-performance-resilience-testing/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/14-performance-resilience-testing/</guid><description>Gatling scenarios against the stub model isolate application overhead; controlled fault modes separate framework latency from downstream sickness; a results template keeps numbers honest.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><category>Performance</category><category>Testing</category><category>Java</category><category>JVM</category></item><item><title>Build the evaluation suite: testing what the model actually does</title><link>https://o612.in/tutorials/production-ai-agent-jvm/13-evaluation-suite/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/13-evaluation-suite/</guid><description>Versioned eval datasets, deterministic graders for citations and tool choice, pinned LLM-as-judge where needed, and a CI gate that separates hard failures from probabilistic drift.</description><pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate><category>Java</category><category>Testing</category><category>AI</category></item><item><title>End-to-end observability: one trace from HTTP to tool call</title><link>https://o612.in/tutorials/production-ai-agent-jvm/12-end-to-end-observability/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/12-end-to-end-observability/</guid><description>OpenTelemetry across agent, MCP server, and simulator; Prometheus metrics with low-cardinality labels; Loki logs; Tempo traces; Grafana dashboards — with redaction built in.</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><category>Observability</category><category>Prometheus</category><category>Spring Boot</category><category>Testing</category></item><item><title>Add guardrails and bounded orchestration: budgets, timeouts, and degraded modes</title><link>https://o612.in/tutorials/production-ai-agent-jvm/11-guardrails-resilience/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/11-guardrails-resilience/</guid><description>Prompt size limits, retry classification, deadline propagation, bulkheads, and graceful degradation — the layer that keeps a sick dependency from becoming an incident.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>AI</category><category>Performance</category></item><item><title>Add write tools and human approval: the gate the model cannot cross</title><link>https://o612.in/tutorials/production-ai-agent-jvm/10-write-tools-human-approval/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/10-write-tools-human-approval/</guid><description>Arm create_incident and append_incident_note behind scope checks, idempotency keys, and a single-use approval token bound to user, tenant, and a hash of the exact arguments.</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Kotlin</category><category>Spring Boot</category><category>AI</category></item><item><title>Secure both boundaries: Keycloak, JWT validation, and tenant authorization</title><link>https://o612.in/tutorials/production-ai-agent-jvm/09-oauth-tenant-authorization/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/09-oauth-tenant-authorization/</guid><description>Replace trusted headers with real OIDC: Keycloak realm import, issuer/audience/scope validation on agent-api and the MCP server, tenant claims, and the negative security matrix.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Testing</category><category>Kubernetes</category></item><item><title>Connect the agent to remote MCP tools: policy registry and bounded loop</title><link>https://o612.in/tutorials/production-ai-agent-jvm/08-mcp-client-bounded-tool-loop/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/08-mcp-client-bounded-tool-loop/</guid><description>Configure the Spring AI MCP client, wrap tool execution in a per-tool policy registry, inject tenant context the model cannot choose, and bound the agent loop.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>AI</category></item><item><title>Build the Kotlin MCP operations server: tools as a secured boundary</title><link>https://o612.in/tutorials/production-ai-agent-jvm/07-kotlin-mcp-server/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/07-kotlin-mcp-server/</guid><description>Implement the mcp-operations-server in Kotlin: Streamable HTTP transport, @McpTool read tools, a typed simulator client, structured errors, and contract tests.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><category>Kotlin</category><category>Spring Boot</category><category>AI</category><category>Microservices</category></item><item><title>Add typed, self-correcting outputs: the IncidentAssessment schema</title><link>https://o612.in/tutorials/production-ai-agent-jvm/06-structured-output/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/06-structured-output/</guid><description>Turn model prose into a validated IncidentAssessment record: JSON schema generation, provider-native output where available, bounded retries, and semantic checks beyond syntax.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>AI</category></item><item><title>Add access-controlled RAG and citations</title><link>https://o612.in/tutorials/production-ai-agent-jvm/05-rag-citations/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/05-rag-citations/</guid><description>Tenant-filtered pgvector retrieval, delimited context construction, deterministic citation mapping, and a real abstention path when the evidence is not there.</description><pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>AI</category><category>Postgres</category></item><item><title>Build the runbook ingestion pipeline: Markdown to pgvector</title><link>https://o612.in/tutorials/production-ai-agent-jvm/04-runbook-ingestion-pipeline/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/04-runbook-ingestion-pipeline/</guid><description>Parse versioned Markdown runbooks into semantic chunks, embed them with Ollama, store them in pgvector with tenant metadata, and re-ingest only what changed.</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Postgres</category><category>AI</category><category>Spring Boot</category></item><item><title>Create the agent API: ChatClient, provider profiles, and a deterministic stub model</title><link>https://o612.in/tutorials/production-ai-agent-jvm/03-basic-agent-api/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/03-basic-agent-api/</guid><description>Stand up agent-api with Spring AI ChatClient, Ollama and hosted-provider profiles, REST and SSE endpoints, and a stub ChatModel that keeps CI fully offline.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>AI</category></item><item><title>Build the deterministic operations simulator</title><link>https://o612.in/tutorials/production-ai-agent-jvm/02-operations-simulator/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/02-operations-simulator/</guid><description>Implement the fictional ops backend: Flyway migrations, JdbcClient persistence, idempotent incident creation, and controllable latency, flaky, malformed, and outage fault modes.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Postgres</category><category>Testing</category></item><item><title>Scaffold the multi-module build: Gradle 9, convention plugins, and architecture tests</title><link>https://o612.in/tutorials/production-ai-agent-jvm/01-multi-module-gradle-scaffold/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/01-multi-module-gradle-scaffold/</guid><description>Build the ops-agent-platform skeleton: Gradle wrapper, version catalog, four convention plugins, Java 25 toolchain, and ArchUnit rules that run from day one.</description><pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>Kotlin</category><category>Testing</category></item><item><title>What we are building: an enterprise operations agent</title><link>https://o612.in/tutorials/production-ai-agent-jvm/00-what-we-are-building/</link><guid isPermaLink="true">https://o612.in/tutorials/production-ai-agent-jvm/00-what-we-are-building/</guid><description>The architecture, scope, and threat model for a JVM AI agent that answers runbook questions, calls secured MCP tools, and never writes without approval.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Java</category><category>AI</category></item><item><title>Processing millions of records in Java: chunking, streams, and memory-efficient pipelines</title><link>https://o612.in/articles/processing-millions-of-records-java-streaming-pipelines/</link><guid isPermaLink="true">https://o612.in/articles/processing-millions-of-records-java-streaming-pipelines/</guid><description>Process huge datasets in Java without OOM — combine keyset-paginated batches or true database streams with Stream pipelines, lambdas, and checkpoints.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>Java</category><category>Spring Boot</category><category>Postgres</category><category>Performance</category></item><item><title>Analyzing Java heap dumps in production — a practical guide to memory leaks and retained objects</title><link>https://o612.in/articles/analyzing-java-heap-dumps-production/</link><guid isPermaLink="true">https://o612.in/articles/analyzing-java-heap-dumps-production/</guid><description>Capture and analyze Java heap dumps from Docker and Kubernetes workloads with a repeatable Eclipse MAT workflow that finds the object retaining the memory.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><category>JVM</category><category>Performance</category><category>Kubernetes</category></item><item><title>The production checklist</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/13-the-production-checklist/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/13-the-production-checklist/</guid><description>The full measurement-to-optimization workflow condensed, the mistakes that invalidate results, and a capstone exercise that walks the whole loop on a bottleneck you induce yourself.</description><pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>Performance tests in CI and Kubernetes</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/12-performance-tests-in-ci-and-kubernetes/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/12-performance-tests-in-ci-and-kubernetes/</guid><description>A GitHub Actions regression job, which tests belong at which pipeline stage, Kubernetes resource settings for honest benchmarks, and why CPU throttling lies about latency.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Kubernetes</category></item><item><title>Stress, spike, and soak testing</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/11-stress-spike-and-soak/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/11-stress-spike-and-soak/</guid><description>Three boundary-finding test profiles — stepped stress, sudden spike, multi-hour soak — plus what healthy overload behavior looks like and how to find the breaking point safely.</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Kubernetes</category></item><item><title>Evidence-based optimizations</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/10-evidence-based-optimizations/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/10-evidence-based-optimizations/</guid><description>Five optimizations done the way they should be done — hypothesis first, one change, measured re-test — covering indexes, N+1, projections, HikariCP sizing, thread pools, and caching.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Postgres</category></item><item><title>Diagnosing common Spring Boot bottlenecks</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/09-diagnosing-spring-boot-bottlenecks/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/09-diagnosing-spring-boot-bottlenecks/</guid><description>The recurring bottleneck shapes — database, application, JVM runtime, infrastructure — each with its metric signature and the cheapest experiment that proves or kills the hypothesis.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Postgres</category></item><item><title>Reading the results</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/08-reading-the-results/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/08-reading-the-results/</guid><description>How to read a Gatling report, the PromQL queries that explain what it shows, and a symptom-to-bottleneck table that turns a latency graph into a hypothesis.</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>Running a load test correctly</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/07-running-load-tests-correctly/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/07-running-load-tests-correctly/</guid><description>Warm-up, steady state, and cool-down; the one-variable-at-a-time experiment loop; coordinated omission; and how to tell client-side latency from server-side latency.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>Gatling simulations</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/06-gatling-simulations/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/06-gatling-simulations/</guid><description>Four complete Gatling simulations — read-heavy, mixed write, paginated search, and a stepped stress test — plus feeders, open vs closed models, and assertions that fail the run.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>Realistic test data</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/05-realistic-test-data/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/05-realistic-test-data/</guid><description>Generate a million orders with a deterministic SQL script, extract feeder files for Gatling, and pick a data-reset strategy that keeps test runs isolated.</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Postgres</category></item><item><title>The Order Management API</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/04-the-order-management-api/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/04-the-order-management-api/</guid><description>Build the baseline Spring Data JPA service — schema, indexes, entities, repository, service, controller — designed to be measured, not to be perfect.</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Postgres</category></item><item><title>Instrument before you measure</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/03-instrument-before-you-measure/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/03-instrument-before-you-measure/</guid><description>Wire Actuator and Micrometer into the order API, expose Prometheus metrics, and learn which metric names answer which diagnosis questions — before the first Gatling run.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>A reproducible test environment</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/02-a-reproducible-test-environment/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/02-a-reproducible-test-environment/</guid><description>Stand up PostgreSQL, Prometheus, and Grafana with Docker Compose, and pin down the variables — CPU, memory, data volume, warm-up — that make two test runs comparable.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>A vocabulary for measuring</title><link>https://o612.in/tutorials/performance-testing-spring-boot-apis/01-a-vocabulary-for-measuring/</link><guid isPermaLink="true">https://o612.in/tutorials/performance-testing-spring-boot-apis/01-a-vocabulary-for-measuring/</guid><description>Seven kinds of performance test, what each one can and cannot tell you, and the SLI/SLO vocabulary that turns &quot;is it fast?&quot; into a question you can answer.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Java</category><category>Performance</category><category>Testing</category></item><item><title>Workflow orchestration with BPMN versus distributed sagas</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/28-workflow-orchestration-bpmn-vs-sagas/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/28-workflow-orchestration-bpmn-vs-sagas/</guid><description>Northwind&apos;s returns-and-refunds process needs a human approval step and a two-week waiting period — deciding whether that still fits the saga orchestrator from Chapter 11, or needs a BPMN engine instead.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Multi-tenancy patterns</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/27-multi-tenancy-patterns/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/27-multi-tenancy-patterns/</guid><description>Northwind Platform&apos;s white-label expansion: what happens to database-per-service, the JWT claims from Chapter 26, and every downstream call once &apos;tenant&apos; becomes a first-class concept.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Security patterns: OAuth2/OIDC, JWT validation, RBAC/ABAC, and token propagation</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/26-security-oauth2-oidc-jwt-rbac-abac/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/26-security-oauth2-oidc-jwt-rbac-abac/</guid><description>Implementing the JWT validation this series deferred since Chapter 4, plus deciding what happens to a customer&apos;s identity as their request crosses order-service, inventory-service, and the legacy ambassador.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Kubernetes-native microservice design</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/25-kubernetes-native-microservice-design/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/25-kubernetes-native-microservice-design/</guid><description>Pulling together every Kubernetes primitive this series has used piecemeal since Chapter 1 into one coherent picture of what makes a service actually Kubernetes-native, not just deployed on it.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kubernetes</category></item><item><title>Blue-green, canary, and feature-flag-based deployment</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/24-blue-green-canary-feature-flags/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/24-blue-green-canary-feature-flags/</guid><description>Rolling out inventory-service&apos;s rewritten reservation algorithm to 5% of flash-sale traffic first, with a fast, one-command rollback if it misbehaves.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kubernetes</category></item><item><title>Contract testing and consumer-driven contracts</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/23-contract-testing-and-consumer-driven-contracts/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/23-contract-testing-and-consumer-driven-contracts/</guid><description>Replacing order-service&apos;s hand-written WireMock stub of inventory-service with a Pact contract that inventory-service&apos;s own CI verifies against its real implementation.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Observability: logs, metrics, traces, and correlation IDs</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/22-observability-logs-metrics-traces/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/22-observability-logs-metrics-traces/</guid><description>Wiring OpenTelemetry through Northwind&apos;s gateway, BFF, and services so a slow checkout can actually be traced to its cause, instead of guessed at from six separate log streams.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Observability</category></item><item><title>Service mesh and zero-trust service communication</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/21-service-mesh-and-zero-trust/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/21-service-mesh-and-zero-trust/</guid><description>When Northwind&apos;s six hand-configured Envoy sidecars from Chapter 15 finally justify replacing manual configuration with a mesh control plane.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kubernetes</category></item><item><title>API composition and aggregator services</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/20-api-composition-and-aggregator-services/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/20-api-composition-and-aggregator-services/</guid><description>Formalizing the fan-out-and-merge technique mobile-bff used back in Chapter 4, with a principled partial-failure policy instead of failing the whole request on one slow dependency.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Dead-letter queues and retry topics</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/19-dead-letter-queues-and-retry-topics/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/19-dead-letter-queues-and-retry-topics/</guid><description>What notification-service should do with a confirmation email that keeps failing to send — without blocking every order behind it or retrying forever.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category></item><item><title>Competing consumers and work queues</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/18-competing-consumers-and-work-queues/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/18-competing-consumers-and-work-queues/</guid><description>Scaling notification-service&apos;s email sending horizontally by having multiple instances compete for work from one Kafka consumer group, instead of each getting its own copy.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category></item><item><title>Cache-aside and distributed caching</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/17-cache-aside-and-distributed-caching/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/17-cache-aside-and-distributed-caching/</guid><description>Caching inventory-service&apos;s hottest stock lookups in Redis without ever serving a customer a phantom sold-out or in-stock result during a flash sale.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Circuit breaker, retry, timeout, fallback, and bulkhead</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/16-circuit-breaker-retry-timeout-bulkhead-rate-limiting/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/16-circuit-breaker-retry-timeout-bulkhead-rate-limiting/</guid><description>Using Resilience4j to stop a slow inventory-service from taking order-service&apos;s whole thread pool down with it, the exact failure this series predicted back in Chapter 7.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Sidecar and ambassador patterns</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/15-sidecar-and-ambassador-patterns/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/15-sidecar-and-ambassador-patterns/</guid><description>Pulling TLS, mTLS, and the legacy-monolith proxy logic out of order-service&apos;s own code and into deployment-level companion containers instead.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kubernetes</category></item><item><title>Anti-corruption layer</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/14-anti-corruption-layer/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/14-anti-corruption-layer/</guid><description>Formalizing the translation boundary between order-service&apos;s clean domain model and the legacy monolith&apos;s tangled customer schema, so the legacy model never leaks in.</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Strangler Fig migration pattern</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/13-strangler-fig-migration-pattern/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/13-strangler-fig-migration-pattern/</guid><description>Using the API gateway from Chapter 4 to incrementally route traffic away from Northwind&apos;s legacy PHP monolith, one capability at a time, without a big-bang cutover.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Transactional outbox and inbox / idempotent consumer</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/12-transactional-outbox-and-idempotent-consumer/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/12-transactional-outbox-and-idempotent-consumer/</guid><description>Closing the gap between committing a local transaction and actually publishing its event, and the consumer-side discipline that makes redelivery safe.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category><category>Postgres</category></item><item><title>Saga: choreography and orchestration</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/11-saga-choreography-and-orchestration/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/11-saga-choreography-and-orchestration/</guid><description>Closing the stock-reservation/payment consistency gap this series has carried since Chapter 7, comparing an event-driven choreographed saga against an explicit orchestrator.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category></item><item><title>CQRS: command query responsibility segregation</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/10-cqrs/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/10-cqrs/</guid><description>Splitting order-service&apos;s write model from its read model so a slow reporting query stops competing with checkout traffic for the same tables.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Event sourcing</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/09-event-sourcing/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/09-event-sourcing/</guid><description>Storing an order&apos;s history as an append-only event log instead of a mutable row, and why Northwind adopts it for one service, not the whole platform.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Publish-subscribe and event notification</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/08-publish-subscribe-and-event-notification/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/08-publish-subscribe-and-event-notification/</guid><description>The difference between a thin event notification and a fat event-carried payload, and how that one design choice determines every consumer&apos;s coupling to the publisher&apos;s schema.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category></item><item><title>Event-driven architecture</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/07-event-driven-architecture/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/07-event-driven-architecture/</guid><description>Replacing Northwind&apos;s synchronous order-placement chain with Kafka events, and why that trades immediate consistency for availability and looser coupling.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category><category>Kafka</category></item><item><title>Synchronous communication: REST and gRPC</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/06-synchronous-communication-rest-and-grpc/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/06-synchronous-communication-rest-and-grpc/</guid><description>When to keep REST for service-to-service calls and when gRPC&apos;s typed contracts and binary framing actually earn their added build-tooling complexity.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Service discovery and centralized configuration</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/05-service-discovery-and-centralized-configuration/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/05-service-discovery-and-centralized-configuration/</guid><description>Why hardcoded service URLs and per-service config files stop working as Northwind scales past a handful of instances, and how discovery and config servers solve it.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>API gateway and backend for frontend</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/04-api-gateway-and-backend-for-frontend/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/04-api-gateway-and-backend-for-frontend/</guid><description>How to stop every client from calling three services directly, using a shared API gateway for cross-cutting concerns and a backend-for-frontend where clients genuinely differ.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Database per service</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/03-database-per-service/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/03-database-per-service/</guid><description>Why splitting deployables without splitting databases only gets you halfway, and how to move from schema-per-service on one Postgres instance to a real database per service.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Microservices decomposition by business capability</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/02-decomposition-by-business-capability/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/02-decomposition-by-business-capability/</guid><description>How to split a modular monolith into real services along business-capability boundaries instead of technical layers, and why bounded contexts beat entity-based splits.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>Modular monolith as a starting architecture</title><link>https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/01-modular-monolith-as-a-starting-architecture/</link><guid isPermaLink="true">https://o612.in/tutorials/microservices-patterns-spring-boot-kotlin/01-modular-monolith-as-a-starting-architecture/</guid><description>Why most teams should start microservices projects as a modular monolith, and how to enforce module boundaries in Kotlin and Gradle so the split later is a refactor, not a rewrite.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>Spring Boot</category><category>Kotlin</category><category>Microservices</category></item><item><title>From lab to production: rollout phases and checklists</title><link>https://o612.in/tutorials/elasticsearch-user-search/18-from-lab-to-production/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/18-from-lab-to-production/</guid><description>A five-phase rollout with exit criteria, a relevance gate with _rank_eval, an automated readiness check, the questions to answer first, and what to build next.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category></item><item><title>Failure modes, and the tests that catch them</title><link>https://o612.in/tutorials/elasticsearch-user-search/17-failure-modes-and-the-tests-that-catch-them/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/17-failure-modes-and-the-tests-that-catch-them/</guid><description>Every failure mode found while building this series, from resurrected profiles to leaking facets, and the unit and Testcontainers tests that catch them.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Testing</category><category>Testcontainers</category><category>Kotlin</category></item><item><title>Operating it safely: monitoring, snapshots, security, and personal data</title><link>https://o612.in/tutorials/elasticsearch-user-search/16-operating-it-safely/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/16-operating-it-safely/</guid><description>Monitoring signals, snapshots with retention, least-privilege API keys, and personal-data controls, including a facet leak that bypassed authorisation.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Performance optimisation, measured</title><link>https://o612.in/tutorials/elasticsearch-user-search/15-performance-optimisation-measured/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/15-performance-optimisation-measured/</guid><description>Refresh, caches, index sorting, the profile API, and the slow log, each measured on the lab, including one standard tip that made indexing slower here.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Performance</category></item><item><title>Backfill, the outbox relay, and zero-downtime reindexing</title><link>https://o612.in/tutorials/elasticsearch-user-search/14-backfill-outbox-relay-and-zero-downtime-reindexing/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/14-backfill-outbox-relay-and-zero-downtime-reindexing/</guid><description>A Kotlin indexer with keyset backfill, BulkIngester backpressure, per-item errors, an outbox relay, and a v1 to v2 reindex ending in an atomic alias swap.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category><category>Postgres</category></item><item><title>Pagination for large result sets</title><link>https://o612.in/tutorials/elasticsearch-user-search/13-pagination-for-large-result-sets/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/13-pagination-for-large-result-sets/</guid><description>Why deep from and size fails, search_after cursors, a point in time for stable pages, where scroll still fits, and an opaque cursor contract for the Search API.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Aggregations and facet counts</title><link>https://o612.in/tutorials/elasticsearch-user-search/12-aggregations-and-facet-counts/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/12-aggregations-and-facet-counts/</guid><description>Terms, cardinality, composite, and date histogram aggregations checked against PostgreSQL, why top-N goes wrong across shards, and disjunctive facets in Kotlin.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Query design for profile search</title><link>https://o612.in/tutorials/elasticsearch-user-search/11-query-design-for-profile-search/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/11-query-design-for-profile-search/</guid><description>Query and filter context, bool clauses, cross_fields and fuzzy name matching, highlighting, and the &quot;active Prashants in Bihar&quot; query in JSON and Kotlin.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Building the Spring Boot search service</title><link>https://o612.in/tutorials/elasticsearch-user-search/10-building-the-spring-boot-search-service/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/10-building-the-spring-boot-search-service/</guid><description>A Kotlin Spring Boot 4 Search API over TLS: index bootstrap from reviewed JSON, request and response DTOs, exact lookups, and clean failure handling.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Choosing an Elasticsearch client for Kotlin and Spring Boot</title><link>https://o612.in/tutorials/elasticsearch-user-search/09-choosing-an-elasticsearch-client/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/09-choosing-an-elasticsearch-client/</guid><description>The Java API Client, its async and low-level variants, and Spring Data Elasticsearch, run from Kotlin, with the JSON-mapper and 10,000-total traps explained.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Spring Boot</category><category>Kotlin</category></item><item><title>Shards, settings, and capacity planning for 300 million profiles</title><link>https://o612.in/tutorials/elasticsearch-user-search/08-shards-settings-and-capacity-planning/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/08-shards-settings-and-capacity-planning/</guid><description>Primaries, replicas, refresh, indexing buffer, and translog explained, then a shard-sizing worksheet built from lab measurements and a Rally track you can run.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Performance</category></item><item><title>Autocomplete, typos, synonyms, and name relevance</title><link>https://o612.in/tutorials/elasticsearch-user-search/07-autocomplete-and-name-relevance/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/07-autocomplete-and-name-relevance/</guid><description>edge_ngram, search_as_you_type, and completion compared on a million names, plus fuzziness, live synonym updates, a request-cache trap, and BM25 via _explain.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category></item><item><title>Mapping and analysis in depth</title><link>https://o612.in/tutorials/elasticsearch-user-search/06-mapping-and-analysis-in-depth/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/06-mapping-and-analysis-in-depth/</guid><description>How text and keyword fields, analysers, filters, and normalisers decide what matches, shown with _analyze, with fielddata and mapping explosion reproduced.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category></item><item><title>Designing the user-profile index</title><link>https://o612.in/tutorials/elasticsearch-user-search/05-designing-the-user-profile-index/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/05-designing-the-user-profile-index/</guid><description>A versioned user-profile index behind read and write aliases, a field capability matrix, the full creation request, and a million profiles loaded and checked.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Postgres</category></item><item><title>Search architecture and keeping Elasticsearch in sync</title><link>https://o612.in/tutorials/elasticsearch-user-search/04-search-architecture-and-synchronisation/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/04-search-architecture-and-synchronisation/</guid><description>Why dual writes to PostgreSQL and Elasticsearch fail, how outbox and CDC compare, and an idempotent sync design with row versions, re-reads, and safe deletes.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Postgres</category><category>Outbox</category></item><item><title>The REST API surface, from documents to the cluster</title><link>https://o612.in/tutorials/elasticsearch-user-search/03-the-rest-api-surface/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/03-the-rest-api-surface/</guid><description>Document, bulk, by-query, task, and inspection APIs in a live lab, with optimistic locking, external versions, and two version traps a sync pipeline must avoid.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category></item><item><title>Elasticsearch for relational developers</title><link>https://o612.in/tutorials/elasticsearch-user-search/02-elasticsearch-for-relational-developers/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/02-elasticsearch-for-relational-developers/</guid><description>Clusters, shards, replicas, segments, refresh, and mappings, each shown in a live lab and compared with PostgreSQL, including where the table analogy breaks.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Postgres</category></item><item><title>The search problem at 300 million profiles</title><link>https://o612.in/tutorials/elasticsearch-user-search/01-the-search-problem-at-300-million-profiles/</link><guid isPermaLink="true">https://o612.in/tutorials/elasticsearch-user-search/01-the-search-problem-at-300-million-profiles/</guid><description>Where PostgreSQL indexes stop fitting flexible user search at 300 million profiles, and where they are still enough, shown with EXPLAIN on a local lab.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><category>Elasticsearch</category><category>Postgres</category><category>Performance</category></item><item><title>JVM internals, performance tuning, and diagnostics in Java 21</title><link>https://o612.in/articles/jvm-internals-performance-tuning-diagnostics-java-21/</link><guid isPermaLink="true">https://o612.in/articles/jvm-internals-performance-tuning-diagnostics-java-21/</guid><description>How the JVM actually runs Java 21 — bytecode, class loading, JIT, GC — plus an evidence-first method for tuning and diagnosing production incidents.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate><category>JVM</category><category>Performance</category></item><item><title>Capstone: an auditable scheme decision pipeline</title><link>https://o612.in/tutorials/functional-programming-java/20-capstone-scheme-decision-pipeline/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/20-capstone-scheme-decision-pipeline/</guid><description>Wire Option, Result, Validated, Reader, State, and IO into one eligibility flow — pure policy core, typed failures, deferred effects, complete audit trail.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Java interoperability — when the JDK is already enough</title><link>https://o612.in/tutorials/functional-programming-java/19-java-interoperability/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/19-java-interoperability/</guid><description>Converters between jfp types and Optional, Stream, and CompletableFuture, plus the honest table of when to reach for the library versus plain Java.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Async boundaries</title><link>https://o612.in/tutorials/functional-programming-java/18-async-boundaries/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/18-async-boundaries/</guid><description>Interop with CompletableFuture and virtual threads instead of building a runtime — independent registry lookups run in parallel, dependent ones stay sequential.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>State: transitions without mutable globals</title><link>https://o612.in/tutorials/functional-programming-java/17-state-explicit-transitions/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/17-state-explicit-transitions/</guid><description>State&lt;S, A&gt; is a function S → (A, S) — a value plus a new state. Model application status transitions as composable steps instead of a mutable workflow field.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Reader: explicit environments</title><link>https://o612.in/tutorials/functional-programming-java/16-reader-explicit-environments/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/16-reader-explicit-environments/</guid><description>A Reader&lt;Environment, T&gt; is a function waiting for its config — it threads policy versions, thresholds, and clocks through computations without globals.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>IO: effects at the boundary</title><link>https://o612.in/tutorials/functional-programming-java/15-io-effects-and-pure-boundaries/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/15-io-effects-and-pure-boundaries/</guid><description>An educational IO&lt;T&gt; that defers side effects until unsafeRun — the policy core stays pure while audit writes and event publication compose as values.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Lazy evaluation and memoization</title><link>https://o612.in/tutorials/functional-programming-java/14-lazy-evaluation-and-memoization/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/14-lazy-evaluation-and-memoization/</guid><description>Wrap expensive evidence lookups in Lazy so they run at most once and only when a rule actually needs them — call-by-need semantics in 30 lines.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Folds, traversals, and sequencing</title><link>https://o612.in/tutorials/functional-programming-java/13-folds-traversals-and-sequencing/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/13-folds-traversals-and-sequencing/</guid><description>foldLeft collapses a collection, traverse turns List&lt;Result&lt;T,E&gt;&gt; into Result&lt;List&lt;T&gt;,E&gt;, and Validated.sequence gathers every document error at once.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Semigroups and monoids</title><link>https://o612.in/tutorials/functional-programming-java/12-semigroups-and-monoids/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/12-semigroups-and-monoids/</guid><description>An associative combine plus an identity element — the two smallest algebra laws — let Validated merge errors and folds combine results without order anxiety.</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Kleisli composition for effectful functions</title><link>https://o612.in/tutorials/functional-programming-java/11-kleisli-composition/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/11-kleisli-composition/</guid><description>Ordinary compose stops working when every step returns Result — Kleisli composition reconnects A→Result&lt;B,E&gt; functions so registry chains stay flat.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>The monad laws, tested</title><link>https://o612.in/tutorials/functional-programming-java/10-monad-laws/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/10-monad-laws/</guid><description>Left identity, right identity, and associativity — the three laws that make flatMap chains safe to refactor, tested for real against Option and Result.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Monads: sequencing dependent steps</title><link>https://o612.in/tutorials/functional-programming-java/09-monads-sequencing-dependent-steps/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/09-monads-sequencing-dependent-steps/</guid><description>flatMap exists because map cannot flatten — when each step returns a context like Result, monadic bind threads the value through and short-circuits on failure.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Applicatives and validation</title><link>https://o612.in/tutorials/functional-programming-java/08-applicatives-and-validation/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/08-applicatives-and-validation/</guid><description>When checks are independent, chain-of-flatMap is wrong — it stops at the first failure. Validated accumulates every error through map2 and a Semigroup.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Functors: mapping inside a context</title><link>https://o612.in/tutorials/functional-programming-java/07-functors-mapping-inside-context/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/07-functors-mapping-inside-context/</guid><description>map is the whole idea of a functor — transform the value without touching the context — and its two laws are what make DTO-to-domain mapping safe to chain.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Result and Either: errors as values</title><link>https://o612.in/tutorials/functional-programming-java/06-result-and-either-errors-as-values/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/06-result-and-either-errors-as-values/</guid><description>Model expected failures — registry timeouts, invalid identities, missing citizens — as Result&lt;T, E&gt; so the error channel is typed, composable, and visible.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Option: absence as data</title><link>https://o612.in/tutorials/functional-programming-java/05-option-absence-as-data/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/05-option-absence-as-data/</guid><description>Build Option as a sealed Some|None type with map, flatMap, and fold — and use it where a missing land record is a valid state, not an error, never a null.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Algebraic data types</title><link>https://o612.in/tutorials/functional-programming-java/04-algebraic-data-types/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/04-algebraic-data-types/</guid><description>Model eligibility outcomes as a sealed sum type — Eligible, Ineligible, ManualReview — and let pattern matching make alternatives explicit at the boundary.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Pure functions and immutable data</title><link>https://o612.in/tutorials/functional-programming-java/03-pure-functions-and-immutable-data/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/03-pure-functions-and-immutable-data/</guid><description>What purity buys — substitution, testability, auditability — and how Java 21 records plus defensive copies give you immutable domain values without ceremony.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Functions and composition</title><link>https://o612.in/tutorials/functional-programming-java/02-functions-and-composition/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/02-functions-and-composition/</guid><description>Give Fn1 its andThen, compose, and identity, then state the two laws — identity and associativity — that let you refactor pipelines without changing behavior.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Why functional programming in Java?</title><link>https://o612.in/tutorials/functional-programming-java/01-why-functional-programming-in-java/</link><guid isPermaLink="true">https://o612.in/tutorials/functional-programming-java/01-why-functional-programming-in-java/</guid><description>Set up the jfp Gradle project and meet the problem this series solves — mutable, exception-driven eligibility code — before writing a single abstraction.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Java</category><category>Functional Programming</category></item><item><title>Hexagonal architecture with Spring Boot and Kotlin — a certificate service built from swappable modules</title><link>https://o612.in/articles/hexagonal-architecture-spring-boot-kotlin/</link><guid isPermaLink="true">https://o612.in/articles/hexagonal-architecture-spring-boot-kotlin/</guid><description>Ports and adapters in Kotlin — a Spring Boot certificate issuance engine where the core is framework-free and every adapter, and every certificate type, is a swappable module.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><category>Architecture</category><category>Spring Boot</category><category>Kotlin</category></item></channel></rss>