> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blnkfinance.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Handling Hot Balances

> Strategies for managing high-traffic balances and preventing lock contention in Blnk.

export const CtaCallout = props => {
  const {title, buttonLabel, href, trackingEvent, buttonTarget, rel = "noopener noreferrer", children} = props;
  const handleCtaClick = () => {
    if (typeof window === "undefined" || !trackingEvent) {
      return;
    }
    try {
      window.dispatchEvent(new CustomEvent("blnk:docs-cta", {
        detail: {
          name: trackingEvent,
          href
        }
      }));
    } catch {}
    try {
      window.posthog?.capture?.(trackingEvent, {
        href
      });
    } catch {}
    const gaPayload = {
      cta_href: href
    };
    try {
      window.gtag?.("event", trackingEvent, gaPayload);
    } catch {}
    try {
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: trackingEvent,
        ...gaPayload
      });
    } catch {}
  };
  const isExternal = typeof href === "string" && (/^https?:\/\//i).test(href);
  const target = buttonTarget ?? (isExternal ? "_blank" : undefined);
  const linkRel = isExternal ? rel : undefined;
  return <section className="cta-callout not-prose relative my-8 w-full min-w-0 overflow-hidden rounded-xl border border-zinc-200 p-5 dark:border-white/10">
      <div className="cta-callout-noise" aria-hidden="true" />
      <div className="cta-callout-layout">
        {title ? <div className="cta-callout-title-row">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" width="14" height="14" className="cta-callout-icon shrink-0 text-zinc-800 dark:text-zinc-200" aria-hidden="true">
              <g fill="none" fillRule="nonzero">
                <path d="M28 0v28H0V0h28ZM14.691833333333335 27.134333333333334l-0.012833333333333334 0.0023333333333333335 -0.08283333333333333 0.04083333333333334 -0.023333333333333334 0.004666666666666667 -0.016333333333333335 -0.004666666666666667 -0.08283333333333333 -0.04083333333333334c-0.011666666666666667 -0.004666666666666667 -0.022166666666666668 -0.0011666666666666668 -0.028000000000000004 0.005833333333333334l-0.004666666666666667 0.011666666666666667 -0.019833333333333335 0.49933333333333335 0.005833333333333334 0.023333333333333334 0.011666666666666667 0.015166666666666667 0.12133333333333333 0.08633333333333333 0.0175 0.004666666666666667 0.014000000000000002 -0.004666666666666667 0.12133333333333333 -0.08633333333333333 0.014000000000000002 -0.018666666666666668 0.004666666666666667 -0.019833333333333335 -0.019833333333333335 -0.4981666666666667c-0.0023333333333333335 -0.011666666666666667 -0.0105 -0.019833333333333335 -0.019833333333333335 -0.021Zm0.3091666666666667 -0.13183333333333336 -0.015166666666666667 0.0023333333333333335 -0.21583333333333335 0.1085 -0.011666666666666667 0.011666666666666667 -0.0035000000000000005 0.012833333333333334 0.021 0.5016666666666667 0.005833333333333334 0.014000000000000002 0.009333333333333334 0.008166666666666668 0.23450000000000004 0.1085c0.014000000000000002 0.004666666666666667 0.026833333333333334 0 0.03383333333333334 -0.009333333333333334l0.004666666666666667 -0.016333333333333335 -0.03966666666666667 -0.7163333333333334c-0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.023333333333333334 -0.023333333333333334 -0.025666666666666667Zm-0.8341666666666667 0.0023333333333333335a0.026833333333333334 0.026833333333334334 0 0 0 -0.0315 0.007000000000000001l-0.007000000000000001 0.016333333333333335 -0.03966666666666667 0.7163333333333334c0 0.014000000000000002 0.008166666666666668 0.023333333333333334 0.019833333333333335 0.028000000000000004l0.0175 -0.0023333333333333335 0.23450000000000004 -0.1085 0.011666666666666667 -0.009333333333333334 0.004666666666666667 -0.012833333333333334 0.019833333333333335 -0.5016666666666667 -0.0035000000000000005 -0.014000000000000002 -0.011666666666666667 -0.011666666666666667 -0.21466666666666667 -0.10733333333333334Z" strokeWidth="1.1667" />
                <path fill="currentColor" d="M14 2.916666666666667A1.75 1.75 0 0 1 15.750000000000002 4.666666666666667v6.302333333333334L21.207666666666668 7.816666666666667a1.75 1.75 0 0 1 1.75 3.031L17.5 14l5.457666666666667 3.151166666666667a1.75 1.75 0 0 1 -1.75 3.031l-5.457666666666667 -3.1500000000000004V23.333333333333336a1.75 1.75 0 0 1 -3.5 0v-6.302333333333334L6.792333333333334 20.183333333333337a1.75 1.75 0 1 1 -1.75 -3.031L10.5 14 5.042333333333334 10.848833333333333a1.75 1.75 0 0 1 1.75 -3.031l5.457666666666667 3.1500000000000004V4.666666666666667A1.75 1.75 0 0 1 14 2.916666666666667Z" strokeWidth="1.1667" />
              </g>
            </svg>
            <p className="cta-callout-title min-w-0 font-semibold text-zinc-800 dark:text-zinc-200">
              {title}
            </p>
          </div> : null}
        <div className={`cta-callout-body text-sm leading-normal text-zinc-800 dark:text-zinc-200${title ? " cta-callout-body--indented" : ""}`}>
          {children}
        </div>
        <a href={href} target={target} rel={linkRel} onClick={handleCtaClick} data-docs-cta={trackingEvent || undefined} className="cta-callout-button inline-flex items-center justify-center gap-1 rounded-full bg-white px-3 py-1.5 text-sm font-semibold transition hover:bg-zinc-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 dark:bg-white dark:hover:bg-zinc-200">
          {buttonLabel}
          <span className="cta-callout-button-arrow" aria-hidden="true">
            →
          </span>
        </a>
      </div>
    </section>;
};

**Hot balances** refer to balances that perform large volumes of concurrent transactions. If not handled correctly, this can lead to lock contention errors, transaction failures and a poor user experience.

Most hot balance scenarios fall into one of the following patterns:

1. **A → N:** one source balance funds many destination balances concurrently.
2. **N → A:** many source balances fund one destination balance concurrently.
3. **A → B and B → A:** the same two balances exchange funds concurrently.

This guide explains the different strategies Blnk natively supports to handle these patterns safely. We'll cover:

1. Using the queue
2. Coalescing
3. Lock wait timeout
4. Hot-lane routing

***

## Using the queue

For high traffic or overlapping balances, we recommend using the default queue-based flow (`skip_queue: false`).

The queue helps Blnk handle contention more effectively and reduces the chance of lock errors by allowing retries, hot-lane routing, and coalescing. Learn more: [How Queueing Works](/guides/concurrency#queueing-transactions).

<Note>
  **Note:** Lock contention can still happen in queued processing. Workers also [acquire distributed balance locks](/guides/concurrency#distributed-redis-balance-locks) when applying transactions.

  The difference is that the queue gives Blnk more ways to manage that contention and lower the likelihood of lock-related failures.
</Note>

***

## Coalescing

<Info>Available in version 0.14 and later.</Info>

Consider a deposit workflow involving one internal source balance concurrently funding 1000+ destination balances, or vice versa, e.g. `A → N` or `N → A`.

**With Coalescing**, Blnk identifies the queued transactions based on if they share the same `source`, `destination`, and `currency`, batches them in-memory, and applies them in a single commit.

This reduces the number of balance lookups and commits required, improving throughput and performance overall.

<Check> **Please note:** Coalescing only works when `skip_queue=false`. It doesn't apply when you skip the queue.</Check>

### How to use

To enable Coalescing, update your Blnk configuration file to include the following settings:

```bash .env theme={"system"}
BLNK_TRANSACTION_ENABLE_COALESCING=true
BLNK_TRANSACTION_BATCH_SIZE=1000
```

| Settings                             | Description                                                            |
| :----------------------------------- | :--------------------------------------------------------------------- |
| `BLNK_TRANSACTION_ENABLE_COALESCING` | Turns queued coalescing on or off.                                     |
| `BLNK_TRANSACTION_BATCH_SIZE`        | Controls how many transactions Blnk will try to coalesce in one batch. |

For the full Coalescing settings, see [transaction configuration](/advanced/configuration/transactions#coalescing-settings).

### When to use

As a rule of thumb, choose Coalescing when you have traffic bursts with repeated balance overlap and want the queue to drain more efficiently.

It is a good fit when:

* It takes too long for your queue to finish processing the transactions.
* You see repeated contention on the same balance pair, source, or destination.
* Your system experiences frequent bursts, with many similar transactions happening concurrently.
* You want to reduce repeated lock contention errors in the queue and improve throughput.

Coalescing is less useful when:

* Traffic is low-volume and spread across many balances.
* You use `skip_queue: true` to process transactions immediately.

***

## Lock wait timeout

<Info>Available in version 0.14 and later.</Info>

**Lock wait timeout** lets you set how long Blnk should wait to [acquiring distributed balance locks](/guides/concurrency#distributed-redis-balance-locks) before returning a lock error.

This applies to both queued and immediate processing. In queued processing, it affects how long a worker waits before that attempt fails. In immediate processing (`skip_queue: true`), it affects how long the request waits in the request path before failing.

This is especially important for immediate processing. If no timeout is set, a lock conflict can fail the request immediately. Setting a timeout gives the lock time to clear, which can reduce lock errors, but it also means the caller may wait longer for a response.

<Note>
  **Note:** A **shorter timeout** keeps requests more responsive, but makes lock errors more likely during contention, while **a longer timeout** gives contention more time to clear, but increases request latency and how long the caller may remain blocked.
</Note>

### How to use

To configure lock wait timeout, update your Blnk configuration with:

```bash .env theme={"system"}
BLNK_TRANSACTION_LOCK_WAIT_TIMEOUT=3
```

| Settings                             | Description                                                                                                      |
| :----------------------------------- | :--------------------------------------------------------------------------------------------------------------- |
| `BLNK_TRANSACTION_LOCK_WAIT_TIMEOUT` | Controls how long Blnk will wait for locks before failing the transaction with a lock error, in integer seconds. |

For more lock tuning options, see [transaction configuration](/advanced/configuration/transactions#blnk_transaction_lock_wait_timeout). For queue and retry settings, see [queue configuration](/advanced/configuration/queue).

### When to use

This setting matters most when you want to control how long Blnk waits to acquire a lock before failing. Use it when you need to tune lock wait behavior across your deployment, especially if you expect occasional contention.

It is a good fit when:

* you use `skip_queue: true` and want a bounded wait time before returning a lock error
* you want requests to survive short contention spikes
* lock waits are usually brief and predictable
* slightly higher latency is acceptable in exchange for fewer lock errors

***

## Hot-lane routing

<Info>Available in version 0.14 and later.</Info>

Consider a workflow where a small number of balance pairs keep receiving heavy concurrent traffic, while the rest of the queue is relatively normal, i.e. `A → B and B → A`.

With **hot-lane routing**, Blnk identifies queued transactions for a specific source, destination, and currency pair that is showing repeated lock contention, and routes new traffic for that exact pair into a dedicated hot queue.

This helps isolate the hottest balance pairs from the rest of your queued traffic, so they stop disturbing normal queue processing.

<Check> **Please note:** Hot-lane routing only works when `skip_queue=false`. It doesn't apply when you skip the queue.</Check>

### How to use

To enable hot-lane routing, update your Blnk configuration file to include the following settings:

```bash .env theme={"system"}
BLNK_QUEUE_ENABLE_HOT_LANE=true
```

| Settings                     | Description                       |
| :--------------------------- | :-------------------------------- |
| `BLNK_QUEUE_ENABLE_HOT_LANE` | Turns hot-lane routing on or off. |

For the full Hot-lane routing settings, see [queue configuration](/advanced/configuration/queue#hot-lane-routing-settings).

### When to use

Choose hot-lane routing when contention is concentrated around a small number of balance pairs and you want to isolate that traffic from the rest of the queue.

It is a good fit when:

* A few specific balance pairs repeatedly cause lock contention.
* A small number of hot pairs are slowing down otherwise healthy queue traffic.
* You want to isolate the worst offenders without changing correctness behavior.
* Your normal queue works well overall, but certain balance pairs keep colliding.

It is less useful when:

* Traffic is broadly distributed with no clear hot pairs.
* Your main issue is overall worker throughput rather than localized contention. Use [Coalescing](#coalescing) instead.
* Most of your traffic is synchronous and bypasses the queue. Consider [Lock wait timeout](#lock-wait-timeout) instead.

***

## Need help?

We are very happy to help you make the most of Blnk, regardless of whether it is your first time or you are switching from another tool.

To ask questions or discuss issues, please [contact us](mailto:support@blnkfinance.com) or [join our Discord community](https://discord.gg/7WNv94zPpx).

<CtaCallout title="Connect your ledger to Blnk Cloud" href="https://cloud.blnkfinance.com/auth/sign-up?utm_source=blnk_docs&utm_medium=documentation&utm_campaign=need-help" buttonLabel="Open Blnk Cloud" trackingEvent="clicked_cloud_signup">
  Sign up and manage your ledger with our back-office dashboard. You can invite teammates to collaborate and manage your ledger operations directly from the dashboard.
</CtaCallout>
