• Apache Avro & Avro Schema简介


    为什么需要schema registry?

    首先我们知道:

    • Kafka将字节作为输入并发布
    • 没有数据验证

    但是:

    • 如果Producer发送了bad data怎么办?
    • 如果字段被重命名怎么办?
    • 如果数据类型改变了怎么办?

    这些情况都会导致consumer break

    所以:

    • 我们需要数据能够自我描述
    • 我们需要能够在不破坏下游消费者的情况下演化数据
    • 能够拒绝坏数据

    为什么不在kafka broker收到消息时验证消息,而是使用schema registry?

    由下面两幅图可以看到,schema registry是独立于kafka的一个组件。

    Kafka Core:

     

    Confluent Components -Schema Registry:

     

    为什么schema registry不集成在kafka broker,因为这样会打破kafka一些优秀的特性:

    • Kafka不解析或读取你的数据(没有使用CPU)
    • Kafka将字节作为输入,而不需要事件将它们加载到内存中(称为零拷贝) 。什么是零拷贝,移步至https://www.cnblogs.com/fangjb/p/13271886.html
    • 就Kafka而言,它甚至不知道你的数据是否是整数或是字符串。

    所以:

    • Schema Registry需要是独立的组件
    • 生产者和消费者需要能够与之对话
    • 必须商定通用的数据格式
    • 它需要支持schema
    • 它需要支持进化
    • 它需要是轻量级的

    Solution:

    Confluent Schema Registry

    Apache Avro as the data format

    Apache Avro& Avro Schema介绍

    • Apache Avro是一个数据序列化系统。
    • 可以将Avro看作是JSON附带一个schema
    • Avro schema使用Json来定义
    • Avro依赖于schema

    Avro优点:

    1.丰富的数据结构

    2.使用快速的压缩二进制数据格式

    3.schema随数据一起出现

    4.schema可以以安全的方式随时间进化(schema evolution)

    5. Document嵌入到schema中

    Avro缺点:

    1.某些语言对Avro的支持可能缺乏

    2.不使用avro工具就不能“打印”数据(因为压缩了和序列化)

    数据类型

    Schema 定义了基本数据类型和复杂数据类型,其中复杂数据类型包含不同属性。通过各种数据类型用户可以自定义丰富的数据结构

    基本类型:

    类型

    含义

    null

    没有值

    boolean

    布尔值

    int

    32位有符号整数

    long

    64位有符号整数

    float

    单精度(32位)的IEEE 754浮点数

    double

    双精度(64位)的IEEE 754浮点数

    bytes

    8位无符号字节序列

    string

    字符串

     

    复杂类型

    Avro提供了6种复杂类型。分别是Record,Enum,Array,Map,Union和Fixed。

     

    Record类型:

    Record类型使用的类型名字是 “record”,还支持其它属性的设置:

    • name(必填):record类型的名字
    • namespace:命名空间(可选),相当于java中的包名
    • doc:这个类型的文档说明(可选)
    • aliases:record类型的别名,是个字符串数组(可选)
    • fields(必填):record类型中的字段,是个对象数组。每个字段需要以下属性:
    • name(必填):字段名字
    • doc:字段说明文档(可选)
    • type(必填):一个schema的json对象或者一个类型名字
    • default:默认值(可选)
    • order:排序(可选),只有3个值ascending(默认),descending或ignore
    • aliases:别名,字符串数组(可选)

     一个record例子:

    {
            "type": "record",
            "namespace": "com.aaa",
            "name": "Employee",
            "fields": [
              { "name": "id", "type": "string"},
              { "name": "first_name", "type": "string", "default": ""},
              { "name": "last_name", "type": "string", "default":""}
            ]
       }

     

    Enum

    枚举类型的类型名字是”enum”,还支持其它属性的设置:

    • name:枚举类型的名字(必填)
    • namespace:命名空间(可选)
    • aliases:字符串数组,别名(可选)
    • doc:说明文档(可选)
    • symbols:字符串数组,所有的枚举值(必填),不允许重复数据。

    一个枚举例子:

    {
      "type": "enum",
      "name": "customer_status",
      "symbols": [
        "BRONZE",
        "SILVER",
        "GOLD"
      ]
    }

     

    Array

    数组类型的类型名字是”array”并且只支持一个属性:

    items:数组元素的schema

    一个数组例子:

    {
        "name": "email", 
        "type": "array", 
        "items": "string"
    }

     

    Map

    Map是一种定义keys和values列表的方法,其中keys是字符串.

    Example: secrets questions

    • “What’s your favourite color?”: “green”
    • “Where were you born?”: “Tapei”
    • “Who you love most?”: “My wife”

     

    Map类型的类型名字是”map”并且只支持一个属性:

    values:map值的schema

    Map的key必须是字符串。

    一个Map例子:

    {
        "name": "secrets",
        "type": "map", 
        "values": "long"
    }

     

    Union

    组合类型,表示各种类型的组合,使用数组进行组合。比如[“null”, “string”]表示类型可以为null或者string。

    组合类型的默认值是组合类型的第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型的默认值就是null。

    组合类型中不允许同一种类型的元素的个数不会超过1个,除了record,fixed和enum。比如组合类中有2个array类型或者2个map类型,这是不允许的。

    组合类型不允许嵌套组合类型

  • 相关阅读:
    Android拍照、摄像方向旋转的问题 代码具体解释
    Java 实现桥接(Bridge)模式
    C++标准I/O库:iostream, fstream, sstringstream
    Android 使用 DownloadManager 管理系统下载任务的方法
    JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
    使用c++的cocos2d-x-3.0rc1程序公布apk
    UVA 146 ID Codes(下一个排列)
    C/C++:C++伪函数
    开源项目AndroidUtil-採用Fragment实现TabHost
    系统编程是什么
  • 原文地址:https://www.cnblogs.com/fangjb/p/13305433.html
Copyright © 2020-2023  润新知