Spring Cloud Data Flow 介绍
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
特点
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
架构
Spring cloud data flow 简化了应用程序的开发和部署 将精力集中到数据处理的用例上
主要的架构概念在 应用程序、data flow 服务器和目标运行环境上
应用程序有两个特点:
- 1
- 2
- 3
取决于运行环境,应用程序可以有两种打包方式
- 1
- 2
- 3
运行环境支持:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Local Server for development
- 1
- 2
- 3
- 4
Server主要职能
1.stream DSL(领域特定语言)用来描述多个应用数据流的流转逻辑
2.部署清单 用来描述应用程序在运行环境的映射(初始化实例数量,内存配置,数据分区)
多个应用之间的交互是通过消息来实现的
支持的消息中间件:
1.Apache Kafka
2.RabbitMQ
微服务的架构风格
- Data flow server部署应用程序到目标运行环境遵从一致的微服务架构风格。
- 举例来说,流应用代表了高级别的应用程序 它由多个分别运行在自己进程的小微服务程序组成。每个微独 立于其他微服务进行扩展或者缩减,每个服务有自己的版本控制生命周期
- Streaming 和 task都是基于微服务将spring boot作为基础类库。它让所有的微服务都支持像健康检查,安全,可配置日志,监控和管理以及打包可执行JAR包
对比其他架构平台:
- Spring Cloud Data Flow的架构风格不同于其他流处理和批处理平台。例如Apache Spark,Apache Flink,和Google Cloud Dataflow 应用程序运行在特定的计算引擎集群里。
- 相比Spring Cloud Data Flow,这些计算引擎原生的给平台提供一个丰富的环境去执行复 杂的数据运算,但是在别的运行环境引入复杂性,往往是不需要的。这不意味着你用 Spring Cloud Data Flow 就不能做实时数据计算。
- 类似的,Apache Storm,Hortonworks DataFlow 和Spring Cloud Data Flow的前身,Spring XD,都指定了程序运行集群,每个产品的独特性,决定了你的代码要在平台上运行并进行健康检查确保长周期应用在运行失败的时候可以重新启动。通常,我们为了能正确的嵌入到集群执行框架需要实现框架指定接口。
流处理应用
- 然而Spring boot 为创建DevOps(开发运维)友好的微服务提供了基础,在spring生态系统中其他类库帮助我们创建基于微服务的流处理程序。其中特别重要的是Spring Cloud Stream。
-
Spring Cloud Stream 编程模型本质是为我们提供简单的方式去描述一个基于消息中间件的通讯的多输入输出应用程序。这些输入输出映射到kafka的topics 或者是 rabbitMq 的 exchange 和 queue上。通常程序配置会作为类库一部分提供一个source用来生成数据,一个process 用来消费和生产数据,一个sink来消费数据。
-
1.命令式编程模型
Spring Cloud Stream 是最紧密的整合了 Spring Integration 的命令事件模型。
这意味着你写代码去处理一个单一的事件回调- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在例子中字符串消息来自输入频道,传送到log方法,@EnableBinding 注解是 用来将外部消息中间件跟输入频道结合起来。
-
2.功能编程模型
Spring Cloud Stream 可以支持其他的编程风格。使用反应式api传入传出的数据被处理为持续的数据流,它还定义了如何去处理独立的消息。你也可以使用运算符去描述从入站到出战数据流的功能性转变。在未来的版本将会支持Apache Kafka的KStream API的编程模型。
-
流
- a)拓扑结构
Stream DSL 描述了系统中数据流转送的线性序列。例如,在stream定义中 http | transfomer | cassandra ,每一个管道符表示链接左右的应用程序.命名的频道可以用来路由或者分发数据到多个消息定义。 - b) 并发性
程序会消费事件,Spring Cloud Stream暴露一个并发性设置去控制用来派发传入消息的线程池的大小 - C) 分区
在数据处理中存在一个通用的模式,将程序间传送的数据进行分区。分区在状态式处理中是很重要的一个概念,无论是性能还是一致性的原因,都要保证所有相关数据在一块处理。
Spring Cloud Data Flow可以通过配置Spring Cloud Stream的输出输入的绑定来支持分区。Spring Cloud Stream 提供了一个通用的方式,用于将不同类型的中间件以统一的方式进行分区处理的用例。因此无论代理是否进行分区,都可以实现分区。
在Spring Cloud Data Flow中使用简单的分区策略,你只需要在部署stream的时候在stream中设置每个程序的实例数量和 partitionKeyExpression 生产者属性。partitionKeyExpression 识别在中间件上的消息的哪一部分用来作为key。一个数据抽取Stream可以定义成 http | averageprocessor | cassandra. 假定要发送给 http source的负载是一个json格式并且有一个字段名字叫 sensorId.用shell命令部署stream stream deploy ingest –propertiesFile ingestStream.properties 。内容为:
Deployer.http.count=3
Deployer.averageprocessor.count=2
app.http.producer.partitionKeyExpression=payload.sensorId
将会部署流,所有的数据按照配置的输入输出目标流过程序,而且保证独立的数据集合总是被运送到对应的average processor实例。
在这种情况下,默认算法是评估payload.sensorId%partitionCount,其中partitionCount是RabbitMQ的情况下的应用程序计数,以及Kafka情况下的主题的分区计数 - D) 消息交付保证
streams是由使用spring Cloud Steam类库作为与底层消息中间件通讯的基础的程序所组成的。Spring cloud stream 会提供多个供应商的消息中间件进行选择配置。
在spring cloud stream 中binder是对程序跟中间件链接的抽象。
对消费应用来说,在消息处理过程中产生异常会有一个重试的策略。
Spring cloud stream 还支持一个为kafka 和rabbitmq binder实现的配置项,会将失败的消息和堆栈踪迹发送到一个死信队列
其他的消息交付保证是由供生产消费应用选择的消息中间件提供的。
分析
- Spring Cloud Data Flow 了解到某些Sink应用程序会将计数数据写入到redis并且提供一个读取计数数据的REST端。计数器的类型支持:
- Counter 计数接收的消息数量,可选择的将计数数据记录到分离的仓库中例如redis
- Field Value Counter 计算消息有效内容中指定字段的唯一值得出现次数
- Aggregate counter 存储总计数而且还会记录每分钟 每小时 每天 每月的总计数
重要的是要注意,聚合计数器中使用的时间戳可以来自消息本身的一个字段,所以无序的消息也可以被统计
Task应用程序
Spring Cloud Task 编程模型提供:
- 1
- 2
- 3
- 4
- 5
Data Flow Server
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11