bởi Benjamin Smith | ngày 15 tháng 9 2023 | in AWS Step Functions, Serverless | Permalink | Share
Các nhà phát triển sử dụng AWS Step Functions, một quy trình công việc trực quan để build các ứng dụng phân tán, IT tự động hóa và các quy trình kinh doanh, và tổ chức các dịch vụ AWS với code tối thiểu.
Step Function khởi động lại các quy trình công việc tiêu chuẩn cho phép bạn khởi động lại việc thực thì một quy trình công việc bị lỗi từ điểm lỗi, thay vì phải chạy lại toàn bộ quy trình công việc. Bài viết này giải thích cách sử dụng tính năng khởi động lại mới này để bỏ qua các bước không cần thiết trong quy trình công việc và giảm thiểu chi phí khởi động lại các quy trình công việc lỗi.
Xử lý các lỗi quy trình công việc
Bất cứ trạng thái quy trình công việc nào có thể đối mặt với các lỗi runtime. Các lỗi xảy ra với nhiều lý do, bao gồm các vấn đề định nghĩa máy trạng thái, các lỗi task, các quyền không đúng, và ngoại lệ từ các downstream service. Theo mặc định, khi một trạng thái báo cáo lỗi, Step Function làm việc thực thi quy trình công việc lỗi. Step Function cho phép bạn xử lý lỗi bằng cách gọi lại, bắt lỗi và quay về một trạng thái đã xác định.
Bay giờ bạn có thể khởi động lại quy trình công việc từ trạng thái lỗi, bỏ qua các bước thành công trước đó. Các kết quả này giúp hoàn thành quy trình công việc nhanh hơn và ít chi phí hơn. Bạn có thể chỉ khởi động lại việc thực thi quy trình công việc lỗi từ bước bị lỗi bằng cách dùng định nghĩa máy trạng thái khác với việc thực thi từ bạn đầu.
Chọn giữa thử lại và khởi động lại
Sử dụng cơ chế thử lại cho các vấn đề tạm thời như vấn đề kết nối mạng hoặc các dịch vụ tính phí không có sẵn. Bạn có thể cấu hình số lượt thử lại, cùng với interval và tỉ lệ hoàn trả, cung cấp cho quy trình công việc nhiều lần thử để hoàn thành công việc một cách thành công.
Trong các kịch bản khi nguyên nhân cơ bản của một lỗi yêu cầu điều tra hoặc thời gian quyết định lâu hơn, khởi động lại trở thành một công cụ có giá trị. Cần nhắc một trường hợp khi một dịch vụ bị downstream gặp phải ngừng hoạt động kéo dài hoặc cần thiết can thiệp bằng tay, ví dụ như cập nhật một cơ sở dữ liệu hoặc thay đổi code một hàm Lambda. Trong các trường hợp này, có thể khởi động lại quy trình công việc cho bạn thời gian để xác định vấn đề gốc trước khi tiếp tục việc thực thi quy trình công việc.
Kết hợp thử lại và khởi động lại
Đáp ứng một chiến lược hỗn hợp kết hợp giữa các cơ chế thử lại và khởi động lại:
- Cơ chế thử lại: Cấu hình việc khởi tạo lại để tự động sửa lỗi. Điều này đảm bảo các vấn đền tạm thời được xác định kịp thời và quy trình công việc hoạt động không có bị trễ không cần thiết.
- Bắt lỗi và khởi động lại: Nếu cơ chế thử lại cạn kiệt mà không thành công, cho phép trạng thái dẫn đến lỗi và sử dụng tính năng khởi động lại để chạy lại quy trình công việc từ trạng thái không thành công gần nhất. Hướng tiếp cận này cho phép tiếp cận nơi các lỗi tồn tại hoặc yêu cầu các hành động ngoài.
Giảm các chi phí
AWS tính tiền cho các quy trình công việc tiêu chuẩn dựa trên số lượng trạng thái chuyển tiếp yêu cầu để chạy workload. Step Function tính một trạng thái chuyển tiếp mỗi lần một bước trong quy trình công việc chạy. Step Function tính tiền cho tổng số trạng thái chuyển tiếp qua các máy trạng thái, bao gồm cả các thử lại. Phí là 0.0025$ mỗi 1000 trạng thái chuyển tiếp. Nghĩa là giảm bớt ố trạng thái chuyển tiếp làm giảm chi phí chạy các quy trình công việc tiêu chuẩn.
Nếu một quy trình công việc có nhiều bước, bao gồm các trạng thái song song hoặc lựa chọn, hoặc là dễ dẫn đến các lỗi chạy lại thường xuyên, tính năng mới này giảm chi phí xảy ra. Bạn chỉ trả cho mỗi trạng thái chuyển tiếp sau khi trạng thái lỗi và các chi phí này cho mỗi dịch vị ngừng hoạt động được thực thi như là một phần của việc chạy lại.
Ví dụ dưới đây giải thích các tính chi phí của việc thử lại một quy trình công việc có lỗi, có và không có khởi động lại. Trong ví dụ này, một quy trình công việc Step Function tổ chức Amazon Transcribe để tạo phiên dịch từ một file .mp4.
Vì trạng thái lỗi xảy ra trước khi kết thúc quy trình công việc, việc thực thi khởi động lại không chạy lại các trạng thái thành công, giảm toàn bộ thời gian hoàn tất thành công. Nếu quy trình công việc này lỗi thường xuyên, việc giảm các chuyển tiếp và thời gian thực thi trở nên có giá trị đáng kể.
Lần đầu tiên quy trình công việc này chạy, trạng thái cuối dùng một hàm AWS Lambda để gọi một HTTP request lỗi với một lỗi IAM. Bởi vì quy trình công việc không có các quyền yêu cầu để gọi hàm Lambda. Sau khi cấp các quyền yêu cầu cho vai trò thực thi của quy trình công việc, khởi động lại để tiếp tục quy trình công việc từ trạng thái lỗi.
Sau khi khởi động lại, quy trình công việc Step Function báo cáo một trạng thái lỗi khác. Lần này liên quan tới cấu hình của hàm Lambda. Nó là một ví dụ của lỗi ngừng hoạt động không yêu cầu một thay đổi trong định nghĩa quy trình công việc của tôi.
Sau khi sửa vấn đề cấu hình Lambda và khởi động lại quy trình công việc, việc thực thi hoàn tất thành công. Ảnh sau cho thấy các chi tiết thực thi, bao gồm số lần khởi động lại, số trạng thái chuyển tiếp và lần khởi động lại gần nhất:
Bắt đầu với khởi động lại
Khởi động lại hoạt động chỉ với quy trình công việc tiêu chuẩn. Bạn có thể khởi động lại quy trình công việc từ
bước lỗi một cách lập trình, thông qua AWS CLI hoặc AWS SDK, hoặc sử dụng Step Functions console, cung cấp một trải nghiệm quản lý trực quan:
- Từ Step Function console, chọn quy trình công việc lỗi bạn muốn khởi động lại, và chọn Redrive
- Một phương thức xuất hiện với chi tiết thực thi. Chọn Redrive execution.
Trạng thái khởi động lại kể từ, định nghĩa quy trình công việc và đầu vào trước đó đều có thể sửa được.
Để khởi động lại việc thực thi quy trình công việc một cách lập trình từ điểm lỗi của nó, gọi new Redrive Execution API action. Việc thực thi quy trình công việc tương tự bắt đầu từ trạng thái không thành công gần nhất và sử dụng cùng dầu vào với trạng thái không thành công gần nhất từ lúc việc thực thi quy trình công việc tạo ra lỗi.
Tự động lập trình bắt lỗi trong thực thi quy trình công việc để khởi động lại
Step Function có thể xử lý workload tự chủ mà không cần tới tương tác từ con người, hoặc có thể gồm có can thiệp từ một người dung bằng cách dùng .waitForTaskToken pattern.
Khởi động lại là chỉ cho các lỗi chưa xử lý hoặc không ngờ tới. Xử lý các lỗi trong quy trình công việc sử dụng các cơ chế có sẵn để bắt, thử lại và chuyển hướng đến trạng thái Lỗi, không cho phép quy trình công việc khởi động lại. Tuy nhiên, có thể xác định gần thời gian thực khi một quy trình công việc có lỗi, và tự động lập trình khởi động lại. Khi một quy trình công việc lỗi, nó phát ra một sự kiện vào Amazon EventBridge bus sự kiện mặc định. Sự kiện này như trong đối tượng JSON dưới đây:
Có 4 cặp key/values mới trong sự kiện này:
| “redriveCount”: 0, “redriveDate”: null, “redriveStatus”: “REDRIVABLE”, “redriveStatusReason”: null, |
Số đếm khởi động lại cho thấy số lần quy trình công việc đã khởi động lại trước đó. Trạng thái khởi động lại cho thấy nếu quy trình công việc lỗi là hợp lệ cho việc thực thi khởi động lại.
Để khởi động lại quy trình công việc một cách có lập trình từ trạng thái lỗi, tạo một quy tắc tương thích với mẫu cho sự kiện này, và định tuyến sự kiện tới một đối tượng dịch vụ để xử lý lỗi. Đối tượng dịch vụ này sử dụng API mới States.RedriveExecution để khởi động lại quy trình công việc.
Tải và triển khai mẫu trước đó từ ví dụ trên serverlessland.com
Trong ví dụ bên dưới, trạng thái đầu tiên gửi một post request tới một API endpoint. Nếu request lỗi do các vấn đề kết nối mạng hoặc độ trễ, trạng thái thử lại. Nếu thử lại lỗi, sau đó Step Function phát ra một sự kiện Step Function Execution Status Change đến EventBridge bus sự kiện mặc định. Một quy tắc EventBridge định tuyến sự kiện này tới một dịch vụ mà bạn có thể sửa chữa lỗi này và sau đó khởi động lại công việc bằng Step Function API.
Tính năng khởi động mới cũng hỗ trợ các trạng thái chọn phân tán.
Khởi động lại cho các việc thực thi các quy trình công việc express con
Cho các thực thi quy trình công việc con bị lỗi là quy trình công việc Express trong một Distributed Map, khả năng khởi động lại đảm bảo bắt đầu lại liền mạch từ lúc bắt đầu của qltv con. Nó cho phép bạn giải quyết các vấn đề cụ thể với các vòng lặp cá nhân mà không cần bắt đầu lại toàn bộ bản đồ.
Khởi động lại cho các thực thi quy trình công việc con tiêu chuẩn
Đối với các lần thực thi quy trình công việc con không thành công trong Distributed Map là Quy trình công việc tiêu chuẩn, tính năng khởi động lại hoạt động theo cách tương tự trong Quy trình công việc tiêu chuẩn độc lập. Bạn có thể khởi động lại vòng lặp lỗi từ điểm lỗi của nó, bỏ qua các bước không cần thiết đã thực hiện thành công.
Kết luận
Khởi động lại Step Function cho các quy trình công việc tiêu chuẩn cho phép bạn khởi động lại thực thi các quy trình công việc lỗi từ điểm lỗi thay vì phải bắt đầu lại toàn bộ quy trình công việc. Kết quả này là hoàn thành quy trình công việc nhanh hơn và ít chi phí hơn để xử lý các thực thi lỗi. Đó là bởi vì nó giảm số trạng thái chuyển tiếp và gọi các dịch vụ ngừng hoạt động.
Ghé Serverless Workflows Collection để duyệt nhiều quy trình công việc có thể triển khai giúp xây dựng các ứng dụng serverless của bạn.