workflow state recovery는 event sourcing으로 이용됨으로 몇 가지 코드를 작성하는데 제한이있습니다. 주요제한은 workflow code가 derterministic 해야 된다는 것이고 이것은 여러번의 실행에서도 같은 결과를 생성해야합니다.
workflow의 외부 api들은 간헐적 실패나 출력을 변경할 수 있으니 제외시켜야합니다. 그렇기에 모든 외부 연결과의 커뮤니케이션은 activity에서 일어나야 합니다. 같은 이유로 workflow 코드는 꼭 cadence api의 time,sleep, new thread를 사용해야 합니다.
*cadence/workflow에서 제공해주는 workflow.sleep, workflow.go, 등이 그것입니다. cadenc api를 사용하지 않게되면 의도하지 않은 에러가 발생 할 수 있습니다.
workflow ID는 start workflow시에 client에 의해 발급됩니다. 대개 business level의 id, customer id, order id 같은 것이됩니다.
cadence 한번에 domain 한 개당 하나의 ID를 workflow에게 발급해주는 것을 보장합니다. 같은 ID로 workflow을 실행한다면 workflow execution already sarted error를 반환합니다.
만약 완료된 workflow와 같은 ID를 발급받기 시도한다면,workflowIdReusePolicy option을 따릅니다.
AllowDuplicateFailedOnly: 같은 ID로 이전에 workflow가 실패한 경우에 실행가능합니다.
AllowDuplicate: 이전 workflow가 compoletion 상태면 독립적인 실행을 허용합니다.
RejectDuplicate: 같은 ID로의 실행을 전혀 허용하지 않습니다.
default는 AllowDuplicatedFailedOnly입니다.
Child Workflow
workflow 는 child workflows를 실행할 수 있습니다. child workflow는 성공하거나 실패하고 parent에게 report 되어집니다.
몇 가지 경우 child workflow가 사용됩니다.
parent의 workflow가 포함되지 않는 개별의 worker에서 child workflow가 host가 될 수 있습니다.
single workflow는 size의 한계가 있습니다. 예를 들어 100k activities/workflow. child workflow는 작은 chunks로 파티셔닝 할 수 있습니다. 1개의 parent, 1000개의 children은 각 1000개의 activity가 실행가능하고 1 million의 activity가 실행 가능합니다.
child workflow로 uniquniness를 보장하기 위해 ID로 리소스 관리를 할 수 있습니다.
예를들어 호스트를 업그레이드 하는 workflow는 child workflow를 host마다 가질수있습니다. (hosname = workflowID) 그리고 모든 작업들이 sereialized 될 수 있습니다.
child workflow는 주기적인 로직을 parent history size를 늘리지 않고도 실행 할 수 있습니다.
예를 들어 parent가 child를 시작하면, 주기적인 로직을 필요한만큼 여러번 실행시킬 수 있습니다.
child workflow는 single workflow가 모든 logic을 연이어 실행하는것과 대비되어 shared state가 없다는것이 주요 한계입니다. (*parent-child,child-child간의 하나의 workflow를 구성하는것처럼 쉽게 shared state를 사용하기 힘들다..)
pareint와 child는 오직 asynchronus signal로만 통신이 가능합니다. 그러나 만약 둘사이가 tight coupling 된경우는 shared object state에 의존해 single workflow로 구성하는 편이 더 간단할것입니다.