When Not to Reach for One
- Stateless work (routing, transforms, independent fan-out): use a plain function. An actor only adds a routing hop and a serialization point you don’t need.
- A global counter or singleton: one name is one single-threaded instance is one
throughput ceiling. Route everything through
idFromName("global")and you’ve rebuilt the single-lock bottleneck. Shard across many names so load spreads across instances. - Large blobs or bulk scans: the keyspace holds one entity’s working set, not a warehouse. Use object storage or a database.
- Cross-entity transactions or ad-hoc queries: each instance is its own
consistency domain. Within one actor, writes are serialized and
transaction()gives you atomic multi-key updates — but there is no transaction across two actors, and there’s noJOINacross them. If you need a transaction spanning many entities, or to query across them, that’s what a database is for — keep it.
1 / (method wall-time) calls per second — the same ceiling one thread per account
gives you. Sharding by a well-chosen name is how you scale.
Next Steps
- How it works — the execution model and its limits
- Addressing — choosing names that spread load
- Shared actors — one actor, many functions