「Sardineは不正対策のためのLookerだ」。私たちはSardineで、不正対策・コンプライアンスチームがノーコードのルールエディタで新しいルールを作成しバックテストできるように、AIモデルが使用しているのと同じ高度に後処理・正規化されたシグナルを用いて、世界最大級の不正・金融犯罪向けフィーチャーストアを構築しています。この記事では、その構築方法について紹介します。

図: Sardineのノーコードルールエディタでは、不正対策やコンプライアンスのアナリストがSQLの知識なしに新しいルールを作成し、バックテストできます。1,000種類以上の特徴量があり、それらはすべてApache BeamとGoを使ったDataFlowジョブによって集計・後処理・正規化されています。
Apache Beamはオープンソースのデータ処理ライブラリです。Sardineでは、beamジョブのランナーとしてGCPのDataflowを使い、さまざまなデータ処理を行っています。
私たちのジョブの多くはJavaで書かれています。これはApache Beamコミュニティで最もサポートが充実している言語だからです。ただし、BeamはPythonとgolangもサポートしています。Dataflowは公式にはJavaとPythonのみをサポートしていますが、golangのジョブのランナーとしてDataflowを使うことも可能です。

私たちはバックエンドサーバーにgolangを使用しているため、golangでbeamのバックフィルジョブを書くことで、サーバー用に書いたコードを再利用できました。この記事では、Bigqueryからマスターデータを読み込み、golangで何らかの処理を行い、SQLデータベースに書き込むバックフィルジョブについて説明します。
Dataflowは公式にはgolangをサポートしていないため、オンラインで参考になる資料はあまり見つかりませんでした。同じような目標を達成したい方の助けになれば幸いです。読者はすでに公式のgetting startedガイドに目を通し、Beamの基本的な概念を理解していることを前提としています。
ソースコードを直接見たい方は、以下のオープンソースリポジトリへのリンクをご覧ください。
https://github.com/sardine-ai/dataflow-golang-example
私たちが最初に直面した問題は、Beam SDKによって引き起こされるnamespaceの競合エラーでした。
私は約1週間前にBeamチームにこの問題を報告しましたが、返答はありませんでした。実は、この競合を無視するためのGOLANG_PROTOBUF_REGISTRATION_CONFLICTフラグがあり、ジョブをローカルで実行する際に渡すだけで済みます。
Dataflow上でジョブを実行する場合は少し複雑です。Beam SDKが暗黙的にworkerバイナリをコンパイルしてくれるためです。しかし幸いなことに、worker_binaryフラグがあるため、自分でバイナリをビルドしてBeamに渡すことができます。
Bigqueryの読み込みについては、Beamがすでにライブラリを提供しているため、以下のようにするだけで済みます。
データベースへの書き込みについては、自分自身のコードを書くことができます。一つ注意すべき点は、ParDoごとにデータベース接続を開閉し続けたくはないだろうということです。代わりに、StartBundleメソッドを使ってデータベース接続を初期化できます。golang beamでは、ParDo用のstructを定義します。
以上です!私たちのジョブの簡略化されたコードは、以下のリポジトリでご覧いただけます。
https://github.com/sardine-ai/dataflow-golang-example
データが大好きで、この記事を楽しんでいただけたなら、ぜひ私たちの仲間になりませんか。Feature Storeの構築・スケールを手伝ってくれるシニアデータエンジニアを募集しています!



