在这篇文章中,我将介绍Node.js和Java Streams以及Apache Kafka和Amazon Kinesis等工具,并简要概述每个工具,来说明啥是流处理!

数组是存储一系列值的数据结构。那么,一个流是一个数组吗?其实不是的。让我们看看流是什么,看看它是如何工作的吧。

首先,流不存储元素,数组存储元素。所以,流不是数组。此外,虽然集合和数组的大小是有限的,但流却没有。但是,如果流不存储元素,它怎么可能是元素序列呢?

流实际上是从一个点移动到另一个点的数据序列,但它们是按需计算的。因此,它们至少有一个源,比如数组、列表、I/O资源等等。让我们以一个文件为例:当一个文件被打开进行编辑时,它的全部或部分将保留在内存中,从而允许更改,因此只有当它被关闭时,才能保证不会丢失或损坏任何数据。

幸运的是,流可以逐块读/写数据,而不会立即缓冲整个文件。正如我们所了解的的,缓冲区是物理内存存储器(通常是RAM)的一个区域,用于在数据从一个地方移动到另一个地方时临时存储数据。

Node.js有四种流类型,值得一提:

  • 可写-数据可以写入的流(例如,写入文件,发送HTTP请求/响应)。

  • 可读-可以从中读取数据的流(例如,从文件中读取,接收HTTP请求/响应)。

  • 双工-可读和可写的流(例如,TCP套接字)。

  • 转换-可以在写入和读取数据时修改或转换数据的双工流(例如,zlib压缩文件)。

在流上操作并生成另一个流的函数称为过滤器,可以在管道中连接,如下所示:

Arrays.asList(10,3,13,4,1,52)    .stream()   .filter(number -> number % 2 == 0) //10,4,52   .sorted() //4,10,52 .skip(1) //10,52    .forEach(System.out::println); //prints 10 and prints 52    

谈到Java Streams,有趣的是它们提供了懒惰的特性。该Javadoc中说:

流操作分为中间(stream生成)操作和终端(值或副作用生成)操作。中间操作总是很懒惰的。

所以,如果我这样做:

List<Integer> numbers = Arrays.asList(10,3,13,4,1,52);
Stream<Integer> numberStream = numbers.stream()  .filter(number -> number % 2 == 0) //10,4,52   .sorted() //4,10,52 .skip(1) //10,52    .peek(System.out::println); //used to execute something while stream is processing  

流并没有执行,因为它足够的聪明,可以等待调用终端操作,如forEach、reduce、anyMatch等。除了具有声明性风格之外,它还足够智能,可以在满足终端操作时立即停止。例如:

Integer integer = Arrays.asList(10,3,13,4,1,52)  .stream()   .filter(number -> number % 2 == 0) .sorted()   .skip(1)    .peek(System.out::println) //it prints only 10 instead of 10 and 52 .findFirst().get(); 

由于上面的流上有sorted(),filter方法将在整个流上运行,但skip不会在整个筛选和排序的流上运行。让我们看看这个例子:

Integer integer = Arrays.asList(10,3,13,4,1,52)  .stream()   .filter(number -> number % 2 == 0) .findFirst().get();

有些人可能认为过滤器会在每个元素上运行,然后首先找到,正如我所说的:Java streams足够聪明。

Java streams的另一个有趣之处是parallel streams:

Arrays.asList(10,3,13,4,1,52,2,6,8)   .parallelStream()   .filter(number -> number % 2 == 0) .forEach(number -> System.out.println(Thread.currentThread())); //prints which thread is being executed

当流并行执行时,Java运行时将流划分为多个子流。聚合操作迭代并并行处理这些子流,然后组合结果。

既然您了解了流如何工作的概念,那么让我们来看一些工具。

 Apache Kafka

Kafka是一个分布式流数据处理平台,具有三个关键功能:

  • 发布和订阅记录流,类似于消息队列或企业消息系统。

  • 以容错、持久的方式存储记录流。

  • 记录发生时处理流。

其目的是实现流的实时处理,并支持使用Kafka Connect的许多数据源(如JDBC、ActiveMQ、REST API等)。一些用例包括:消息传递、网站活动跟踪、度量标准、日志聚合、流处理、事件源和提交日志。

下面是对使用Kafka Streams API的应用程序的剖析。它提供了包含多个流线程的Kafka Streams应用程序的逻辑视图,每个线程包含多个流任务。

 Amazon Kinesis

Amazon Kinesis是一个完全管理的Amazon Web服务(AWS),用于实时收集、处理和分析视频和数据流。Amazon展示了四种功能:

Kinesis视频流-捕获、处理和存储视频流。

Kinesis数据流-捕获、处理和存储数据流。

Kinesis数据Firehose-将数据流加载到AWS数据存储中。

Kinesis数据分析-使用标准SQL分析数据流。

其目的还在于实现流和某些用例的实时处理:构建视频分析应用程序、从批分析发展为实时分析、构建实时应用程序和分析物联网设备数据。

以下是Kinesis数据流通常的工作方式:

总结

这就是流的工作原理。在这篇文章里我们了解了一些关于Node.js流和Java Streams以及Apache Kafka和Amazon Kinesis等工具的信息,以及每个工具的概述。文章也有不妥之处,希望你们喜欢。

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

Java stream! Kafka steam!流式处理这么火!它究竟是个啥?相关推荐

  1. kafka处理流式数据_通过Apache Kafka集成流式传输大数据

    kafka处理流式数据 从实时过滤和处理大量数据,到将日志数据和度量数据记录到不同来源的集中处理程序中,Apache Kafka越来越多地集成到各种系统和解决方案中. 使用CData Sync ,可以 ...

  2. Apache Griffin+Flink+Kafka实现流式数据质量监控实战

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 八股文教给我,你们专心刷题和面试 Hi,我是王知无,一个大数据领域的原创作者. 放心关注我,获取更 ...

  3. KSQL:Apache Kafka的流式SQL

    更新:KSQL  现在可作为Confluent Platform的一个组件提供. 我很高兴地宣布KSQL,为Apache kafka流SQL引擎®.KSQL降低了流处理世界的入口,提供了一个简单而完全 ...

  4. Apache Kafka的流式SQL引擎——KSQL

    1. KSQL 介绍 KSQL 引擎--一个基于流的 SQL.推出 KSQL 是为了降低流式处理的门槛,为处理 Kafka 数据提供简单而完整的可交互式 SQL 接口.KSQL 目前可以支持多种流式操 ...

  5. Kafka Streams流式原理解析

    前言 本篇文章会从Kafka的核心流式计算原理进行分析,Kafka Streams Low-level processor API 和 核心概念,以及常见的应用场景分析 流式计算 通过业务场景去分析流 ...

  6. java中的steam流

      当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个"模型"步骤方案,然后再按照方案去执行它   这张图展示了过滤 映射 跳过 计数等多步 ...

  7. 浅析Java中的Steam流

    Stream流 文章目录 Stream流 1. 集合遍历 2. 流式思想 3. Stream流 3.1 概念 3.2 流的获取 3.3 forEach 3.4 filter 3.5 map 3.6 c ...

  8. Java:逐步读取/流式传输CSV文件

    我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但对于较大的文件来说是个问题 ...

  9. java jp2launcher.exe_FlowJO VX 流式分析软件安装包

    [实例简介] FlowJo V10 是目前最受欢迎的流式数据分析软件 [实例截图] [核心代码] 23ee3119-3f04-46b7-840a-a653ca76772c └── FlowJo VX ...

最新文章

  1. Flutter开发之HTTP网络请求:HttpClient(26)
  2. 解决IDEA中,maven依赖不自动补全的问题
  3. python使用字典格式化字符串-Python字符串格式化-学这些就够用了
  4. JavaScript-2(数组与字符串的方法)
  5. C++实现huffman哈夫曼编码的算法(附完整源码)
  6. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
  7. qt中new与delete使用示例
  8. RabbitMQ实现RPC
  9. maven依赖冲突解决_Maven依赖树–解决冲突
  10. pythonopencv算法_opencv python 光流法
  11. 雷神开机logo更改_Win10系统怎样更改开机logo
  12. 基于 arm 设计开发工具包的 Arm Cortex-M3 处理器设计(第二章:示例微处理器组成及各个Verilog文件功能及作用)
  13. iOS直播APP流程和相关技术介绍
  14. jdon的设计模式详细解读
  15. mac os监听扬声器、麦克风的音量、静音
  16. adams 绳索仿真
  17. Ant Design Vue DatePicker 日期选择框 限制可选时间
  18. 计算机的休眠和睡眠时间在那调,电脑休眠状态跟睡眠状态的区别及唤醒方法
  19. 算法的时间与空间复杂度(精细+举例)
  20. 人工智能(Machine Learning)—— 机器学习

热门文章

  1. 可持久化Trie +枚举 ---- P5795 [THUSC2015]异或运算
  2. [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]
  3. vue中常碰见的坑_Vue 与 Vuex 的第一次接触遇到的坑
  4. js如何实现扫描身份证识别_人脸识别是如何实现的
  5. CF498C Array and Operations(数论 + 最大流)
  6. python全栈简介_Python全栈(一)编程语言介绍
  7. html点击按钮删除session,删除sessionstorage
  8. linux init进程是所有用户进程的祖先进程,Linux中init进程介绍及常用方法
  9. 中国地图_铜板画地图铜地球仪高档办公室装饰用品定制铜版画地图中国地图世界地图定制惠风堂铜雕艺术...
  10. 瞎聊Spring Cloud