Streamsが先日GAとなったためどのようなものか調査した内容をまとめます。「Goから簡単イイカンジに使うことができないかな?」という動機で触ってみたため本命であるDataflowからの利用感については未調査です。DELETE)の内容をニアリアルタイムで取得するための仕組みで、主な用途としては以下のようなものが想定されています。outboxパターンを実装する必要がありました。Streamsが配信を行うための内部テーブルへの書き込みはアプリケーション側の書き込みと同一のトランザクション内で行われるため、コミットが成功した時点で配信が保証されます。詳細は後述しますがこの内部テーブルへの書き込みによって遅延が発生しないようデータの局所性を持った動作となっているため恐らくパフォーマンスへの影響はあまり気にしなくてよいと思われます。Readを使ってレコードを取得する必要があります。StreamsのスケーラビリティSpannerでは実データをColossus(分散ストレージ)上にSplit単位のまとまりで保存していますが、このSplitが一定以上の規模になると自動的に分割するという仕組みでスケールを実現しています。Partitionは1つのSplitに紐付いておりこのPartitionがSplitの増減と連動することでスケーラビリティを確保します。加えてPartitionは可能な限り高速に処理できるようデータのインターリーブのようにSplitに紐付け局所性を持つよう配置されます。設定を入れることそのものは比較的簡単でインデックスやユニーク制約に類似したDDLを流せばOKです。スコープとしてはdatabase全体テーブル単位カラム単位の3つがあり例えば以下のようにすると各スコープのサンプルを設定できます。Items(Name);ただし設定にあたっては「database毎に10個まで」等といった制約があるためQuotasをよく確認し超過しないように気を付けましょう。APIを叩いて直接使う方法が示されていますが、やはり本命はDataflowなようでいくつか実用できそうなテンプレートが提供されています。APIベースで利用する場合かなり面倒な実装が必要になると思われます。先に述べたPartitionの分割が発生するとその旨を通知するレコードが返却されるため、その通知内容を元に新たに別プロセスを起動して別のテーブルからストリームを取得するような動作が必要と思われます。反対にPartitionのマージ(=Splitのマージ)が発生する場合、不要なプロセスは削除しストリームの受信を止める必要がありそうです。Dataflowテンプレートであれば当然この辺りは全て網羅され正しく動作するものがすぐに利用できるため、余程の理由が無い限りはDataflowを使う方向で検討した方が賢明でしょう。tailingが実現できるのでは......!?と期待していたのですが、そう単純な話ではありませんでした。一応ちょろっと触ってみたとはいえ一応Goから少し触ってみたのでそのコードを供養がてら貼り付けます。試行錯誤はしましたがAPIを直接触らなくてもGoのクライアントライブラリから動かすことができました。Streamsから受信できた!わーい🥰」というレベルでありサバンナの蟻塚以上の穴だらけ実装で全く使い物にならないためくれぐれも参考にはしないで下さい。スキーマは「有効化」のところで入れたものを使っています。French.バッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。