Schema Registryについて

昨日の続き。

bufferings.hatenablog.com

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版がある。

f:id:bufferings:20170626175453p:plain

Confluent: Apache Kafka & Streaming Platform for the Enterprise より

んで、Schema RegistryはそのOpen Source側にも含まれてる。

f:id:bufferings:20170626175925p:plain

Download Confluent Open Source & Confluent Enterprise より

ソースはこちら。Apache License 2.0ね。

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周りの色んなツールを提供してるみたいね。

Landoop | Kafka Web Tools

Schema Registry UIのソースはこち

GitHub - Landoop/schema-registry-ui: Web tool for Avro Schema Registry |

ライセンスはBSLってので、Kafkaのサーバーインスタンスが4台までは無料で使えるみたい。

http://www.landoop.com/bsl/

例によって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の内容が見られる。

f:id:bufferings:20170626182750p:plain

(∩´∀`)∩ワーイ

スキーマデータはKafkaに保存されてるっぽい

もういっこLandoopのツールで、Topicの中身を見れるツールを使って見てみたら、デフォルトで_schemaって名前のTopicにスキーマ情報が入ってるっぽいね。

f:id:bufferings:20170626184234p:plain

ここに説明が書いてあった。

Design Overview — Confluent Platform 3.2.2 documentation

まとめ

Schema RegistryをDockerで起動して叩いてみて、その後UIを立ち上げて見てみた。って話でした。

今日はここまで。次は、Javaで書いたKafkaクライアントからどうやって使うかってところかな。