昨日の続き。
Avroを使ってメッセージをシリアライズ・デシリアライズするのに、スキーマを保存しておいてくれる場所があると便利だよなーってことで、Schema Registryが(僕の中に)登場。
Schema Registry?
Schema Registry — Confluent Platform 3.2.2 documentation
Avroのスキーマを保存したり取得したりするためのRESTfulなインターフェイスを持ってる。スキーマのバージョンを保存してるので、スキーマエボリューション的な用途で使えるっぽい。僕は、まだスキーマエボリューションについては勉強してないので、「ふーんバージョンがあるんだね」ってくらい。
Confluent Platform?
Kafkaを作ったチームがConfluentって会社を立ち上げて、Kafkaを真ん中に置いたConfluent Platformっていうプラットフォームを提供してるみたい。Kafkaを中心として便利なツールを色々提供してくれてて、Open Source版とEnterprise版がある。
Confluent: Apache Kafka & Streaming Platform for the Enterprise より
んで、Schema RegistryはそのOpen Source側にも含まれてる。
Download Confluent Open Source & Confluent Enterprise より
GitHub - confluentinc/schema-registry: Schema registry for Kafka
Schema Registryを動かしてみる
ということなので、Confluent Platformの中に含まれてそうなんだけど、僕はもうKafkaは別で動かしてたから、今回はConfluentが用意してくれてるDocker Imageを使うことにした。
この辺読みながら → Quickstart — Confluent Platform 3.2.2 documentation
こいつを使う → https://hub.docker.com/r/confluentinc/cp-schema-registry/
僕は発表のデモ用にDocker Composeを使ってローカルで色々立ち上げたんだけど(あ、うまく動いてなかったけど)その中からSchema Registryの部分だけを抜き出すとこんな感じ。
schema-registry: image: "confluentinc/cp-schema-registry:3.2.1" network_mode: "host" environment: SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: "localhost:2181" SCHEMA_REGISTRY_HOST_NAME: "localhost" SCHEMA_REGISTRY_LISTENERS: "http://0.0.0.0:8081" SCHEMA_REGISTRY_ACCESS_CONTROL_ALLOW_ORIGIN: "*" SCHEMA_REGISTRY_ACCESS_CONTROL_ALLOW_METHODS: "GET,POST,PUT,OPTIONS" depends_on: - "kafka"
内容的には
- ホストネットワークモードで動かして、ホスト側のlocalhost:8081で動く
- SCHEMA_REGISTRY_ってプレフィックスの環境変数で、Schema Registryに渡す設定を指定できる
- KAFKASTORE_CONNECTION_URLで、Zookeeperの場所を指定
- その環境変数のACCESS_CONTROL_ALLOW_ORIGINとMETHODSのところはなくても大丈夫。Schema ResgistryをWebUIで見られるようにしてくれるツールを使うために設定してる
ちな、docker-compose.yml全体はこちら。
https://github.com/bufferings/kanjava-party-2017/blob/master/environment/infra/docker-compose.yml
動作確認
# "Kafka-key"ってSubjectで登録 ~ $ curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \ > --data '{"schema": "{\"type\": \"string\"}"}' \ > http://localhost:8081/subjects/Kafka-key/versions {"id":6} ~ $ # 登録されてる全部のSubjectを取得(デモで使ったので他のも登録されてる) ~ $ curl -X GET http://localhost:8081/subjects ["InventoryRecoveryRequestedEvent","Kafka-key","Tweet","InventoryReservationRequestedEvent","TweetWordTop5","DifferentSchema"]
動いてる!
Schema Registry UIを動かしてみる
Schema RegistryをRESTで使うんでいいんだけど、WebUIあると便利だなーって思ってうろうろしてたらLandoopってところがSchema Registry UIを出してた。Kafka周りの色んなツールを提供してるみたいね。
Schema Registry UIのソースはこちら
GitHub - Landoop/schema-registry-ui: Web tool for Avro Schema Registry |
ライセンスはBSLってので、Kafkaのサーバーインスタンスが4台までは無料で使えるみたい。
例によってDockerがあるのでこれで試した。これを使うのにさっきのACCESS_CONTROL_ALLOW_ORIGINとMETHODSが必要だから忘れずにね。
https://hub.docker.com/r/landoop/schema-registry-ui/
schema-registry-ui: image: "landoop/schema-registry-ui:0.9.1" environment: SCHEMAREGISTRY_URL: "http://localhost:8081" ports: - "9001:8000" depends_on: - "schema-registry"
8000番は別のアプリで使いたかったので、こっちはブリッジネットワークモードでで9001をマッピングしといた。
こんな感じでSchema Registryの内容が見られる。
(∩´∀`)∩ワーイ
スキーマデータはKafkaに保存されてるっぽい
もういっこLandoopのツールで、Topicの中身を見れるツールを使って見てみたら、デフォルトで_schemaって名前のTopicにスキーマ情報が入ってるっぽいね。
ここに説明が書いてあった。
まとめ
Schema RegistryをDockerで起動して叩いてみて、その後UIを立ち上げて見てみた。って話でした。
今日はここまで。次は、Javaで書いたKafkaクライアントからどうやって使うかってところかな。