{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,3,26]],"date-time":"2026-03-26T06:48:38Z","timestamp":1774507718919,"version":"3.50.1"},"reference-count":39,"publisher":"Association for Computing Machinery (ACM)","issue":"OOPSLA","license":[{"start":{"date-parts":[[2021,10,15]],"date-time":"2021-10-15T00:00:00Z","timestamp":1634256000000},"content-version":"vor","delay-in-days":0,"URL":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/"}],"content-domain":{"domain":["dl.acm.org"],"crossmark-restriction":true},"short-container-title":["Proc. ACM Program. Lang."],"published-print":{"date-parts":[[2021,10,20]]},"abstract":"<jats:p>Serverless, or Functions-as-a-Service (FaaS), is an increasingly popular paradigm for application development, as it provides implicit elastic scaling and load based billing. However, the weak execution guarantees and intrinsic compute-storage separation of FaaS create serious challenges when developing applications that require persistent state, reliable progress, or synchronization. This has motivated a new generation of serverless frameworks that provide stateful abstractions. For instance, Azure's Durable Functions (DF) programming model enhances FaaS with actors, workflows, and critical sections. As a programming model, DF is interesting because it combines task and actor parallelism, which makes it suitable for a wide range of serverless applications. We describe DF both informally, using examples, and formally, using an idealized high-level model based on the untyped lambda calculus. Next, we demystify how the DF runtime can (1) execute in a distributed unreliable serverless environment with compute-storage separation, yet still conform to the fault-free high-level model, and (2) persist execution progress without requiring checkpointing support by the language runtime. To this end we define two progressively more complex execution models, which contain the compute-storage separation and the record-replay, and prove that they are equivalent to the high-level model.<\/jats:p>","DOI":"10.1145\/3485510","type":"journal-article","created":{"date-parts":[[2021,10,15]],"date-time":"2021-10-15T19:18:28Z","timestamp":1634325508000},"page":"1-27","update-policy":"https:\/\/doi.org\/10.1145\/crossmark-policy","source":"Crossref","is-referenced-by-count":49,"title":["Durable functions: semantics for stateful serverless"],"prefix":"10.1145","volume":"5","author":[{"given":"Sebastian","family":"Burckhardt","sequence":"first","affiliation":[{"name":"Microsoft Research, USA"}]},{"given":"Chris","family":"Gillum","sequence":"additional","affiliation":[{"name":"Microsoft Azure, USA"}]},{"given":"David","family":"Justo","sequence":"additional","affiliation":[{"name":"Microsoft Azure, USA"}]},{"given":"Konstantinos","family":"Kallas","sequence":"additional","affiliation":[{"name":"University of Pennsylvania, USA"}]},{"given":"Connor","family":"McMahon","sequence":"additional","affiliation":[{"name":"Microsoft Azure, USA"}]},{"given":"Christopher S.","family":"Meiklejohn","sequence":"additional","affiliation":[{"name":"Carnegie Mellon University, USA"}]}],"member":"320","published-online":{"date-parts":[[2021,10,15]]},"reference":[{"key":"e_1_2_2_1_1","unstructured":"2020. AWS Step Functions. https:\/\/docs.aws.amazon.com\/step-functions\/latest\/dg\/welcome.html  2020. AWS Step Functions. https:\/\/docs.aws.amazon.com\/step-functions\/latest\/dg\/welcome.html"},{"key":"e_1_2_2_2_1","doi-asserted-by":"publisher","DOI":"10.1145\/258949.258967"},{"key":"e_1_2_2_3_1","doi-asserted-by":"publisher","DOI":"10.1145\/3133850.3133855"},{"key":"e_1_2_2_4_1","unstructured":"Jonas Bon\u00e9r. 2020. Towards Stateful Serverless. https:\/\/www.youtube.com\/watch?v=DVTf5WQlgB8  Jonas Bon\u00e9r. 2020. Towards Stateful Serverless. https:\/\/www.youtube.com\/watch?v=DVTf5WQlgB8"},{"key":"e_1_2_2_5_1","volume-title":"Meiklejohn","author":"Burckhardt Sebastian","year":"2021"},{"key":"e_1_2_2_6_1","doi-asserted-by":"publisher","DOI":"10.1145\/2038916.2038932"},{"key":"e_1_2_2_7_1","volume-title":"Apache flink: Stream and batch processing in a single engine. Bulletin of the IEEE Computer Society Technical Committee on Data Engineering, 36, 4","author":"Carbone Paris","year":"2015"},{"key":"e_1_2_2_8_1","unstructured":"2021. Note on usage of yield for async\/await.. https:\/\/twitter.com\/cgillum\/status\/1378128701317992451 Accessed: 2021-04-13  2021. Note on usage of yield for async\/await.. https:\/\/twitter.com\/cgillum\/status\/1378128701317992451 Accessed: 2021-04-13"},{"key":"e_1_2_2_9_1","unstructured":"2020. Using Durable Objects Cloudflare Docs. https:\/\/developers.cloudflare.com\/workers\/learning\/using-durable-objects  2020. Using Durable Objects Cloudflare Docs. https:\/\/developers.cloudflare.com\/workers\/learning\/using-durable-objects"},{"key":"e_1_2_2_10_1","unstructured":"2020. Workers Durable Objects Beta: A New Approach to Stateful Serverless. https:\/\/blog.cloudflare.com\/introducing-workers-durable-objects\/  2020. Workers Durable Objects Beta: A New Approach to Stateful Serverless. https:\/\/blog.cloudflare.com\/introducing-workers-durable-objects\/"},{"key":"e_1_2_2_11_1","doi-asserted-by":"publisher","DOI":"10.1145\/1327452.1327492"},{"key":"e_1_2_2_12_1","doi-asserted-by":"publisher","DOI":"10.1145\/199448.199484"},{"key":"e_1_2_2_13_1","doi-asserted-by":"publisher","DOI":"10.5555\/3358807.3358848"},{"key":"e_1_2_2_14_1","doi-asserted-by":"publisher","DOI":"10.5555\/3154630.3154660"},{"key":"e_1_2_2_15_1","doi-asserted-by":"publisher","DOI":"10.1109\/ucc-companion.2018.00049"},{"key":"e_1_2_2_16_1","unstructured":"github. [n. d.]. Durable Task Framework. https:\/\/github.com\/Azure\/durabletask  github. [n. d.]. Durable Task Framework. https:\/\/github.com\/Azure\/durabletask"},{"key":"e_1_2_2_17_1","unstructured":"github. 2021. DurableTask.MSSQL Backend. https:\/\/github.com\/microsoft\/durabletask-mssql  github. 2021. DurableTask.MSSQL Backend. https:\/\/github.com\/microsoft\/durabletask-mssql"},{"key":"e_1_2_2_18_1","unstructured":"github. 2021. DurableTask.Netherite Backend. https:\/\/github.com\/microsoft\/durabletask-netherite  github. 2021. DurableTask.Netherite Backend. https:\/\/github.com\/microsoft\/durabletask-netherite"},{"key":"e_1_2_2_19_1","doi-asserted-by":"publisher","DOI":"10.14778\/3377369.3377370"},{"key":"e_1_2_2_20_1","doi-asserted-by":"publisher","DOI":"10.1145\/2414639.2414641"},{"key":"e_1_2_2_21_1","doi-asserted-by":"publisher","DOI":"10.14778\/3476249.3476273"},{"key":"e_1_2_2_22_1","doi-asserted-by":"publisher","DOI":"10.1145\/3360575"},{"key":"e_1_2_2_23_1","doi-asserted-by":"publisher","DOI":"10.1145\/3127479.3128601"},{"key":"e_1_2_2_24_1","doi-asserted-by":"publisher","DOI":"10.1145\/3401025.3401731"},{"key":"e_1_2_2_25_1","unstructured":"2020. What are Durable Functions? - Microsoft Azure. https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/durable\/durable-functions-overview  2020. What are Durable Functions? - Microsoft Azure. https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/durable\/durable-functions-overview"},{"key":"e_1_2_2_26_1","unstructured":"2020. Azure Logic Apps Service. https:\/\/azure.microsoft.com\/en-us\/services\/logic-apps\/  2020. Azure Logic Apps Service. https:\/\/azure.microsoft.com\/en-us\/services\/logic-apps\/"},{"key":"e_1_2_2_27_1","unstructured":"2021. Azure SQL. https:\/\/azure.microsoft.com\/en-us\/services\/azure-sql\/ Accessed: 2021-04-13  2021. Azure SQL. https:\/\/azure.microsoft.com\/en-us\/services\/azure-sql\/ Accessed: 2021-04-13"},{"key":"e_1_2_2_28_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-662-44202-9_13"},{"key":"e_1_2_2_29_1","doi-asserted-by":"publisher","DOI":"10.1145\/232629.232644"},{"key":"e_1_2_2_30_1","doi-asserted-by":"publisher","DOI":"10.1145\/3318464.3389758"},{"key":"e_1_2_2_31_1","doi-asserted-by":"publisher","DOI":"10.1145\/3318464.3380609"},{"key":"e_1_2_2_32_1","doi-asserted-by":"publisher","DOI":"10.5555\/509043"},{"key":"e_1_2_2_33_1","doi-asserted-by":"publisher","DOI":"10.1145\/2480359.2429100"},{"key":"e_1_2_2_34_1","doi-asserted-by":"publisher","DOI":"10.5555\/767132.767139"},{"key":"e_1_2_2_35_1","doi-asserted-by":"publisher","DOI":"10.1145\/3342195.3387535"},{"key":"e_1_2_2_36_1","doi-asserted-by":"publisher","DOI":"10.14778\/3407790.3407836"},{"key":"e_1_2_2_37_1","doi-asserted-by":"publisher","DOI":"10.5555\/2228298.2228301"},{"key":"e_1_2_2_38_1","doi-asserted-by":"publisher","DOI":"10.5555\/3488766.3488833"},{"key":"e_1_2_2_39_1","doi-asserted-by":"publisher","DOI":"10.1145\/3419111.3421277"}],"container-title":["Proceedings of the ACM on Programming Languages"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3485510","content-type":"unspecified","content-version":"vor","intended-application":"text-mining"},{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3485510","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2025,6,17]],"date-time":"2025-06-17T20:18:40Z","timestamp":1750191520000},"score":1,"resource":{"primary":{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3485510"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2021,10,15]]},"references-count":39,"journal-issue":{"issue":"OOPSLA","published-print":{"date-parts":[[2021,10,20]]}},"alternative-id":["10.1145\/3485510"],"URL":"https:\/\/doi.org\/10.1145\/3485510","relation":{},"ISSN":["2475-1421"],"issn-type":[{"value":"2475-1421","type":"electronic"}],"subject":[],"published":{"date-parts":[[2021,10,15]]},"assertion":[{"value":"2021-10-15","order":2,"name":"published","label":"Published","group":{"name":"publication_history","label":"Publication History"}}]}}