KEEPTIME モバイルモニター 15.6インチ 1920*1080 モバイルディスプレイ ポータブルモニター IPS液晶パネル 非光沢画面 薄型 軽量 マグネット保護カバー付き USB Type-C ミニHDMI PS4/XBOX/Switch/PC/Macなど対応 在宅勤務 リモートワーク
¥14,990 (2025年5月6日 13:15 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)対応 iPad 9世代 8世代 7世代 ガラスフィルム 【2枚セット+ガイド枠】 10.2インチ ガイド枠付き iPad9 保護フィルム iPad8 フィルム iPad7 強化ガラス 液晶保護フィルム 硬度 9H 耐衝撃 飛散防止 貼り付け簡単 自動吸着 気泡ゼロ 指紋防止 ラウンドエッジ加工 超高質感 iPad 10.2 第7世代 第8世代 第9世代 スマートタブレット 対応 専用 SEN3PB987
¥998 (2025年5月6日 13:15 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
ログラスのアプリケーション基盤チームで働いている三沢です。アプリケーション基盤では技術のキャッチアップ目的で Technology Radar を眺めて、気になったものを軽く深掘る時間を作っています。
今回は Technology Radar vol.32 (2025/04) からピックアップした、Restate について紹介したいと思います。Restate は今回 Platform 分野に新規で Assess 入りしたトピックです。ここではRestate を知らない読者を想定していて、基本的なできることについて説明します。Restate の詳細設定やデプロイ構成などは取り扱いません。
💡 Restate の成り立ちと解決する課題
Restate は Apache Flink (分散ストリーム処理をするプラットフォーム) の開発者によるプロジェクトです。彼らは Apache Flink を開発する中で、ストリーム処理が適するアプリケーションとトランザクション処理に適するアプリケーションに分類できることに気がついたそうです。
上図の左寄りがストリーム処理が適し、右寄りがトランザクション処理に適します。トランザクション処理に適するものの例としてユーザ管理や決済などがあり、正確性が重要になります。
トランザクションアプリケーションの実装は下記に分けられます。
- モノリシックアプリケーション: シンプルで柔軟
- 分散アプリケーション: 複雑になり、障害や一貫性などの問題がコードの大部分を占める
- サービス間の冪等性、分散トランザクション、永続性の条件や一貫性の考慮が必要
- 「呼び出している API が一時的に利用できなくなったら?」「ここで処理がハングアウトしたら?」「後続のリクエストが前のリクエストを追い越したら?」など
- ユーザが応答を待機しているケースでは非同期に動作させることもできない
- サービス間の冪等性、分散トランザクション、永続性の条件や一貫性の考慮が必要
Restate は分散アプリケーションでもまるでモノリシックな従来の RPC アプリケーションのように実装することを可能にします!開発者はビジネスロジックだけに集中できるようになります。
📝 Restate の役割
Restate を使ったサービス群の構成例です。
Restate はリバースプロキシサーバーやメッセージブローカーのようにサービスの前段に配置します。
ここで Restate Server は下記の役割を担当します。
- 各サービスのリトライやタイムアウトなどの呼び出しの制御
- 各サービス処理のコードレベルの進捗の管理 (durable な実行)
これらは Restate がログを中心にサービスの実行を管理することで実現しています。内部に Key-Value (K/V) ストアを持っており、支払いステータスやショッピングカートなどの状態管理やセッション情報などを管理します。
Restate の内部構成は 3 層のレイヤードアーキテクチャとなっています。クラスターの設定やリーダ選出などのシステムのメタデータ管理を担当するコントロールプレーン、Flexible Paxos によって高可用かつスケーラブルなイベント記録を実現する 分散ログ(Bifrost)、分散ログからイベントを処理してアプリケーションの呼び出しを実行するプロセッサレイヤーが存在します。分散ログで収集したデータは定期的にスナップショットを取ることが可能で、Amazon S3 および S3 互換オブジェクトストアに保存可能です。
※ 「分散ログ」については Paxos について少し知っておくと想像がつきやすいです。こちらの Paxos に ついて紹介されている記事がわかりやすかったです
🏓 Restate の基本コード
Restate 自体は Rust で実装されており、SDK は Typescript, Java, Kotlin, Python, Go, Rust を提供されています。ユースケースに合わせたサンプルコードが数多く用意されています。並列実行処理や Saga パターン、キューの処理から、実際のアプリケーションフローとして食品注文サービスや ToDo アプリケーションのサンプルなども存在します。
サンプルコードリポジトリ ▼
今回はこのサンプルコードの中から Kotlin で基本的な操作を見ていきます。
@Service
class MyService {
@Handler
suspend fun run(ctx: Context) {
val result = SubscriptionServiceClient.fromContext(ctx, "my-sub-123").create("my-request").await()
SubscriptionServiceClient.fromContext(ctx, "my-sub-123").send().create("my-request")
val awakeable = ctx.awakeableString>()
val greeting = awakeable.await()
ctx.awakeableHandle(awakeable.id).resolve("hello")
ctx.sleep(5.seconds)
awakeable.await(5.seconds)
SubscriptionServiceClient.fromContext(ctx, "my-sub-123").send().cancel(1.days)
val paymentDeduplicationID = ctx.random().nextUUID().toString()
ctx.runBlock { chargeBankAccount(paymentDeduplicationID, 100) }
}
}
Restate が持つ K/V ストアへの読み書きも各サービスのコードから更新・参照することができます。
https://github.com/restatedev/examples/blob/main/kotlin/basics/src/main/kotlin/virtual_objects/GreeterObject.kt
@VirtualObject
class GreeterObject {
companion object {
private val COUNT = stateKeyInt>("greet-count")
}
@Handler
suspend fun greet(ctx: ObjectContext, greeting: String): String {
val count = ctx.get(COUNT) ?: 0
val newCount = count + 1
ctx.set(COUNT, newCount)
return "$greeting ${ctx.key()}, for the $newCount-th time"
}
これらのコードを駆使して、より簡単に分散システムのアプリケーションを簡単に記述することが可能になります。実際にサービスを構築したわけではないですが、サンプルコードを見た限り、Restate の SDK は読みやすく確かに障害などの懸念点を自前で実装するよりも見通しがよくなりそうと思います。
☀️ まとめ
今回は Restate の基本概念について紹介しました。
Restate は、分散システム特有の複雑さ (冪等性やリトライ、状態管理、耐障害性など) を意識せず、モノリシックなアプリケーションのようにビジネスロジックを記述できるのが大きな特徴でした。それらが「おまかせ」で実現できる点に強みを感じました。一方で、Restate SDK によるコード依存が発生するため、導入する場合はプロジェクトの性質やチームの運用方針との相性も考慮する必要がありそうです。
今回はサンプルコードの範囲での紹介にとどまりましたが、実運用でどのくらいパフォーマンスや耐障害性に貢献するか、また Restate 特有のオペレーション上の注意点がどのくらいあるかについても、今後もう少し深掘りしてみたいと感じました。
🕸️ (おまけ 1) Restate UI
参考程度ですが、Restate の UI も一緒に提供されていて登録済みのサービスや実行履歴、状態を UI から見ることができます。
🕑 (おまけ 2) Temporal
似たプラットフォームとして、Temporal が存在します。こちらもTechnology Radar に 2022/03 に Assess 入りしていました。
Temporal はより長時間にわたるワークフローや複雑なプロセスを得意とし、Restate は小中規模向けで軽量なツールのようです。今回は詳しく調べていませんが、Temporal の方が先発のプラットフォームで 2025/04 現在は GitHub のスター数も Temporal の方が多いです。(Temporal: 13.8k, Restate: 2.3k)
Temporal は今後エージェント型の AI を基盤としたオーケストレーションに注力するそうです。
Views: 0