原文はこちら
メッセージのConsumeとProduceにいまお使いなのがMicronautのようなフレームワークであれ、Kafka SDKそのものであれ、あなたのアプリケーションの中でメッセージングを扱うのに、Oracle Streaming Service(OSS)はかんたんでより安価な方法です。Kafkaクラスターを手で組み上げてそのコストと保守作業に気をもむ…といったことが必要なくなります。ただStreamを作成して、あとはそれを使ってメッセージをProduce、Consumeするだけでよいのです。
とはいえ、それだけでは足りない場合もありますよね。マイクロサービスアーキテクチャではメッセージングは実に重要で、今まではOracle Streaming Serviceではそのうち輸送の部分、ProduceとConsumeのみを扱っていました。つまり、やり取りの受信元と送信先は両方ともアプリケーション側の責務の範囲でした。しかしそれも過去の話、というのもOracle Streaming ServiceでKafka Connectを使えるようになったのです。
Kafka Connectがなにかって?いい質問ですね!Kafka Connectは外部ソースをKafkaに(あるいは、わたしたちの場合はOracle Streaming Serviceに)つなげるためのオープンソースフレームワークです。外部ソースとはたとえばオブジェクトストレージやデータベース、Key-Valueストアなどがあたります。Kafka Connectについて知っておいたほうがいい用語がふたつあります。ひとつはSource Connector、もうひとつがSink Connectorです。Source Connectorを使うと外部ソースからデータを取ってくることができ、Sink Connectorでは外部ソースにデータを送ることができます。
実際イケてるフレームワークですよこれは。考えてみてください、データベーステーブルにレコードがインサートされるたびにメッセージを受け取るStreamを作ることもできるんですよ!TopicにメッセージをProduceするだけでレコードをテーブルにインサートすることだってできる!でもお喋りはここまでにして、実際こういうことをどうやって実現するのか見ていきましょう。ぜんぜん難しくありません、一通りステップバイステップでやっていきましょう。
Kafka Connectのインテグレーションの準備
このチュートリアルでは、Autonomous Transaction Processing(ATP)インスタンス上のテーブルからデータを取ってくるSource Connectorを作成します。ただ、このインテグレーション編に進む前にいくつか準備が必要です。あなたのマシンに諸々のファイルを保存する用のプロジェクトディレクトリを作っておくのがよいでしょう。そのディレクトリをここでは /projects/connect-demoとして参照しますが、必要に応じてご自身のパスに読み替えてください。
Autonomous DBのセットアップ
インテグレーションに使ってみる用のAutonomous DBを作成し、Walletの認証情報を取得していきましょう。インスタンスをお持ちでない場合は、こちらのガイドを参照してAutonomous DBをサクッと作成して起動しましょう。お望みであればalways freeのATPインスタンスを使っていただいてもちゃんとできますよ。
用意できたらまず、その起動中のインスタンスにSQL Developerでつなげて(またはSQL Developer Webを使ってもOK)、いくつか権限を付与しつつ新しいユーザーを作成しましょう:
次に、ちょっとしたテーブルを作成します。
これで準備はOKです!次に進みましょう。
必要なモジュールのダウンロード
プロジェクトディレクトリに3つのものをダウンロードする必要があります:
- Oracle JDBC Drivers
- Kafka JDBC Connector
- あなたのATPインスタンスのWallet
OracleドライバのZIPの中身を
/projects/connect-demo/drivers
に配置して、Kafka JDBC ConnectorのZIPの中身は /projects/connect-demo/kafka-jdbc/connector
に配置してください。次に、Walletを /projects/connect-demo/wallet
に配置しましょう。WallteはコンソールUIかOCI CLI経由でダウンロードできます。CLIでサクッとやる場合には:注意:WalletのZIPを解凍するのをお忘れなく。中身は
/projects/connect-demo/wallet
に配置してくださいね。OK、これでダウンロードが必要なものについては揃いました。ではではStreamへと飛び込んでいきましょう!
Stream Poolの作成
次に作成が必要な部品がふたつあります。Stream Poolと、Connect Configurationです。これらを作成するのにOCI SDKを使ってお好みの通りにコードでやることもできますが、ここではより簡潔にコンソールUIでやっちゃいましょう。まずはコンソールのハンバーガーメニューから'Analytics' -> 'Streaming'とクリックしてStreamingのページに向かいましょう:
次に、Streaming初期ページの左側のメニューから、'Stream Pools'を選択。
そして'Create Stream Pool'をクリック。
適当な名前を入力して'Auto Create Topics'にチェックを入れましょう。これによりKafka Connectが必要に応じてTopicを作成できるようになるんですが、これはKafkaの '
auto.create.topics.enable
'の設定と同等です。"Create Stream Pool'をクリックしてちょっと待てばPoolが'Active'になります。そうしたら'View Kafka Connection Settings'ボタンをクリックしましょう。
ここで出てくる情報はあとで使うためどこかにコピーしておいてください。なお、SASL Connection Stringのusernameは別のものを使うこともできます(詳細はこのポストのCreate a Streams Userを読んで下さい)。
Poolができあがりましたので、Connect Configurationを料理していきましょう。
Connect Configurationの作成
次はサイドバーから'Kafka Connect Configuration'をクリックしてCreate~~のボタンをクリック。
出てくるダイアログでは適当な名前を入力してください。
作成されたら、表示されるConnect Configuration OCIDとKafka Connect Storage Topicsをどこかにコピーしておいてください。
これでOK、次にいきましょう。
Kafka Connectの構成と起動
ここまででKafka Connectを起動し、Source Connectorを作成して
TEST
テーブルをリッスンさせるための用意ができました。ここではDevezium Connect Dockerイメージを使ってシンプルかつコンテナ化されたやり方を取りますが、公式のKafka Connect Dockerイメージを使ってもいいですし、バイナリ版を使ってもいいです。Dockerイメージを起動する前に、Connectを設定するためのプロパティファイルのセットアップが必要です。前述したステップで集めておいた情報が必要になるので手元に置いといてくださいね。また、Stream Poolから取ってきたStreamingのusername(SASL Connection Stringを参照)と認証トークンも必要です。Streaming専用ユーザーと認証トークンの生成方法についてはこちらのブログポストを参照ください。以下の内容で
/projects/connect-demo/connect-distributed.properties
のファイルを作成してください。<括弧>の部分はご自身の実際の値で置き換えてください。コンテナに依存モジュールを収めないとならないので、以下のような
debezium/connect
イメージベースの /projects/connect-demo/Dockerfile
を作成してください。ではこのDockerイメージをビルドしていきます。私はTopic名の置換を簡単にするためのBashスクリプトを作ってみましたが、<括弧>の内容を置き換えつつここにあるコマンドをそれぞれ手動で実行して頂いても構いません。なお、先程作成した
/projects/connect-demo/connect-distributed.properties
ファイルをDockerコンテナにマウントしている点に留意ください。このBashスクリプトを実行することでConnectインスタンスを起動できます。マシンやネットワークにもよりますが、だいたい30~45秒くらいで起動されます。起動したら、REST APIでConnectorを作成できるようになっていますが、その前にJSONのConnector設定ファイルが必要です。
留意してほしいことがいくつかあります。ここのConnection URLはもし過去にATPやJDBCを使ったことがあればおなじみのものでしょう。これはあなたのWallet内のtnsnames.oraファイルの選択したエントリーを参照しており、また、Walletへのパスも指定しています(Dockerコンテナ内でのパスで、これは前のステップでファイルシステムのルートに置いてありました)。UserとPasswordは前のステップで作成しておいたスキーマの認証情報です。
topic.prefix
のエントリは table.whitelist
内に指定したテーブルでTopicのPrefixとして使われます。では、REST APIでこの設定を
POST
してSource Connectorを作成しましょう:すべてのConnectorの一覧の取得には
GET
リクエストしましょう。Connectorを削除したければ
DELETE
リクエストです。他の操作についてはConnect REST APIドキュメントを参照してください。
Connectorが作成できたら、Whitelistに入れたテーブルにそれぞれTopicが作成され、指定したTopic Prefixとテーブル名から成る名前がつけられて利用可能になります。
インテグレーションを試してみる
Streamが利用可能になったら、テーブルにいくつかのレコードをインサートしてトランザクションをコミットしてみましょう:
コンソールで当該のStreamをクリックして、'Load Messages'をクリックすると最近のメッセージが表示されます。
TEST
テーブルにインサートしたレコードごとにメッセージがあることが確認できるでしょう。メッセージの値をクリックすると詳細が表示されます。
これでおしまい!
まとめ
このポストではATPにテストスキーマとテーブルを作成し、Stream PoolとConnect Configurationを作成し、Kafka ConnectのインスタンスをDebezium Dockerイメージを使って起動して、ATP用のSource ConnectorをKafka Connect上に作成しました。テーブルにレコードをインサートすると、そのレコードがStreamにメッセージとしてPublishされているのを見て取れました。
Kafka Connectによるインテグレーションはとてもパワフルで、Oracle Cloud上のどんなマイクロサービスにでも使うことができるでしょう。