Skip to content

Instantly share code, notes, and snippets.

@mayooot
Created June 13, 2024 07:28
Show Gist options
  • Save mayooot/7f47d0cf520677e4a85470105cb2402a to your computer and use it in GitHub Desktop.
Save mayooot/7f47d0cf520677e4a85470105cb2402a to your computer and use it in GitHub Desktop.
Simple Saga
package main
import (
"errors"
"fmt"
)
type Step func() error
type RollbackStep func() error
type Saga struct {
steps []Step
rollbacks []RollbackStep
}
func (s *Saga) AddStep(step Step, rollback RollbackStep) {
s.steps = append(s.steps, step)
s.rollbacks = append(s.rollbacks, rollback)
}
func (s *Saga) Execute() error {
for i, step := range s.steps {
if err := step(); err != nil {
for j := i; j >= 0; j-- {
if rbErr := s.rollbacks[j](); rbErr != nil {
fmt.Printf("rollback step %d failed: %v\n", j, rbErr)
}
}
return err
}
}
return nil
}
func main() {
saga := &Saga{}
// 添加步骤和对应的回滚操作
saga.AddStep(
func() error {
fmt.Println("Step 1")
return nil
},
func() error {
fmt.Println("Rollback Step 1")
return nil
},
)
saga.AddStep(
func() error {
fmt.Println("Step 2")
return nil
},
func() error {
fmt.Println("Rollback Step 2")
return nil
},
)
saga.AddStep(
func() error {
fmt.Println("Step 3")
return errors.New("error in Step 3")
},
func() error {
fmt.Println("Rollback Step 3")
return nil
},
)
// 执行Saga
if err := saga.Execute(); err != nil {
fmt.Printf("Saga failed: %v\n", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment