We're building a microservice app where clients can create projects. The following diagram shows the technical flow of this process:
My question: what HTTP response should the API gateway return to the client (step 1.)?
My initial idea was to give back a 202, but the problem there is that I don't know the Location
yet (/projects/{id}
), because the id of the project will be created at the Project Management Service.
Considering that the IDs of the newly created project
entity is not known at the request time (i.e. it is generated after the insertion into the database) you indeed cannot generate the url to the project
resource.
Instead, you could assign an ID (i.e. 1234-abcd-5678-efgh
) to the command before sending to the bus and keep track of its execution status on the API gateway itself. Then you can respond to the client with an command execution status endpoint like /commands/1234-abcd-5678-efgh
where it can query by polling.
The alternative would be to use another service that would reserve&deliver unique IDs but you must make a blocking call to it and this hurts scalability. Or you can host this service inside the API gateway itself (onto the same node) to minimize latency. Also, there is a risk of loosing some IDs in case of project creation failures but this can be compensated by releasing those IDs in those situations (thus increasing the architecture complexity).
A third solution could be the use of a project
surogate ID, like a GUID, assigned as a property of the project
, included in the command, having the purpose of an alternate identity that can be used only in the pre-creation phase of the process. Then, the response to the client could be like this: /projects/by-guid/1234-abcd-5678-efgh
and after the project
is created a GET
to this url
would permanently redirect to the final project url.