为什么需要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例子:

  1. {
  2. "type": "record",
  3. "namespace": "com.aaa",
  4. "name": "Employee",
  5. "fields": [
  6. { "name": "id", "type": "string"},
  7. { "name": "first_name", "type": "string", "default": ""},
  8. { "name": "last_name", "type": "string", "default":""}
  9. ]
  10. }

Enum

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

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

一个枚举例子:

  1. {
  2. "type": "enum",
  3. "name": "customer_status",
  4. "symbols": [
  5. "BRONZE",
  6. "SILVER",
  7. "GOLD"
  8. ]
  9. }

Array

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

items:数组元素的schema

一个数组例子:

  1. {
  2. "name": "email",
  3. "type": "array",
  4. "items": "string"
  5. }

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例子:

  1. {
  2. "name": "secrets",
  3. "type": "map",
  4. "values": "long"
  5. }

Union

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

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

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

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

Apache Avro & Avro Schema简介的更多相关文章

  1. apache基金会开源项目简介

    apache基金会开源项目简介   项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache  Abdera项目的目标是建立一个功能完备,高效能的IETF ...

  2. cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)

    由于没有仔细查看官方提供的文档,由jdk版本不一致导致的出错: http://cxf.apache.org/cxf-316-release-notes.html 自己使用的是jdk1.8. 报Exce ...

  3. java.lang.IllegalArgumentException: No enum constant org.apache.ws.commons.schema.XmlSchemaForm.

    一次系统断电维护之后,apache cxf 的 web service 接口调用一直报错: java.lang.IllegalArgumentException: No enum constant o ...

  4. apache commons Java包简介

    更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...

  5. XML Schema 简介

    XML Schema 是基于 XML 的 DTD 替代者. XML Schema 可描述 XML 文档的结构. XML Schema 语言也可作为 XSD(XML Schema Definition) ...

  6. Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  7. [转帖] 学习一下 apache bench 的总结简介 ( LAMP的没用过..)

    PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...

  8. 转载:Apache commons开源工具简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  9. DTD 和 Schema简介

    什么是DTD? DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. 它使用一系列的合法元素来定义文档结构. DTD例子 <?xml version="1.0"? ...

随机推荐

  1. mermaid使用简介(画论文插图的一种解决方案)

    官方IO: https://mermaid-js.github.io/mermaid/#/ 官方对mermaid的简介是这样的:Markdownish syntax for generating fl ...

  2. MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理

    在网上找到了这篇讲述MAC地址,ARP协议和路由表的文章,如获至宝.一篇文章把组网中的相关概念讲的明明白白. 原文是发布在51cto博客上,但不知道为什么点进去却是404.让我没想到的是这个技术论坛上 ...

  3. Zookeeper——基本使用以及应用场景(手写实现分布式锁和rpc框架)

    文章目录 Zookeeper的基本使用 Zookeeper单机部署 Zookeeper集群搭建 JavaAPI的使用 Zookeeper的应用场景 分布式锁的实现 独享锁 可重入锁 实现RPC框架 基 ...

  4. Jmeter(十一) - 从入门到精通 - JMeter逻辑控制器 - 下篇(详解教程)

    1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”. 意思 ...

  5. 一时技痒,撸了个动态线程池,源码放Github了

    阐述背景 线程池在日常工作中用的还挺多,当需要异步,批量处理一些任务的时候我们会定义一个线程池来处理. 在使用线程池的过程中有一些问题,下面简单介绍下之前遇到的一些问题. 场景一:实现一些批量处理数据 ...

  6. 08.DRF-反序列化

    三.反序列化使用 3.1 验证 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象. 在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功 ...

  7. Python中用OpenPyXL处理Excel表格 - 单元格格式设置

    官方文档: http://openpyxl.readthedocs.io/en/default/ OpenPyXL库 --单元格样式设置 单元格样式的控制,依赖openpyxl.style包,其中定义 ...

  8. 【String注解驱动开发】你了解@PostConstruct注解和@PreDestroy注解吗?

    写在前面 在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!& ...

  9. SpringBoot2.x入门:快速创建一个SpringBoot应用

    前提 这篇文章是<SpringBoot2.x入门>专辑的第2篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 常规的套路会建议使用Spring官方提 ...

  10. 问题 C: 最短路径

    问题 C: 最短路径 在洛谷上刷最短路的题然后被老师拉回去做算法笔记上面的题... 拿到这道题,先确定所有路径唯一,然后是无向边,那么对于边权处理,直接赋值为2的k次方就可以了,然后直接跑最短路. 这 ...