Skip to content

Add configurable debounce/delay for tile data fetching to prevent rate limiting on zoom/pan #1154

Description

@vineetver

Problem

When rapidly zooming or panning a Gosling.js visualization, each view change immediately fires off tile/track fetches. In cloud-backed storage (e.g. AWS S3, GCS or Harvard Dataverse) this can easily exceed rate limits and trigger 403/429 errors.

With a single track this may be tolerable. However, our use case involves hundreds of tracks and hundreds of concurrent users, so unthrottled fetch bursts simply won’t scale.


Current Behavior

// In our client component:
const goslingSpec = useMemo<GoslingSpec>(() => ({
  views: [
    {
      xDomain: { chromosome: chr, interval: [start, end] },
      layout: "linear",
      tracks: atacTrack
    }
  ]
}), [chromosome, start, end]);

<GoslingComponent ref={goslingRef} spec={goslingSpec} reactive={true} />
Example Track Definition
const ATACURL =
  "https://dataverse.harvard.edu/api/access/datafile/11102908";

export const atacTrack = {
  alignment: "overlay",
  title: "Aggregated ATAC-seq signal, all biosamples",
  data: {
    url: ATACURL,
    type: "bigwig",
    column: "position",
    value: "value",
    aggregation: "sum",
    binSize: 1
  },
  tracks: [
    {
      mark: "bar",
      x: { field: "start", type: "genomic", linkingId: "link1" },
      xe: { field: "end", type: "genomic" },
      y: {
        field: "value",
        type: "quantitative",
        axis: "right",
      },
      color: { value: "blue" },
      stroke: { value: "blue" },
      strokeWidth: { value: 0.8 },
      opacity: { value: 0.7 },
      tooltip: [
        { field: "value", type: "quantitative", alt: "ATAC-seq signal" },
      ],
    },
  ],
  width: 800,
  height: 100,
}

Every Zoom or Pan immediately triggers one or more HTTP requests for each track. Rapid pan/zoom generates dozens of concurrent fetches.

Steps to Reproduce

Configure a view with a bigWig (cloud-hosted) track.

Render in browser, then repeatedly zoom in/out or pan back/forth.

Observe hundreds of simultaneous fetch() or XHR calls and occasional 403/429s.

Proposed Enhancement

Expose a global or per‐view debounce/delay parameter (e.g. viewFetchDebounceMs)

Default to a small delay (e.g. 100 ms) so brief drags/zooms don’t fire fetches

Allow overriding per‐view or track if truly real-time behavior is needed

<GoslingComponent
  spec={spec}
  reactive={true}
  fetchDebounceMs={100} // NEW prop to debounce spec changes
/>

Thank you for considering this feature. It would make Gosling far more robust for large-scale deployments. @sehilyi

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions