Skip to content
This repository was archived by the owner on Sep 18, 2023. It is now read-only.

Repository files navigation

Intro: Fault-Oblivious Stateful Python Code

cadence-python allows you to create Python functions that have their state (local variables etc..) implicitly saved such that if the process/machine fails the state of the function is not lost and can resume from where it left off.

This programming model is useful whenever you need to ensure that a function runs to completion. For example:

  • Business logic involving multiple micro services
  • CI/CD pipelines
  • Data pipelines
  • RPA
  • ETL
  • Marketing automation / Customer journeys / Customer engagement
  • Zapier/IFTTT like end user automation.
  • Chat bots
  • Multi-step forms
  • Scheduler/Cron jobs

Behind the scenes, cadence-python uses Cadence as its backend.

For more information about the fault-oblivious programming model refer to the Cadence documentation here

Install Cadencce

wget https://raw.githubusercontent.com/uber/cadence/master/docker/docker-compose.yml
docker-compose up

Register sample domain

docker run --network=host --rm ubercadence/cli:master --do sample domain register -rd 1

Installation cadence-python

pip install cadence-client==1.0.1

Hello World Sample

importsysimportloggingfromcadence.activity_methodimportactivity_methodfromcadence.workerfactoryimportWorkerFactoryfromcadence.workflowimportworkflow_method, Workflow, WorkflowClientlogging.basicConfig(level=logging.DEBUG)
TASK_LIST="HelloActivity-python-tasklist"DOMAIN="sample"# Activities InterfaceclassGreetingActivities:
@activity_method(task_list=TASK_LIST, schedule_to_close_timeout_seconds=2)defcompose_greeting(self, greeting: str, name: str) ->str:
raiseNotImplementedError# Activities ImplementationclassGreetingActivitiesImpl:
defcompose_greeting(self, greeting: str, name: str):
returnf"{greeting}{name}!"# Workflow InterfaceclassGreetingWorkflow:
@workflow_method(execution_start_to_close_timeout_seconds=10, task_list=TASK_LIST)asyncdefget_greeting(self, name: str) ->str:
raiseNotImplementedError# Workflow ImplementationclassGreetingWorkflowImpl(GreetingWorkflow):
def__init__(self):
self.greeting_activities: GreetingActivities=Workflow.new_activity_stub(GreetingActivities)
asyncdefget_greeting(self, name):
# Place any Python code here that you want to ensure is executed to completion.# Note: code in workflow functions must be deterministic so that the same code paths# are ran during replay.returnawaitself.greeting_activities.compose_greeting("Hello", name)
if__name__=='__main__':
factory=WorkerFactory("localhost", 7933, DOMAIN)
worker=factory.new_worker(TASK_LIST)
worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities")
worker.register_workflow_implementation_type(GreetingWorkflowImpl)
factory.start()
client=WorkflowClient.new_client(domain=DOMAIN)
greeting_workflow: GreetingWorkflow=client.new_workflow_stub(GreetingWorkflow)
result=greeting_workflow.get_greeting("Python")
print(result)
print("Stopping workers....")
worker.stop()
print("Workers stopped...")
sys.exit(0)

Status / TODO

cadence-python is still under going heavy development. It should be considered EXPERIMENTAL at the moment. A production version is targeted to be released in September of 2019January 2020March 2020 April 2020.

1.0

  • Tchannel implementation
  • Python-friendly wrapper around Cadence's Thrift API
  • Author activities in Python
  • Start workflows (synchronously)
  • Create workflows
  • Workflow execution in coroutines
  • Invoke activities from workflows
  • ActivityCompletionClient heartbeat, complete, complete_exceptionally
  • Activity heartbeat, getHeartbeatDetails and doNotCompleteOnReturn
  • Activity retry
  • Activity getDomain(), getTaskToken(), getWorkflowExecution()
  • Signals
  • Queries
  • Async workflow execution
  • await
  • now (currentTimeMillis)
  • Sleep
  • Loggers
  • newRandom
  • UUID
  • Workflow Versioning
  • WorkflowClient.newWorkflowStub(Class workflowInterface, String workflowId);

1.1

  • ActivityStub and Workflow.newUntypedActivityStub
  • Classes as arguments and return values to/from activity and workflow methods
  • WorkflowStub and WorkflowClient.newUntypedWorkflowStub
  • Custom workflow ids through start() and new_workflow_stub()
  • ContinueAsNew
  • Compatibility with Java client
  • Compatibility with Golang client

2.0

  • Sticky workflows

Post 2.0:

  • sideEffect/mutableSideEffect
  • Local activity
  • Parallel activity execution
  • Timers
  • Cancellation Scopes
  • Child Workflows
  • Explicit activity ids for activity invocations

About

Python framework for Cadence Workflow Service

Topics

Resources

Stars

152 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages