<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on Escalopa</title><link>https://escalopa.com/en/tags/performance/</link><description>Recent content in Performance on Escalopa</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>ahmed.helaly.dev@google.com (Ahmed Helaly)</managingEditor><webMaster>ahmed.helaly.dev@google.com (Ahmed Helaly)</webMaster><copyright>© 2026 Ahmed Helaly</copyright><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://escalopa.com/en/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>Designing Bounded Worker Pools in Go</title><link>https://escalopa.com/en/posts/designing-bounded-worker-pools-in-go/</link><pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/designing-bounded-worker-pools-in-go/</guid><description>Bound concurrency at the admission point so overload becomes visible and controllable.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/designing-bounded-worker-pools-in-go/featured.svg"/></item><item><title>Cancellation That Actually Propagates in Go</title><link>https://escalopa.com/en/posts/cancellation-that-actually-propagates-in-go/</link><pubDate>Wed, 10 Sep 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/cancellation-that-actually-propagates-in-go/</guid><description>A context is useful only when every blocking boundary observes it and cleanup has a clear owner.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/cancellation-that-actually-propagates-in-go/featured.svg"/></item><item><title>Error Chains You Can Operate in Go</title><link>https://escalopa.com/en/posts/error-chains-you-can-operate-in-go/</link><pubDate>Sun, 14 Jul 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/error-chains-you-can-operate-in-go/</guid><description>Wrap errors for diagnosis, classify them for policy, and never make callers parse prose.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/error-chains-you-can-operate-in-go/featured.svg"/></item><item><title>Graceful Shutdown Without Dropping Requests</title><link>https://escalopa.com/en/posts/graceful-shutdown-without-dropping-requests/</link><pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/graceful-shutdown-without-dropping-requests/</guid><description>Shutdown is a protocol: stop admission, drain in-flight work, flush state, then release dependencies.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/graceful-shutdown-without-dropping-requests/featured.svg"/></item><item><title>Choosing Pointers and Values in Go APIs</title><link>https://escalopa.com/en/posts/choosing-pointers-and-values-in-go-apis/</link><pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/choosing-pointers-and-values-in-go-apis/</guid><description>Choose receiver and parameter semantics from ownership, mutability, and copy cost rather than habit.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/choosing-pointers-and-values-in-go-apis/featured.svg"/></item><item><title>Making Go HTTP Clients Production Ready</title><link>https://escalopa.com/en/posts/making-go-http-clients-production-ready/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/making-go-http-clients-production-ready/</guid><description>Timeouts, connection reuse, response draining, and retry policy belong in the client design.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/making-go-http-clients-production-ready/featured.svg"/></item><item><title>Table-Driven Tests That Stay Readable</title><link>https://escalopa.com/en/posts/table-driven-tests-that-stay-readable/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/table-driven-tests-that-stay-readable/</guid><description>A good table captures behavior dimensions without hiding the arrange-act-assert story.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/table-driven-tests-that-stay-readable/featured.svg"/></item><item><title>Race-Free In-Memory Caches in Go</title><link>https://escalopa.com/en/posts/race-free-in-memory-caches-in-go/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/race-free-in-memory-caches-in-go/</guid><description>Correct cache synchronization must cover compound operations, expiry, and loader duplication.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/race-free-in-memory-caches-in-go/featured.svg"/></item><item><title>When Channels Are the Wrong Abstraction</title><link>https://escalopa.com/en/posts/when-channels-are-the-wrong-abstraction/</link><pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/when-channels-are-the-wrong-abstraction/</guid><description>Use channels for ownership transfer and coordination, not as a universal replacement for locks.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/when-channels-are-the-wrong-abstraction/featured.svg"/></item><item><title>Building Backpressure Into Go Pipelines</title><link>https://escalopa.com/en/posts/building-backpressure-into-go-pipelines/</link><pubDate>Sat, 05 Oct 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/building-backpressure-into-go-pipelines/</guid><description>A pipeline without bounded queues and cancellation is an outage amplifier.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/building-backpressure-into-go-pipelines/featured.svg"/></item><item><title>Profiling Go Services With pprof</title><link>https://escalopa.com/en/posts/profiling-go-services-with-pprof/</link><pubDate>Tue, 12 Aug 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/profiling-go-services-with-pprof/</guid><description>Profile the constrained resource under representative load before changing code.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/profiling-go-services-with-pprof/featured.svg"/></item><item><title>Reducing Allocations in Hot Go Paths</title><link>https://escalopa.com/en/posts/reducing-allocations-in-hot-go-paths/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/reducing-allocations-in-hot-go-paths/</guid><description>Allocation work starts with profiles and escape analysis, then targets lifetime and representation.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/reducing-allocations-in-hot-go-paths/featured.svg"/></item><item><title>Safe Configuration Loading in Go</title><link>https://escalopa.com/en/posts/safe-configuration-loading-in-go/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/safe-configuration-loading-in-go/</guid><description>Parse once, validate completely, expose immutable typed configuration, and fail before serving traffic.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/safe-configuration-loading-in-go/featured.svg"/></item><item><title>Functional Options Without API Confusion</title><link>https://escalopa.com/en/posts/functional-options-without-api-confusion/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/functional-options-without-api-confusion/</guid><description>Options help optional construction only when defaults, validation, and option interaction remain obvious.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/functional-options-without-api-confusion/featured.svg"/></item><item><title>Interfaces at the Point of Use</title><link>https://escalopa.com/en/posts/interfaces-at-the-point-of-use/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/interfaces-at-the-point-of-use/</guid><description>Small consumer-owned interfaces reduce coupling and make tests describe real dependencies.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/interfaces-at-the-point-of-use/featured.svg"/></item><item><title>Structured Concurrency Patterns in Go</title><link>https://escalopa.com/en/posts/structured-concurrency-patterns-in-go/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/structured-concurrency-patterns-in-go/</guid><description>Child goroutines should share cancellation, error propagation, and a bounded lifetime with their parent.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/structured-concurrency-patterns-in-go/featured.svg"/></item><item><title>Avoiding Goroutine Leaks</title><link>https://escalopa.com/en/posts/avoiding-goroutine-leaks/</link><pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/avoiding-goroutine-leaks/</guid><description>Every goroutine needs an exit condition that remains reachable when downstream work stops.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/avoiding-goroutine-leaks/featured.svg"/></item><item><title>Benchmarking Go Code Without Lying to Yourself</title><link>https://escalopa.com/en/posts/benchmarking-go-code-without-lying-to-yourself/</link><pubDate>Fri, 16 Aug 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/benchmarking-go-code-without-lying-to-yourself/</guid><description>Benchmarks need stable inputs, allocation reporting, multiple runs, and a comparison tied to user impact.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/benchmarking-go-code-without-lying-to-yourself/featured.svg"/></item><item><title>Designing Stable Go Packages</title><link>https://escalopa.com/en/posts/designing-stable-go-packages/</link><pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/designing-stable-go-packages/</guid><description>A package is stable when its responsibilities, exported surface, and dependency direction are narrow.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/designing-stable-go-packages/featured.svg"/></item><item><title>Building a Generic TTL Cache in Go</title><link>https://escalopa.com/en/posts/building-a-generic-ttl-cache-in-go/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/building-a-generic-ttl-cache-in-go/</guid><description>Generics can remove unsafe casts while explicit synchronization and expiry semantics preserve correctness.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/building-a-generic-ttl-cache-in-go/featured.svg"/></item><item><title>PostgreSQL Indexes From Query Shape</title><link>https://escalopa.com/en/posts/postgresql-indexes-from-query-shape/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/postgresql-indexes-from-query-shape/</guid><description>Design indexes from predicates, join keys, ordering, selectivity, and write cost together.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/postgresql-indexes-from-query-shape/featured.svg"/></item><item><title>Reading EXPLAIN ANALYZE Without Guessing</title><link>https://escalopa.com/en/posts/reading-explain-analyze-without-guessing/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/reading-explain-analyze-without-guessing/</guid><description>Compare estimated and actual rows first, then find where time, loops, or memory multiply.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/reading-explain-analyze-without-guessing/featured.svg"/></item><item><title>Transaction Isolation Through Anomalies</title><link>https://escalopa.com/en/posts/transaction-isolation-through-anomalies/</link><pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/transaction-isolation-through-anomalies/</guid><description>Choose isolation by naming the anomaly that would violate a business invariant.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/transaction-isolation-through-anomalies/featured.svg"/></item><item><title>The Lost Update and How to Prevent It</title><link>https://escalopa.com/en/posts/the-lost-update-and-how-to-prevent-it/</link><pubDate>Sat, 12 Apr 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/the-lost-update-and-how-to-prevent-it/</guid><description>Atomic updates, locks, or optimistic versions must protect read-modify-write as one decision.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/the-lost-update-and-how-to-prevent-it/featured.svg"/></item><item><title>Keyset Pagination in PostgreSQL</title><link>https://escalopa.com/en/posts/keyset-pagination-in-postgresql/</link><pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/keyset-pagination-in-postgresql/</guid><description>Seek from the last ordered key to keep page cost stable and results coherent.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/keyset-pagination-in-postgresql/featured.svg"/></item><item><title>Zero-Downtime Schema Migrations</title><link>https://escalopa.com/en/posts/zero-downtime-schema-migrations/</link><pubDate>Fri, 09 May 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/zero-downtime-schema-migrations/</guid><description>Expand, migrate, verify, switch, and contract across independently deployed application versions.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/zero-downtime-schema-migrations/featured.svg"/></item><item><title>Redis Caching Without Stale Data Surprises</title><link>https://escalopa.com/en/posts/redis-caching-without-stale-data-surprises/</link><pubDate>Wed, 16 Oct 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/redis-caching-without-stale-data-surprises/</guid><description>Define ownership, expiry, invalidation, stampede control, and degraded behavior before adding cache code.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/redis-caching-without-stale-data-surprises/featured.svg"/></item><item><title>Cache Stampede Protection</title><link>https://escalopa.com/en/posts/cache-stampede-protection/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/cache-stampede-protection/</guid><description>Request coalescing, early refresh, and jitter keep one expiry from becoming a dependency spike.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/cache-stampede-protection/featured.svg"/></item><item><title>Kafka Partitioning and Consumer Parallelism</title><link>https://escalopa.com/en/posts/kafka-partitioning-and-consumer-parallelism/</link><pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/kafka-partitioning-and-consumer-parallelism/</guid><description>The key determines ordering and skew; partition count sets the ceiling for group parallelism.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/kafka-partitioning-and-consumer-parallelism/featured.svg"/></item><item><title>Kafka Delivery Semantics in Practice</title><link>https://escalopa.com/en/posts/kafka-delivery-semantics-in-practice/</link><pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/kafka-delivery-semantics-in-practice/</guid><description>Offsets and side effects must share a recoverable protocol to survive crashes between them.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/kafka-delivery-semantics-in-practice/featured.svg"/></item><item><title>ClickHouse Table Design for Event Analytics</title><link>https://escalopa.com/en/posts/clickhouse-table-design-for-event-analytics/</link><pubDate>Sat, 03 Aug 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/clickhouse-table-design-for-event-analytics/</guid><description>Partition for lifecycle, order for filtering locality, and measure cardinality before choosing codecs.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/clickhouse-table-design-for-event-analytics/featured.svg"/></item><item><title>ETCD Transactions for Coordination</title><link>https://escalopa.com/en/posts/etcd-transactions-for-coordination/</link><pubDate>Tue, 04 Mar 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/etcd-transactions-for-coordination/</guid><description>Compare-and-swap plus leases can encode ownership, but clients must handle revision and expiry races.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/etcd-transactions-for-coordination/featured.svg"/></item><item><title>PostGIS Nearest-Neighbor Queries</title><link>https://escalopa.com/en/posts/postgis-nearest-neighbor-queries/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/postgis-nearest-neighbor-queries/</guid><description>Use spatial indexes and distance operators that preserve indexability before calculating exact distance.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/postgis-nearest-neighbor-queries/featured.svg"/></item><item><title>Connection Pools Are Capacity Limits</title><link>https://escalopa.com/en/posts/connection-pools-are-capacity-limits/</link><pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/connection-pools-are-capacity-limits/</guid><description>Pool size must reflect database concurrency, transaction duration, and queueing—not application goroutine count.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/connection-pools-are-capacity-limits/featured.svg"/></item><item><title>Choosing Between Redis and Memcached</title><link>https://escalopa.com/en/posts/choosing-between-redis-and-memcached/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><author>ahmed.helaly.dev@google.com (Ahmed Helaly)</author><guid>https://escalopa.com/en/posts/choosing-between-redis-and-memcached/</guid><description>Choose from data model, persistence, operations, clustering, and failure behavior rather than benchmark headlines.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://escalopa.com/en/posts/choosing-between-redis-and-memcached/featured.svg"/></item></channel></rss>