掘金 后端 ( ) • 2024-05-15 18:35

theme: channing-cyan highlight: arduino-light

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!


Kafka与流式计算服务

对于流式计算服务来说,与 Apache Kafka 搭配能够带来诸多益处。因为 Stream Computing 从本质上来说,就是一种能够并行处理且易于扩展的分布式处理架构。它搭配同样具备并行读写能力且易于扩展的数据来源/数据汇,这样才能最大限度地发挥其效能。

Stream Computing 的处理过程对低延迟有着较高的要求,这更类似于队列的需求,而不是像日志聚合工具(如 Flume)那样的需求

Kafka与流式架构的奇妙关联

Kafka在实现Lambda架构中扮演着至关重要的角色,这是因为只有 Kafka 能够同时满足实时处理与批处理对数据源的要求。对于Stream Computing而言,Kafka 不仅仅可以充当数据源或数据汇,还能作为状态提交日志的同步工具。

Kafka与流式架构的紧密联系

Kafka通过精妙的算法和机制设计,分布式系统致力于实现数据的无缝流通、高效处理以及故障的快速恢复,确保整个系统如臂使指,灵活应对各种挑战。在其中主要有Partition(分区)和 Replication(复制)。 在这里插入图片描述

Partition(分区)

在探讨分布式系统的运作时,首当其冲的是“partition”(分区)这一关键要素,它恰似我们公司或者事业单位中的部门划分。为避免庞大的组织规模带来的管理难题,公司或者事业单位会将其划分为多个相对独立且能自主运作的部门,以分散处理和存储压力。

Replication(复制)

分布式系统中的“replication”(复制)机制,则如同公司或者事业单位中的“经理”或者“主管”。这些“经理”有的能迅速适应并承担部分工作负担,有的则主要作为备份存在,确保数据的安全性和可靠性。

存在的问题

但不可否认的是,也有一些“经理或主管”在初始阶段可能并未完全融入系统,未能发挥其应有的作用。那么,如何将这些各具特色、相对独立的“部门”或“经理”有效地整合起来,形成一个高效、协同的整体,正是分布式系统所要解决的核心问题。

分布式组件类比生活工具

在分布式架构的宏伟画卷中,Zookeeper 无疑扮演着一个举足轻重的角色,宛如一位专业且值得信赖的协调者,以其独特的方式充当着组织间不可或缺的通告栏。它不仅仅是一个简单的数据同步工具,更是确保各方数据维持一致性的关键枢纽。

Zookeeper(通告栏)

Zookeeper 的运作机制精巧而高效,它通过建立和维护一个高度可靠且一致性的环境,使得分布式系统中的各个组件能够实时、准确地获取并响应信息。这种机制类似于一个精心管理的通告栏,不仅确保了信息的及时传达,还通过其强大的协调功能,确保了组织内部各项工作的顺利进行。 在这里插入图片描述 Zookeeper以其卓越的责任感,始终坚守岗位,宛如一位忠实的守护者。你只需向其明确表达你的关注焦点,一旦相关通告内容有任何更新,它便会主动向你传递最新的信息,确保你始终与关键动态保持同步。

Kafka(物流站点)

Kafka宛如一座高度专业化的物流枢纽,以其卓越的效能促进单位之间信息的无缝流转。然而,与某些主动通知的系统不同,Kafka并不会主动告知你信息的抵达,而是需要你如同查询物流状态一般,主动前往检查并获取最新的数据流信息。 在这里插入图片描述 Kafka具备出色的历史信息保留功能。因此,只要你不过度延迟检查资料箱的时间,你通常都能够轻松地找回并获取那些宝贵的历史信息。这种功能为用户提供了极大的便利性和灵活性,确保信息的安全性和可追溯性。

分布式服务的内存计算

受益于内存性价比的日益提高,越来越多的厂商推出了内存计算的解决方案。然而,所谓的内存计算与当前已知的运算方式究竟存在哪些差异呢?实际上,目前所有的运算也都是将数据放入内存层次结构中才能进行运算的呀。 在这里插入图片描述

内存存储-数据持久化

内存计算主要是将内存当作磁盘,这样可以省去将数据从内存持久化到磁盘的过程。除非需要进行恢复,否则也无需从磁盘读取数据。因为磁盘和内存的速度存在多个数量级的差距,但同时也会受到内存大小的限制,必须思考解决之道。

内存存储-数据压缩

内存计算解决方案大多会强调数据压缩能力,以便能将更多数据存储在内存中。有些解决方案还强调它们能够更有效地利用 CPU,比如降低缓存未命中、减少锁竞争用等,因为瓶颈已经不再局限于 I/O 了,所以需要让 CPU 能够更高效地运行。

分布式计算系统

分布式计算系统,大数据系统中的Hadoop无疑是大家最为熟知的。然而,Hadoop主要是为了处理高吞吐量的批次应用而设计的,在延迟(latency)方面相对不太重视。如果需要处理低延迟应用,那么使用 Hadoop 就不太合适了。 在这里插入图片描述

并行计算处理系统

Hadoop 属于典型的数据并行(Data parallelism),即将数据分割成小块,每一块进行平行处理以提高处理效率。当然,这种数据平行化的理念,你也可以自行将数据分布在多台机器上,通过多线程/多进程在多机上实现。 在这里插入图片描述 当现有的系统架构或处理流程仍然无法满足严格的延迟要求时,引入流水线(pipeline)处理机制便成为了一种值得考虑的优化策略。流水线处理通过并行化和连续性的操作序列,能够显著提升数据处理的速度和效率,从而有效降低延迟,确保系统能够满足更为严格的时间性能要求。

流式计算处理系统

在采用流水线处理机制时,关键在于将整个计算流程精细划分为多个有序的步骤。这些步骤如同流水线上的工作站,确保上一步骤处理完毕的单条数据能够迅速、无缝地传递至下一步骤进行后续处理。这种处理方式形象地模拟了水流的自然流动,数据在流水线中流畅地向下传递。 在这里插入图片描述 而流计算(Stream Computing)作为一种更为复杂的技术,它不仅融合了数据并行处理的强大能力,还集成了流水线处理的连贯性和高效性。通过流计算,我们可以实时地对数据流进行捕获、分析和处理,满足了对数据处理的实时性和高效性的双重需求。

分布式计算系统的通信方式

分布式处理系统在处理进程间通信(Inter-Process Communication, IPC)时,通常采用两种主要方式。在这里插入图片描述

共享内存(Shared Memory)

共享内存允许多个进程访问同一块内存区域,从而直接交换数据,类似于一块公共的白板。

当多个进程同时访问共享内存时,为了避免数据冲突和不一致性,通常需要使用锁定机制(如互斥锁、读写锁等)。然而,这种锁定机制会导致等待和排队现象,降低系统效率。

系统效率降低问题

为了提高共享内存的效率,一般我们会使用以下两种技术方式:

  • 乐观锁(Optimistic Locking):冲突很少发生,因此在每次读取数据时不进行锁定,而是在数据写入时进行版本检查和冲突处理。
  • 多版本控制(Multi-Version Concurrency Control, MVCC):在读多写少的时候,通过为每个数据项保留多个版本,来避免读写冲突,从而提高并发性能。

消息传递(Message Passing)

通过发送和接收消息的方式来实现进程间的数据交换,每个进程都拥有独立的地址空间,通过操作系统提供的消息队列、套接字等机制进行通信。

缺乏全局顺序保证

分布式系统或多个处理器并行的环境中,无法保证消息按照发送的顺序被接收和处理。这可能导致数据不一致性和难以调试的问题

  • 设计特定的通信协议来确保消息的顺序性:可以通过时间戳、序列号等机制来追踪和排序消息,从而在一定程度上恢复全局顺序。

  • 使用分布式事务管理来协调多个进程之间的操作:确保数据的一致性和完整性。

流式计算的应用范围

流式计算的核心优势在于其高效处理海量实时事件的能力,这一特性使其在众多领域得到广泛应用。

  • 活动分析(Activity Analysis):通过分析用户在网站上的浏览和点击行为,系统能够即时提供个性化的推荐和服务,极大地提升了用户体验。

  • 告警(Alert)系统:它能够实时监控和分析系统日志,一旦发现异常情况或潜在问题,便能够立即向管理者发送告警通知,确保问题得到及时解决,防止故障进一步扩大。

  • 金融领域的欺诈检测(Fraud Detection):通过实时比对多个来源的数据,系统能够迅速分析交易行为是否存在欺诈嫌疑,从而在欺诈行为发生时尽早干预,降低企业的经济损失。

  • 实时扣款(Real-time Debiting):流式计算的一个重要应用,尤其在用户规模庞大的场景中显得尤为关键。

流式计算的特点

流式计算专为追求低延迟(low-latency)的应用场景而设计。与批量处理(batch processing)不同,批量处理通常需要等待整批数据全部处理完成后才能统一输出,这可能导致不必要的延迟,类似于团队旅游中等待行动较慢的游客而影响整体行程进度。

为了显著减少这种延迟,流式计算将数据处理粒度细化至记录(record)级别,并将处理过程分解为多个阶段。通过采用流水线(pipeline)的处理方式,一旦某个阶段的记录处理完成,即可立即进入下一阶段进行后续处理。这种高效的处理机制极大地降低了延迟,确保数据能够实时、快速地得到处理。

吞吐量VS实时性

尽管实时处理的方式能够带来极高的响应性和数据处理的即时性,但这种处理方式往往伴随着资料传递量的增加,这直接导致了系统throughput(吞吐量)相较于传统的批处理(batch processing)模式有所下降。

总结介绍

在分布式系统中,这种用效率换取可扩展性,再用可扩展性来弥补效率损失的策略相当普遍。它允许系统在面对不同规模和复杂度的数据处理任务时,都能保持高效和稳定的性能。通过这种方式,流式计算框架不仅能够在实时性上满足需求,还能够在处理大规模数据流时保持高吞吐量,从而在各种应用场景中都能展现出强大的竞争力。