Hi, my name’s Aaron Powell and I’m a Cloud Advocate at Microsoft. My area of specialty is front-end web dev and .NET (especially F#), but I enjoy doing silly things with technology.
It's true that Durable Functions, like AWS Step Functions, aren't going to be suitable for every scenario as they do create an explicit relationship between the functions used.
Behind the scenes Durable Functions is using the approach you describe, using messages to do communication between the functions (using a combination of queues and table storage (in v2 the storage model is abstracted so you can swap that out)).
Now, it may seem like we're doing explicit linking of functions in the way they are called:
[<FunctionName("StartWorkflow")>]letstartWorkflow([<HttpTrigger(AuthorizationLevel.Anonymous,"get",Route="start/{input}")>]req:HttpRequest)([<OrchestrationClient>]starter:DurableOrchestrationClient)input(logger:ILogger)=task{logger.LogInformation(sprintf"Starting a new workflow for %s"input)let!_=starter.StartNewAsync(eventName,input)returnOkResult()}
But when we do starter.StartNewAsync(eventName, input) we are essentially dropping a message into a queue to be picked up by whomever is meant to listen to eventName.
This becomes even more powerful when we start looking at Entity Functions and start taking a more Actor-model approach to our architecture.
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
It's true that Durable Functions, like AWS Step Functions, aren't going to be suitable for every scenario as they do create an explicit relationship between the functions used.
Some scenarios that they are valid for are things like sequential processing, waiting for human interaction or monitoring another system.
Behind the scenes Durable Functions is using the approach you describe, using messages to do communication between the functions (using a combination of queues and table storage (in v2 the storage model is abstracted so you can swap that out)).
Now, it may seem like we're doing explicit linking of functions in the way they are called:
(snippet from my sample on GitHub)
But when we do
starter.StartNewAsync(eventName, input)
we are essentially dropping a message into a queue to be picked up by whomever is meant to listen toeventName
.This becomes even more powerful when we start looking at Entity Functions and start taking a more Actor-model approach to our architecture.