<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Muhammet Şafak — Just Ask — Questions &amp; Answers</title><description>Ask me anything about software architecture, careers, PHP, Go and the craft of building software; I answer here, in the open, for everyone.</description><link>https://www.muhammetsafak.com.tr/</link><language>en-US</language><lastBuildDate>Fri, 04 Sep 2026 00:00:00 GMT</lastBuildDate><managingEditor>info@muhammetsafak.com.tr (Muhammet Şafak)</managingEditor><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/rss.xml" rel="self" type="application/rss+xml"/><item><title>Should I run several dependent operations with errgroup so the first error cancels the rest?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-run-several-dependent-operations-with-errgroup-so-the-first/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-run-several-dependent-operations-with-errgroup-so-the-first/</guid><description>Move to `errgroup.WithContext` with a request-level timeout on top and thread ctx into every HTTP and DB call; an ignored ctx means no cancellation at all.</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-run-several-dependent-operations-with-errgroup-so-the-first.md" rel="alternate" type="text/markdown"/><category>go</category><category>concurrency</category></item><item><title>Should I use chunkById instead of chunk when the same job also updates the rows it iterates?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-chunkbyid-instead-of-chunk-when-the-same-job/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-chunkbyid-instead-of-chunk-when-the-same-job/</guid><description>Use `chunkById()` when there is real per-row work and never touch the cursor column; if you only update a column, switch to one set-based `UPDATE`.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-chunkbyid-instead-of-chunk-when-the-same-job.md" rel="alternate" type="text/markdown"/><category>laravel</category><category>eloquent</category><category>performans</category></item><item><title>How do I cleanly implement &quot;withX&quot; copy methods on readonly value objects?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-cleanly-implement-withx-copy-methods-on-readonly-value/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-cleanly-implement-withx-copy-methods-on-readonly-value/</guid><description>A readonly withX returns a new instance: `new self` with named arguments is portable, and `clone($this, [...])` fits PHP 8.5 when validation is simple.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-cleanly-implement-withx-copy-methods-on-readonly-value.md" rel="alternate" type="text/markdown"/><category>php</category><category>oop</category></item><item><title>How does the nature of the work change on the jump from senior to staff?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-does-the-nature-of-the-work-change-on-the-jump/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-does-the-nature-of-the-work-change-on-the-jump/</guid><description>Take an ownerless org-level problem, lay the solution out in a written tech strategy, and show impact through the teams you accelerate, not your commits.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-does-the-nature-of-the-work-change-on-the-jump.md" rel="alternate" type="text/markdown"/><category>kariyer</category><category>liderlik</category></item><item><title>How should I carry a correlation ID from the HTTP request all the way into queued jobs?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-carry-a-correlation-id-from-the-http-request/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-carry-a-correlation-id-from-the-http-request/</guid><description>Generate the ID as a W3C `traceparent`, carry it in an SQS message attribute rather than the body, and inject it with the OTel propagator on both sides.</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-carry-a-correlation-id-from-the-http-request.md" rel="alternate" type="text/markdown"/><category>observability</category><category>logging</category><category>queue</category></item><item><title>My non-root container can&apos;t write to the mounted storage directory—how do I fix the permissions?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/my-non-root-container-cant-write-to-the-mounted-storage-directory/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/my-non-root-container-cant-write-to-the-mounted-storage-directory/</guid><description>Pin the user with a build-time `ARG UID`, use `COPY --chown`, and for named volumes chown only `storage` and `bootstrap/cache` in the entrypoint.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/my-non-root-container-cant-write-to-the-mounted-storage-directory.md" rel="alternate" type="text/markdown"/><category>docker</category><category>guvenlik</category><category>laravel</category></item><item><title>Should I author the OpenAPI spec first or generate it from my code?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-author-the-openapi-spec-first-or-generate-it-from/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-author-the-openapi-spec-first-or-generate-it-from/</guid><description>Go contract-first with `openapi.yaml` as the single source of truth; what ends drift isn&apos;t the direction you pick but a green contract test running in CI.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-author-the-openapi-spec-first-or-generate-it-from.md" rel="alternate" type="text/markdown"/><category>api</category><category>api-design</category></item><item><title>Should I use a partial index on a queue table where I only ever scan &apos;pending&apos; rows?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-a-partial-index-on-a-queue-table-where/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-a-partial-index-on-a-queue-table-where/</guid><description>Build the partial index on `WHERE status=&apos;pending&apos;`, include the `ORDER BY` column, pair it with `FOR UPDATE SKIP LOCKED`, and pass &apos;pending&apos; literally.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-a-partial-index-on-a-queue-table-where.md" rel="alternate" type="text/markdown"/><category>postgresql</category><category>veritabani</category><category>performans</category></item><item><title>How do I propagate context cancellation correctly through nested service calls?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-propagate-context-cancellation-correctly-through-nested-service-calls/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-propagate-context-cancellation-correctly-through-nested-service-calls/</guid><description>Cancellation propagates only if you pass `r.Context()` into every downstream call, leave no `context.Background()` in the chain, and use `WithoutCancel`.</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-propagate-context-cancellation-correctly-through-nested-service-calls.md" rel="alternate" type="text/markdown"/><category>go</category><category>concurrency</category></item><item><title>Should I bind a Money value object to Eloquent with a custom cast or with accessors/mutators?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-bind-a-money-value-object-to-eloquent-with-a/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-bind-a-money-value-object-to-eloquent-with-a/</guid><description>Integer cents in the DB, an immutable `Money` on the model: put the mapping in one `CastsAttributes` class and keep currency as a second column there.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-bind-a-money-value-object-to-eloquent-with-a.md" rel="alternate" type="text/markdown"/><category>laravel</category><category>eloquent</category><category>php</category></item><item><title>Should I use PHPStan generics for type-safe collections or hand-write a class per type?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-phpstan-generics-for-type-safe-collections-or-hand/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-phpstan-generics-for-type-safe-collections-or-hand/</guid><description>Default to `list&lt;Order&gt;` docblocks with strict PHPStan in CI; add one generic `Collection&lt;T&gt;` for behavior, a concrete class only at a trust boundary.</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-use-phpstan-generics-for-type-safe-collections-or-hand.md" rel="alternate" type="text/markdown"/><category>php</category><category>static-analysis</category></item><item><title>How do I demonstrate the broader impact expected when moving from mid-level to senior?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-demonstrate-the-broader-impact-expected-when-moving-from/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-demonstrate-the-broader-impact-expected-when-moving-from/</guid><description>Turn the promotion into a concrete move: pick one fuzzy problem nobody owns and carry it end to end for a quarter, from its definition to its rollout.</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-demonstrate-the-broader-impact-expected-when-moving-from.md" rel="alternate" type="text/markdown"/><category>kariyer</category></item><item><title>How do I set a clear rule for when to log at WARN versus ERROR?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-set-a-clear-rule-for-when-to-log/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-set-a-clear-rule-for-when-to-log/</guid><description>Log at ERROR when the line would wake someone at 3am and at WARN when it would not, log a failure once at its boundary, and alert on the ERROR rate.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-set-a-clear-rule-for-when-to-log.md" rel="alternate" type="text/markdown"/><category>observability</category><category>logging</category></item><item><title>Should I define the healthcheck in the Dockerfile or leave it to Kubernetes probes?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-define-the-healthcheck-in-the-dockerfile-or-leave-it/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-define-the-healthcheck-in-the-dockerfile-or-leave-it/</guid><description>Define readiness, liveness and startup as Kubernetes probes; keep HEALTHCHECK only if the image also runs under Compose, pointing both at one endpoint.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-define-the-healthcheck-in-the-dockerfile-or-leave-it.md" rel="alternate" type="text/markdown"/><category>docker</category><category>kubernetes</category><category>guvenilirlik</category></item><item><title>How should I run the sunset process when deprecating an endpoint in my public API?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-run-the-sunset-process-when-deprecating-an-endpoint/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-run-the-sunset-process-when-deprecating-an-endpoint/</guid><description>Instrument usage per partner, publish a dated sunset with Sunset and Deprecation headers on every response, run brownouts, and cut when usage nears zero.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-should-i-run-the-sunset-process-when-deprecating-an-endpoint.md" rel="alternate" type="text/markdown"/><category>api</category><category>api-design</category></item><item><title>Why does a query use an Index Scan in staging but a Seq Scan in production, and how do I diagnose it with EXPLAIN?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/why-does-a-query-use-an-index-scan-in-staging-but/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/why-does-a-query-use-an-index-scan-in-staging-but/</guid><description>Run EXPLAIN (ANALYZE, BUFFERS) in production, then ANALYZE the table and check n_dead_tup; tune autovacuum per-table for sessions and add a partial index.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/why-does-a-query-use-an-index-scan-in-staging-but.md" rel="alternate" type="text/markdown"/><category>postgresql</category><category>performans</category></item><item><title>How do I detect and prevent goroutine leaks in a long-running Go service?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-detect-and-prevent-goroutine-leaks-in-a-long/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-detect-and-prevent-goroutine-leaks-in-a-long/</guid><description>Export NumGoroutine() as a metric, take a pprof goroutine dump at peak, make the spawn site behind the parked stacks honor ctx.Done(), then add goleak.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-do-i-detect-and-prevent-goroutine-leaks-in-a-long.md" rel="alternate" type="text/markdown"/><category>go</category><category>concurrency</category></item><item><title>Should I enable Model::preventLazyLoading only locally or in production too?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-enable-model-preventlazyloading-only-locally-or-in-production-too/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-enable-model-preventlazyloading-only-locally-or-in-production-too/</guid><description>Run it fully strict and throwing in local and CI; in production keep it on but wire handleLazyLoadingViolationUsing to log without failing the request.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-enable-model-preventlazyloading-only-locally-or-in-production-too.md" rel="alternate" type="text/markdown"/><category>laravel</category><category>eloquent</category><category>performans</category></item><item><title>What do I gain and lose by moving my status class constants to backed enums?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/what-do-i-gain-and-lose-by-moving-my-status-class/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/what-do-i-gain-and-lose-by-moving-my-status-class/</guid><description>Add a backed enum on the same integer values, use tryFrom() at the boundaries, and keep the old constants as deprecated aliases while you move call sites.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/what-do-i-gain-and-lose-by-moving-my-status-class.md" rel="alternate" type="text/markdown"/><category>php</category><category>refactoring</category></item><item><title>How do I design a self-healing deploy that auto-rolls back when the error rate spikes?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/automated-rollback-on-error-spikes-self-healing-deploys/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/automated-rollback-on-error-spikes-self-healing-deploys/</guid><description>Hold the new version at a canary weight and check 5xx and latency against a threshold; on breach, roll back to the last stable release and alert the team.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/automated-rollback-on-error-spikes-self-healing-deploys.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>dayaniklilik</category><category>observability</category></item><item><title>Should I put my API server behind a Cloudflare Tunnel and close port 443 to the internet?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-my-api-behind-a-cloudflare-tunnel/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-my-api-behind-a-cloudflare-tunnel/</guid><description>The tunnel is sound but makes Cloudflare your only way in; stay on the current Caddy setup, lock the origin to Cloudflare&apos;s IP ranges and add origin pulls.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-my-api-behind-a-cloudflare-tunnel.md" rel="alternate" type="text/markdown"/><category>altyapi</category><category>cloudflare</category><category>laravel</category></item><item><title>Canary or Blue-Green deployment for a fintech API?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/canary-vs-blue-green-deployment-for-a-fintech-api/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/canary-vs-blue-green-deployment-for-a-fintech-api/</guid><description>Make Canary the default for routine releases and save Blue-Green for big cutovers needing an instant flip, since both demand expand/contract migrations.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/canary-vs-blue-green-deployment-for-a-fintech-api.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>dayaniklilik</category></item><item><title>Why is keeping the key in .env risky when encrypting sensitive financial data — what do KMS/Vault give you?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/encrypting-sensitive-financial-data-at-rest-and-key-management/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/encrypting-sensitive-financial-data-at-rest-and-key-management/</guid><description>Take the key out of .env, keep it in KMS or Vault and use envelope encryption; for national IDs and card data, prefer tokenization wherever you can.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/encrypting-sensitive-financial-data-at-rest-and-key-management.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>guvenlik</category><category>altyapi</category></item><item><title>How do I position feature flags when moving from Gitflow to Trunk-Based?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/gitflow-vs-trunk-based-development-and-feature-flags/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/gitflow-vs-trunk-based-development-and-feature-flags/</guid><description>Drop the long-lived branches, merge small changes to main continuously, keep unfinished work behind a flag that&apos;s off in prod, and delete flags once done.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/gitflow-vs-trunk-based-development-and-feature-flags.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>git</category><category>mimari</category></item><item><title>How do I isolate self-hosted CI/CD runners and build an ephemeral, clean-after-each-run environment?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/isolating-and-securing-self-hosted-ci-cd-runners/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/isolating-and-securing-self-hosted-ci-cd-runners/</guid><description>Move the runner to a register-run-once-destroy model and run jobs unprivileged; never hand over the Docker socket, and never run fork PRs on it.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/isolating-and-securing-self-hosted-ci-cd-runners.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>guvenlik</category><category>docker</category></item><item><title>How do I distribute a Go CLI to multiple platforms with GoReleaser and Homebrew?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/multi-platform-go-cli-distribution-with-goreleaser-and-homebrew/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/multi-platform-go-cli-distribution-with-goreleaser-and-homebrew/</guid><description>Let one tag-triggered workflow cross-compile and publish the GitHub Release while the brews: block updates the tap formula; the tap needs its own PAT.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/multi-platform-go-cli-distribution-with-goreleaser-and-homebrew.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>go</category></item><item><title>How do I rewind to seconds before a disaster with WAL archiving and PITR?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/point-in-time-recovery-with-wal-archiving/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/point-in-time-recovery-with-wal-archiving/</guid><description>Take a periodic base backup, archive WAL to S3 continuously, replay to a recovery_target_time seconds before the bad statement, and rehearse the restore.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/point-in-time-recovery-with-wal-archiving.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>postgresql</category><category>dayaniklilik</category></item><item><title>How do I run database migrations safely in CI/CD?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/running-database-migrations-safely-in-ci-cd/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/running-database-migrations-safely-in-ci-cd/</guid><description>Add the column nullable, move the backfill to a separate throttled step, run migrations in their own stage, and drop the old column in a later release.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/running-database-migrations-safely-in-ci-cd.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>veritabani</category><category>laravel</category></item><item><title>How do I set up secretless AWS access in CI/CD with OIDC and IAM roles?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/secretless-ci-cd-with-aws-iam-roles-and-oidc/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/secretless-ci-cd-with-aws-iam-roles-and-oidc/</guid><description>Delete the long-lived AWS keys from GitHub Secrets and assume a repo/branch-scoped IAM role over OIDC; pull non-cloud secrets from a manager at runtime.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/secretless-ci-cd-with-aws-iam-roles-and-oidc.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>guvenlik</category><category>altyapi</category></item><item><title>How do I shrink Docker images with multi-stage builds and distroless?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/shrinking-docker-images-with-multi-stage-builds-and-distroless/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/shrinking-docker-images-with-multi-stage-builds-and-distroless/</guid><description>Leave the build tools in the builder stage: make the final stage distroless/static or scratch for Go and fpm-alpine for PHP, and run as non-root.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/shrinking-docker-images-with-multi-stage-builds-and-distroless.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>docker</category><category>altyapi</category></item><item><title>How do I safely manage Terraform state with S3 + DynamoDB locking?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/terraform-remote-state-and-locking-with-s3-and-dynamodb/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/terraform-remote-state-and-locking-with-s3-and-dynamodb/</guid><description>Move state to a versioned, encrypted S3 backend and add a DynamoDB lock table (deprecated but working), keep state per environment, and apply only from CI.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/terraform-remote-state-and-locking-with-s3-and-dynamodb.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>altyapi</category></item><item><title>How do I stop OPcache from causing 500s during a zero-downtime DeployerPHP deploy?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-deployment-with-deployerphp-and-opcache/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-deployment-with-deployerphp-and-opcache/</guid><description>After flipping the symlink, gracefully reload PHP-FPM rather than restarting it; on Octane, octane:reload is mandatory and opcache_reset is optional.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-deployment-with-deployerphp-and-opcache.md" rel="alternate" type="text/markdown"/><category>ci-cd</category><category>laravel</category></item><item><title>Time-series data: TimescaleDB or InfluxDB?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/time-series-data-timescaledb-vs-naive-solutions/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/time-series-data-timescaledb-vs-naive-solutions/</guid><description>100M rows a day breaks a plain table, so chunk it by time with hypertables, materialize the averages as continuous aggregates, and compress the old chunks.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/time-series-data-timescaledb-vs-naive-solutions.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>postgresql</category><category>olcekleme</category></item><item><title>How do I coordinate a zero-loss schema migration with dual-writing on a live table?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/zero-loss-schema-migration-with-dual-writing-on-a-live-table/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/zero-loss-schema-migration-with-dual-writing-on-a-live-table/</guid><description>Instead of a blocking `ALTER TABLE` on 20M rows run expand/contract: add nullable columns, dual-write, backfill in throttled batches, then drop the old.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/zero-loss-schema-migration-with-dual-writing-on-a-live-table.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>postgresql</category><category>ci-cd</category></item><item><title>Why should I use a Sorted Set for a live leaderboard in Redis?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/redis-data-types-using-sorted-sets-for-a-leaderboard/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/redis-data-types-using-sorted-sets-for-a-leaderboard/</guid><description>Use a Sorted Set instead of plain string keys sorted in the app, since `ZADD` updates in O(log N) and `ZREVRANGE 0 99` returns the top 100 already ordered.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/redis-data-types-using-sorted-sets-for-a-leaderboard.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>redis</category><category>performans</category></item><item><title>When should I apply CQRS, and how do I sync the read and write models?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/when-to-apply-cqrs-and-syncing-read-and-write-models/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/when-to-apply-cqrs-and-syncing-read-and-write-models/</guid><description>Move reporting to a read replica and adopt CQRS only when query shapes outgrow one schema, feeding the read model from outbox events, not dual-writes.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/when-to-apply-cqrs-and-syncing-read-and-write-models.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>mimari</category><category>elasticsearch</category></item><item><title>Should I choose NoSQL or PostgreSQL for flexible product attributes?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/nosql-vs-relational-for-flexible-product-attributes/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/nosql-vs-relational-for-flexible-product-attributes/</guid><description>Keep products, prices and orders in PostgreSQL and put the variable attributes in one GIN-indexed `JSONB` column; reporting alone rules out splitting.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/nosql-vs-relational-for-flexible-product-attributes.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>mimari</category><category>postgresql</category></item><item><title>Race condition on balance updates: Pessimistic Lock or Redlock?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/preventing-race-conditions-on-balance-updates-pessimistic-vs-redlock/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/preventing-race-conditions-on-balance-updates-pessimistic-vs-redlock/</guid><description>Keep the invariant in the DB with an atomic `UPDATE ... WHERE balance &gt;= 40` or a `SELECT ... FOR UPDATE`, and save Redlock for non-DB resources.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/preventing-race-conditions-on-balance-updates-pessimistic-vs-redlock.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>queue</category><category>redis</category></item><item><title>How do I handle poison-pill messages and a Dead Letter Queue in the queue?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/poison-pill-messages-and-dead-letter-queues-in-laravel/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/poison-pill-messages-and-dead-letter-queues-in-laravel/</guid><description>Put `tries` and a `backoff` on the job so it lands in `failed_jobs` at the cap, alert from a `JobFailed` listener and replay it with `queue:retry`.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/poison-pill-messages-and-dead-letter-queues-in-laravel.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>queue</category><category>laravel</category></item><item><title>Health check design: how do I separate Liveness and Readiness?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/health-check-design-liveness-vs-readiness/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/health-check-design-liveness-vs-readiness/</guid><description>Keep liveness dependency-free and check dependencies in readiness with a cached probe, since liveness restarts the pod while readiness only sheds traffic.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/health-check-design-liveness-vs-readiness.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>altyapi</category><category>kubernetes</category></item><item><title>How do I migrate a table to PostgreSQL partitioning with zero downtime?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-migration-to-postgresql-declarative-partitioning/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-migration-to-postgresql-declarative-partitioning/</guid><description>Stand up monthly RANGE declarative partitioning on `created_at`, backfill history in batches while the app writes, then swap names in a single transaction.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/zero-downtime-migration-to-postgresql-declarative-partitioning.md" rel="alternate" type="text/markdown"/><category>veritabani</category><category>postgresql</category><category>olcekleme</category></item><item><title>What rules should I follow to prevent database deadlocks?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/detecting-and-preventing-database-deadlocks/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/detecting-and-preventing-database-deadlocks/</guid><description>Acquire locks in one global order such as ascending PK, keep transactions short, target `FOR UPDATE` at the fewest rows, and retry the rest with backoff.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/detecting-and-preventing-database-deadlocks.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>veritabani</category><category>postgresql</category></item><item><title>How do I handle panics in a Go HTTP server with recovery middleware?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/panic-recovery-middleware-in-go-http-servers/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/panic-recovery-middleware-in-go-http-servers/</guid><description>Wrap requests in a `defer recover()` middleware at the outermost layer, log the stack with the request id, return a generic 500 and emit a metric.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/panic-recovery-middleware-in-go-http-servers.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>go</category></item><item><title>Disaster recovery: how do I design an active-passive scenario around RTO and RPO?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/disaster-recovery-strategy-setting-rto-and-rpo/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/disaster-recovery-strategy-setting-rto-and-rpo/</guid><description>RPO 5min buys continuous cross-region replication and PITR, RTO 30min an IaC-provisioned warm standby behind Route 53 failover, rehearsed on a game-day.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/disaster-recovery-strategy-setting-rto-and-rpo.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>altyapi</category><category>veritabani</category></item><item><title>How do I prevent log storms and disk-full outages?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/preventing-log-storms-and-disk-full-outages/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/preventing-log-storms-and-disk-full-outages/</guid><description>Collapse repeated errors into one counted line, back off retries, cap logrotate by size and count, and give `/var/log` a volume off the root disk.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/preventing-log-storms-and-disk-full-outages.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>observability</category><category>altyapi</category></item><item><title>How do I build smart rate limiting against distributed brute force and DDoS?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/smart-rate-limiting-against-distributed-brute-force-and-ddos/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/smart-rate-limiting-against-distributed-brute-force-and-ddos/</guid><description>Per-IP limits lose to rotating proxies, so key the Redis sliding-window on account + IP + ASN, add account lockout and leave volumetric floods to the edge.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/smart-rate-limiting-against-distributed-brute-force-and-ddos.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>guvenlik</category><category>redis</category></item><item><title>Graceful degradation: how do I isolate non-critical services under load?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/graceful-degradation-isolating-non-critical-services-under-load/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/graceful-degradation-isolating-non-critical-services-under-load/</guid><description>Split the critical path (browse, cart, checkout) from the nice-to-haves, put those behind feature flags with short timeouts, and rehearse the kill-switch.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/graceful-degradation-isolating-non-critical-services-under-load.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>mimari</category><category>olcekleme</category></item><item><title>How do I design eventual consistency with the Saga Pattern in a distributed system?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/orchestrated-saga-for-eventual-consistency-across-services/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/orchestrated-saga-for-eventual-consistency-across-services/</guid><description>Split the transaction into local steps with compensating actions, driven by one orchestrator over a queue, each idempotent and published through an outbox.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/orchestrated-saga-for-eventual-consistency-across-services.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>mikroservis</category><category>queue</category></item><item><title>How do I prevent PostgreSQL split-brain with quorum and consensus?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/avoiding-postgresql-split-brain-with-quorum-and-consensus/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/avoiding-postgresql-split-brain-with-quorum-and-consensus/</guid><description>Don&apos;t hand-roll failover: put promotion behind a Patroni + etcd quorum, and let a primary cut off from the majority demote itself by fencing.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/avoiding-postgresql-split-brain-with-quorum-and-consensus.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>postgresql</category><category>veritabani</category></item><item><title>How do I set up a Circuit Breaker for a flaky third-party API dependency?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/circuit-breaker-for-flaky-third-party-apis/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/circuit-breaker-for-flaky-third-party-apis/</guid><description>A breaker alone won&apos;t hold: pull `connect_timeout` and `timeout` down to 800ms-2s, isolate the dependency behind a bulkhead, and define a cached fallback.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/circuit-breaker-for-flaky-third-party-apis.md" rel="alternate" type="text/markdown"/><category>dayaniklilik</category><category>mimari</category><category>laravel</category></item><item><title>How do I set up CDN asset versioning: hashing and a cache strategy on deploy?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/cdn-asset-versioning-and-cache-strategy-on-deploy/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/cdn-asset-versioning-and-cache-strategy-on-deploy/</guid><description>Drop query-string busting: cache content-hashed filenames as `immutable`, keep the HTML short-lived, and upload the assets before you cut over.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/cdn-asset-versioning-and-cache-strategy-on-deploy.md" rel="alternate" type="text/markdown"/><category>performans</category><category>ci-cd</category><category>altyapi</category></item><item><title>How do I make search-as-you-type fast with edge n-grams in Elasticsearch?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/search-as-you-type-performance-with-edge-ngram-in-elasticsearch/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/search-as-you-type-performance-with-edge-ngram-in-elasticsearch/</guid><description>Drop wildcard for autocomplete; build the prefixes at index time with edge_ngram and keep a standard search analyzer so a keystroke is a plain term lookup.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/search-as-you-type-performance-with-edge-ngram-in-elasticsearch.md" rel="alternate" type="text/markdown"/><category>performans</category><category>elasticsearch</category><category>veritabani</category></item><item><title>How do I stream 2-5 GB file downloads without blowing up PHP&apos;s memory?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/streaming-multi-gigabyte-file-downloads-without-exhausting-php-memory/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/streaming-multi-gigabyte-file-downloads-without-exhausting-php-memory/</guid><description>Serve 2-5 GB files outside PHP via a presigned URL or X-Accel-Redirect; if it must go through PHP, chunk it with readStream and turn off buffering.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/streaming-multi-gigabyte-file-downloads-without-exhausting-php-memory.md" rel="alternate" type="text/markdown"/><category>performans</category><category>laravel</category><category>altyapi</category></item><item><title>How do HTTP/2 and HTTP/3 (QUIC) improve API performance?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/how-http-2-and-http-3-improve-api-performance/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/how-http-2-and-http-3-improve-api-performance/</guid><description>Turn on HTTP/2 today, since multiplexing collapses 4-5 requests per screen onto one connection; add HTTP/3 for a mobile audience and drop domain sharding.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/how-http-2-and-http-3-improve-api-performance.md" rel="alternate" type="text/markdown"/><category>performans</category><category>altyapi</category><category>networking</category></item><item><title>Which PgBouncer pooling mode should I pick — Session, Transaction, or Statement?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/pgbouncer-pooling-modes-and-prepared-statements/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/pgbouncer-pooling-modes-and-prepared-statements/</guid><description>Pick Transaction mode for a web fleet; the price is protocol-level prepared statements, so disable them in the app or turn on PgBouncer 1.21+ support.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/pgbouncer-pooling-modes-and-prepared-statements.md" rel="alternate" type="text/markdown"/><category>performans</category><category>postgresql</category><category>veritabani</category></item><item><title>Should I start a new project with microservices?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-start-a-new-project-with-microservices/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-start-a-new-project-with-microservices/</guid><description>For most greenfield products, start with a modular monolith and enforce boundaries in code, promoting a module to a service only when it must scale alone.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-start-a-new-project-with-microservices.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>mikroservis</category></item><item><title>How do I do graceful shutdown on SIGTERM during autoscaling scale-in?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/graceful-shutdown-on-sigterm-for-autoscaled-apis/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/graceful-shutdown-on-sigterm-for-autoscaled-apis/</guid><description>On SIGTERM drain the load balancer first, finish in-flight work inside the server.Shutdown(ctx) deadline, then align the grace period with that drain.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/graceful-shutdown-on-sigterm-for-autoscaled-apis.md" rel="alternate" type="text/markdown"/><category>performans</category><category>olcekleme</category><category>go</category></item><item><title>How do I choose the right composite index column order in PostgreSQL?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/choosing-the-right-composite-index-order-in-postgresql/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/choosing-the-right-composite-index-order-in-postgresql/</guid><description>Build one (user_id, status, created_at DESC) index with equality columns first and the sort column last, then drop the single-column indexes it now covers.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/choosing-the-right-composite-index-order-in-postgresql.md" rel="alternate" type="text/markdown"/><category>performans</category><category>postgresql</category><category>veritabani</category></item><item><title>How do I prevent a Redis cache stampede (thundering herd) — mutex lock or XFetch?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/preventing-cache-stampede-with-mutex-locks-or-early-expiration/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/preventing-cache-stampede-with-mutex-locks-or-early-expiration/</guid><description>A single-flight lock plus TTL jitter covers most cases; reach for XFetch only when recompute is truly expensive, and add stale-while-revalidate either way.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/preventing-cache-stampede-with-mutex-locks-or-early-expiration.md" rel="alternate" type="text/markdown"/><category>performans</category><category>redis</category><category>caching</category></item><item><title>How do I cut GC pressure in Go with sync.Pool and escape analysis under load?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/go-gc-pressure-sync-pool-and-escape-analysis-under-load/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/go-gc-pressure-sync-pool-and-escape-analysis-under-load/</guid><description>The enemy behind the pauses is allocation rate: kill the top allocator with pprof, pool the hot path with sync.Pool, and tune GOGC last, not first.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/go-gc-pressure-sync-pool-and-escape-analysis-under-load.md" rel="alternate" type="text/markdown"/><category>performans</category><category>go</category></item><item><title>How do I debug memory leaks under Laravel Octane (FrankenPHP)?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/debugging-memory-leaks-under-laravel-octane-frankenphp/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/debugging-memory-leaks-under-laravel-octane-frankenphp/</guid><description>Plot the memory_get_usage curve first, bisect service providers to narrow the culprit, then reset stateful singletons in Octane&apos;s hooks and clear statics.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/debugging-memory-leaks-under-laravel-octane-frankenphp.md" rel="alternate" type="text/markdown"/><category>performans</category><category>laravel</category><category>octane</category></item><item><title>Multi-tenant SaaS database isolation: separate DB, schema, or tenant_id?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/multi-tenant-saas-database-isolation-for-10k-tenants/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/multi-tenant-saas-database-isolation-for-10k-tenants/</guid><description>Database-per-tenant does not scale operationally at 10k; keep tenant_id on every table and bury isolation in Postgres Row-Level Security instead.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/multi-tenant-saas-database-isolation-for-10k-tenants.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>veritabani</category><category>olcekleme</category></item><item><title>The payment webhook keeps re-sending the same notification; how do I set up idempotency?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/webhook-idempotency-and-hmac-for-duplicate-payment-notifications/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/webhook-idempotency-and-hmac-for-duplicate-payment-notifications/</guid><description>Verify the HMAC constant-time over the raw body, return 200 fast and enqueue the work, and let a UNIQUE constraint on event_id enforce once-only.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/webhook-idempotency-and-hmac-for-duplicate-payment-notifications.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>guvenlik</category><category>api</category></item><item><title>How do I peel the payment module off a PHP monolith with Strangler Fig?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/peeling-the-payment-module-off-a-php-monolith-with-strangler-fig/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/peeling-the-payment-module-off-a-php-monolith-with-strangler-fig/</guid><description>Shift payments at the gateway by 5/20/100 and validate in shadow first; the real work is splitting the tables, behind an anti-corruption layer and outbox.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/peeling-the-payment-module-off-a-php-monolith-with-strangler-fig.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>mikroservis</category><category>go</category></item><item><title>If I build edge caching with Cloudflare Workers + KV, how do I do invalidation?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/edge-caching-with-cloudflare-workers-kv-and-invalidation/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/edge-caching-with-cloudflare-workers-kv-and-invalidation/</guid><description>The moment a price changes, write through to KV or purge the key in the same transaction or outbox; a short TTL and versioned keys are only the safety net.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/edge-caching-with-cloudflare-workers-kv-and-invalidation.md" rel="alternate" type="text/markdown"/><category>altyapi</category><category>cloudflare</category><category>caching</category></item><item><title>How do I set up distributed tracing (OpenTelemetry) across microservices?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/distributed-tracing-with-opentelemetry-across-laravel-and-go/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/distributed-tracing-with-opentelemetry-across-laravel-and-go/</guid><description>Standardize on W3C Trace Context, leave propagation to the OTel SDK, and put traceparent in the queue message header, since that is where the chain snaps.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/distributed-tracing-with-opentelemetry-across-laravel-and-go.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>observability</category><category>mikroservis</category></item><item><title>WireGuard collides with Docker networks — how do I stabilize routing?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/wireguard-and-docker-network-ip-conflicts-and-routing/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/wireguard-and-docker-network-ip-conflicts-and-routing/</guid><description>This is an addressing-plan problem, not a routing bug: pin Docker&apos;s pool in daemon.json, cut AllowedIPs down to the DB subnet, make routes persistent.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/wireguard-and-docker-network-ip-conflicts-and-routing.md" rel="alternate" type="text/markdown"/><category>altyapi</category><category>networking</category><category>docker</category></item><item><title>How should I abstract the LLM provider (Ollama → Bedrock/OpenAI)?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/abstracting-the-llm-provider-from-ollama-to-bedrock-or-openai/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/abstracting-the-llm-provider-from-ollama-to-bedrock-or-openai/</guid><description>Build one narrow complete(prompt, opts) interface with three implementations picked by config, and treat context window, latency and cost as config.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/abstracting-the-llm-provider-from-ollama-to-bedrock-or-openai.md" rel="alternate" type="text/markdown"/><category>mimari</category></item><item><title>When moving local files to S3, is EFS a good interim step?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/moving-local-files-to-s3-is-efs-a-good-interim-step/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/moving-local-files-to-s3-is-efs-a-good-interim-step/</guid><description>Don&apos;t make EFS the interim step; switch to a Flysystem s3 disk, route reads and writes via Storage::disk(), and migrate with dual-read for zero downtime.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/moving-local-files-to-s3-is-efs-a-good-interim-step.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>altyapi</category><category>olcekleme</category></item><item><title>For the message schema between Laravel and Go services, Protobuf or JSON Schema?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/message-schema-between-laravel-and-go-protobuf-or-json-schema/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/message-schema-between-laravel-and-go-protobuf-or-json-schema/</guid><description>For heavy Laravel-Go traffic pick Protobuf plus a schema registry, keep JSON Schema for light traffic, and deserialize into a typed DTO at the boundary.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/message-schema-between-laravel-and-go-protobuf-or-json-schema.md" rel="alternate" type="text/markdown"/><category>mimari</category><category>mikroservis</category><category>go</category></item><item><title>Should I put a Kafka/Redis buffer between Fluent Bit and OpenSearch when shipping logs?</title><link>https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-a-kafka-buffer-between-fluent-bit-and-opensearch/</link><guid isPermaLink="true">https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-a-kafka-buffer-between-fluent-bit-and-opensearch/</guid><description>Turn on Fluent Bit&apos;s filesystem buffer first; move to Kafka once 40k/s is permanent, and keep a Redis list only for logs you can afford to lose.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate><atom:link href="https://www.muhammetsafak.com.tr/en/just-ask/should-i-put-a-kafka-buffer-between-fluent-bit-and-opensearch.md" rel="alternate" type="text/markdown"/><category>altyapi</category><category>observability</category><category>kafka</category></item></channel></rss>