معماری میکروسرویسها اغلب پیچیدگیهایی در مدیریت تراکنشهای توزیعشده ایجاد میکند. اگرچه سرویسها از هم جدا هستند، هماهنگی تعاملات آنها نیازمند ارکستراسیون قدرتمندی است. Temporal با ارائه قابلیتهای اجرای بادوام، این مشکل را حل میکند و به توسعهدهندگان اجازه میدهد تا گردشکارهای قابل اعتمادی را به روشی مقاوم در برابر خطا بنویسند. این راهنما بررسی میکند که چگونه میتوان از Temporal با پایتون، Go و TypeScript استفاده کرد و یک محیط مشتری چندزبانه واقعی ایجاد نمود.
قدرت مشتریان چندزبانه
یکی از قویترین ویژگیهای Temporal، SDKهای مستقل از زبان آن است. تیمها میتوانند بهترین زبان را برای هر سرویس انتخاب کنند بدون اینکه از ثبات گردشکار بکاهند. چه هسته بکاند شما برای عملکرد بهتر در Go باشد، چه لایه پردازش دادهها برای تحلیلها در Python و چه یکپارچهسازی فرانتاند در TypeScript، Temporal یک مدل برنامهنویسی یکپارچه را با استفاده از زبان تعریف گردشکار (WDL) ارائه میدهد.
تعریف گردشکارها در Go
Go اغلب ستون فقرات میکروسرویسهای با عملکرد بالا است. در Temporal، یک گردشکار Go به عنوان یک تابع معمولی تعریف میشود. نکته کلیدی استفاده از تابع workflow.ExecuteActivity است که به شما امکان میدهد فعالیتها (توابع بدون حالت) را فراخوانی کنید که کار اصلی را انجام میدهند.
package main
import (
"go.temporal.io/sdk/workflow"
)
func MyWorkflow(ctx workflow.Context) error {
ao := workflow.ActivityOptions{
StartToCloseTimeout: 10 * time.Second,
}
ctx = workflow.WithActivityOptions(ctx, ao)
var result string
// Execute activity and wait for completion
err := workflow.ExecuteActivity(ctx, GreetActivity, "Hello").Get(ctx, &result)
return err
}
func GreetActivity(ctx context.Context, name string) (string, error) {
return "Greeting: " + name, nil
}
پیادهسازی کارگران در Python
توسعهدهندگان پایتون از دکوراتورهای شهودی Temporal بهره میبرند. دکوراتورهای @workflow.defn و @activity.defn ثبت گردشکارها و فعالیتها را ساده میکنند. این رویکرد منطق کسبوکار را تمیز نگه میدارد و جریان کنترل گردشکار را از پیادهسازی فعالیتها جدا میکند.
from temporalio import workflow
from temporalio import activity
from typing import Dict
@activity.defn
async def greet_activity(name: str) -> str:
return f"Greeting: {name}"
@workflow.defn
class MyWorkflow:
@workflow.run
async def run(self, name: str) -> str:
result = await workflow.execute_activity(
greet_activity,
name,
schedule_to_close_timeout=timedelta(seconds=10)
)
return result
یکپارچهسازی مشتری با TypeScript
مشتریهای TypeScript برای توابع بدون سرور یا کارگران متصل به فرانتاند ایدهآل هستند. SDK رابطهای ایمن از نظر نوع را ارائه میدهد که با شیوههای توسعه وب مدرن همخوانی خوبی دارند. شما میتوانید گردشکارها را شروع کرده و وضعیت آنها را مستقیماً از برنامههای Node.js خود پرسوجو کنید.
import { Client } from '@temporalio/client';
async function startWorkflow() {
const client = new Client({
connectionOptions: {
address: 'localhost:7233',
},
});
const handle = await client.start('MyWorkflow', {
taskQueue: 'default',
args: ['World'],
});
console.log(`Workflow started with ID: ${handle.workflowId}`);
}
startWorkflow();
بهترین شیوهها برای محیطهای چندزبانه
هنگام کار در چندین زبان، ثبات کلیدی است. اطمینان حاصل کنید که تمام مشتریان از نسخه یکسانی از Temporal Server استفاده میکنند تا از مشکلات سازگاری جلوگیری شود. از رابطهای مشترک یا طرحوارههای Protobuf برای ساختارهای دادهای که بین فعالیتها در زبانهای مختلف منتقل میشوند، استفاده کنید. این کار از خطاهای سریالسازی جلوگیری کرده و ایمنی نوع را در سراسر گردشکار تضمین میکند.
نتیجهگیری
Temporal به توسعهدهندگان امکان میدهد میکروسرویسهای مقاوم و مقیاسپذیر بسازند بدون اینکه در یک اکوسیستم زبانی خاص قفل شوند. با بهرهگیری از پایتون، Go و TypeScript، تیمها میتوانند از نقاط قوت هر زبان استفاده کنند در حالی که یک مدل اجرای یکپارچه را حفظ میکنند. هنگام به کارگیری این الگوها، بر اجرای بادوام و مقاومت در برابر خطا تمرکز کنید تا برنامههای قدرتمندی ارائه دهید که بتوانند شکستها را به آرامی تحمل کنند.