We ran into this around team onboarding during a Friday deploy. We did not rewrite the service. We moved one endpoint at a time. Dual writes ran until nightly totals matched for several days. A flag sent a small percentage of reads to the new path. The hard part was matching rounding the old code had hidden. Cutover finished with a small blast radius and an easy rollback.
We extracted one high-churn billing endpoint behind a strangler facade. Dual-writes ran for two weeks while we compared totals nightly. A feature flag controlled read traffic so we could roll back instantly. The hardest part was matching edge-case rounding in legacy invoices. Cutover finished with no customer-facing downtime and a smaller blast radius. We kept the facade until three more endpoints followed the same path.
We needed locks so queue workers did not process the same job twice. Redis SET NX was faster under load and easy to expire automatically. Postgres advisory locks were simpler operationally for our small team. Failover behavior mattered more than raw latency in our case. We chose Postgres first, then moved hot paths to Redis later. Pick the lock store you can operate confidently at 3am.