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


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

640?wx_fmt=gif

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

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

实际上是从一个点移动到另一个点的数据序列,但它们是按需计算的。因此,它们至少有一个源,比如数组、列表、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();

640?wx_fmt=png

有些人可能认为过滤器会在每个元素上运行,然后首先找到,正如我所说的: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运行时将划分为多个子流。聚合操作迭代并并行处理这些子,然后组合结果。

640?wx_fmt=png


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

640?wx_fmt=png   Apache Kafka

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

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

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

  • 记录发生时处理流。

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

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

640?wx_fmt=jpeg


640?wx_fmt=png  Amazon Kinesis

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

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

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

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

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

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

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

640?wx_fmt=png

640?wx_fmt=gif

总结

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

640?wx_fmt=jpeg

长按二维码 ▲

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值