Horizontal scaling
By default, Ponder runs the sync engine, indexing engine, and GraphQL HTTP server in the same Node.js process. This works well for small apps, but can lead to performance issues as your app grows.
If the HTTP server experiences high request volume, it contends with the indexing services for CPU and memory resources on the host. This can quickly lead to degraded indexing performance.
To solve this, you can use the ponder serve
command to horizontally scale the HTTP service. ponder serve
is similar to ponder start
, but only runs the HTTP server. It doesn't run the indexing or sync engines.
ponder serve
only works with Postgres. SQLite is not supported.Railway Replicas
Railway makes it easy to horizontally scale ponder serve
instances using their Replicas feature. This feature uses Railway's proxy to distribute incoming requests across multiple instances of your service using a round-robin strategy.
Create a new service for ponder serve
Other than the start command, the ponder serve
service should have the same config as the original ponder start
service. From your project dashboard:
- Click New → GitHub repo and select your Ponder repo from the list.
- Open the Settings tab for the new service and update the Start Command to
ponder serve
. - Open the Variables tab, click on New Variable → Add Reference and select
DATABASE_URL
. Be sure to use the same database as theponder start
service. - [set schema]
- Set a healthcheck path. On the Settings tab, go to Deploy → Healthcheck Path and enter
/health
.
Create replicas
Once the new service is deployed and healthy, go the Settings tab and set the Replicas count to 2 or more.
Direct traffic to ponder serve
Update any clients of this Ponder app to send API requests to the public domain of the new ponder serve
service. If you're using a custom domain, you can simply update that to point to the ponder serve
service.
Remove public domain from the ponder start
service
Now that the replicated ponder serve
service is handling all incoming requests, you can remove the public URL for the original service running ponder serve
.
Other cloud environments
Ponder has not been thoroughly tested on cloud providers other than Railway. However, Ponder apps should work in any environment that supports Node.js and can connect to a Postgres database.