A B Testing Workflow
patterns
This workflow models comparing two versions to see which performs better.
patterns
This workflow models having messages carry their own routing instructions.
user { # User
n1: circle label:"Start Routing Slip"
n5: rectangle label:"Record Routing Slip outcome"
n9: rectangle label:"Monitor Routing Slip status"
n13: circle label:"End Routing Slip"
n1.handle(bottom) -> app.n2.handle(top)
n5.handle(bottom) -> app.n6.handle(top) [label="Done"]
n9.handle(bottom) -> app.n10.handle(top)
}
app { # App
n2: rectangle label:"Receive Routing Slip event"
n6: rectangle label:"Monitor Routing Slip status"
n10: rectangle label:"Monitor Routing Slip status"
n2.handle(bottom) -> service.n3.handle(top) [label="Next"]
n6.handle(bottom) -> service.n7.handle(top)
n10.handle(bottom) -> service.n11.handle(top)
}
service { # Service
n3: rectangle label:"Validate Routing Slip conditions"
n7: rectangle label:"Monitor Routing Slip status"
n11: rectangle label:"Monitor Routing Slip status"
n3.handle(bottom) -> database.n4.handle(top)
n7.handle(bottom) -> database.n8.handle(top)
n11.handle(bottom) -> database.n12.handle(top) [label="Success"]
}
database { # Database
n4: diamond label:"Execute Routing Slip action"
n8: rectangle label:"Monitor Routing Slip status"
n12: diamond label:"Monitor Routing Slip status"
n12.handle(left) -> service.n11.handle(left) [label="Retry/Rejected"]
n12.handle(right) -> user.n13.handle(bottom)
n8.handle(right) -> user.n9.handle(left) [label="Processed"]
n4.handle(left) -> service.n3.handle(left) [label="Retry/Rejected"]
n4.handle(right) -> user.n5.handle(left)
}
patterns
This workflow models comparing two versions to see which performs better.
patterns
This workflow models checking user permissions before actions run.
patterns
This workflow models an async operation that notifies a callback when done.
patterns
This workflow models keeping large payloads external and only passing references.
patterns
This workflow models rolling back work when a later step fails.