HTTP vs gRPC

HTTP 409 Conflict vs gRPC 6 ALREADY_EXISTS

HTTP 409 Conflict and gRPC ALREADY_EXISTS both handle resource conflicts, but HTTP 409 is broader. HTTP 409 covers any conflict with the current state of the resource (version mismatch, concurrent edit), while gRPC ALREADY_EXISTS specifically means a create operation failed because the entity already exists.

Description

The request conflicts with the current state of the server. Often due to concurrent modification or business rule violations.

When You See It

When trying to create a resource that already exists, or updating a resource that was modified by another request.

How to Fix

Refresh the resource state, resolve conflicts, and retry. Use ETags for optimistic concurrency.

Description

The entity that a client attempted to create already exists. For example, a file or directory that the RPC was supposed to create already exists.

When You See It

A create operation failed because a resource with the same unique identifier or name already exists in the system.

How to Fix

Use a different identifier, or switch to an upsert/update operation if overwriting is acceptable. Check for existing resources before creating.

Key Differences

1.

HTTP 409 covers all conflicts: version mismatches, concurrent modifications, and duplicate creation.

2.

gRPC ALREADY_EXISTS is narrower — it only means a create operation found a pre-existing entity.

3.

For concurrent modification conflicts in gRPC, use ABORTED (code 10) instead of ALREADY_EXISTS.

4.

HTTP 409 is often used with ETags for optimistic concurrency; gRPC uses version fields in protobuf messages.

5.

gRPC separates concerns: ALREADY_EXISTS for creates, ABORTED for concurrent writes, FAILED_PRECONDITION for state issues.

When to Use Which

Return HTTP 409 when a request conflicts with the current resource state — duplicate creation, version mismatch, or concurrent modification. Return gRPC ALREADY_EXISTS only when a create operation fails due to a pre-existing entity. In gRPC-to-HTTP gateways, map ALREADY_EXISTS to 409, but also map ABORTED to 409 for concurrent modification conflicts.

Learn More