kafka-消息队列
kafka简介
Apache Kafka 是一个开源的、高性能、高吞吐量的分布式流平台,又称为分布式消息队列中间件。它由LinkedIn开发并开源,旨在解决实时数据流处理中的挑战,如大规模数据的实时传输、高吞吐量和数据持久化等问题。Kafka采用分布式架构,消息被分布式存储在多个节点上,从而实现了高可用性和可伸缩性。其主要特点包括高性能、高吞吐量、持久性、水平扩展性和可靠性。Kafka被广泛应用于构建分布式消息队列、实时数据流处理、日志收集和监控等场景,成为了企业实时数据处理的重要工具。
Kafka 的基本概念
主题
主题是消息的逻辑容器,用于组织和分类相似类型的消息。
作用:
- 主题在 Kafka 中起到了类似于文件夹或者标签的作用,用于对消息进行逻辑上的归类和组织。
- 它使得生产者能够将消息发送到特定的主题中,而消费者可以订阅感兴趣的主题并处理其中的消息。
- 主题的存在使得 Kafka 具备了多种场景下的消息分发和处理能力,例如实时日志收集、事件驱动架构等。
特点:
- 主题具有高度的灵活性和可扩展性,可以根据需求动态创建和管理。
- 每个主题都有一个唯一的名称标识,用于在 Kafka 集群中进行识别和查找。
- 主题中的消息是有序的,并且可以根据需要保留一定时间或者大小的消息。
- Kafka 支持多个消费者组订阅同一个主题,从而实现了消息的广播和多播。
在 Kafka 中的使用:
-
生产者将消息发送到指定的主题中,可以根据业务需求选择不同的主题进行发送。
-
消费者通过订阅感兴趣的主题来获取消息,可以订阅一个或者多个主题。
-
Kafka 集群中的 Broker 负责管理和维护主题的元数据信息,包括分区的信息和副本的分布等。
-
分区是主题的组成部分,每个主题可以拥有多个分区,每个分区可以分布在不同的 Broker 上,从而实现了数据的分布式存储和处理。
消息队列
消息队列特征:顺序排列,按照先进先出方式进行消费;
通常在一个进程当中使用消息队列用来实现多线程环境下资源竞争的问题,通常这种临界资源太大,从而造成锁的粒度大,为了减小锁的粒度,将问题抽成一个一个的任务,而任务由消息来进行驱动;此时锁的粒度变为一个消息;
- 顺序排列和先进先出(FIFO)特性:
消息队列通常会按照消息到达的顺序进行排列,并且消费者会按照先进先出的方式来处理消息。这种特性确保了消息的顺序性,保证了消息的可靠性和一致性。 - 解决资源竞争的问题:
在多线程环境中,资源的竞争可能会导致性能下降或者死锁等问题。消息队列可以作为一个中介来解决资源竞争的问题,通过消息队列来协调和调度多个线程之间的任务执行,从而降低了线程之间的资源竞争。 - 降低锁的粒度:
当临界资源过大时,通常会造成锁的粒度过大,影响了并发性能。通过将问题分解成一个个的任务,并且使用消息队列来驱动任务的执行,可以将锁的粒度降低到一个消息级别,从而提高了并发性能。 - 任务驱动的消息处理:
消息队列可以作为任务的载体,将任务封装成消息,并通过消息队列来驱动任务的执行。这种方式可以将任务的执行和任务的调度解耦,提高了系统的可扩展性和灵活性。
消息队列中间组件
消息队列作为中间组件的时候,通常应用在分布式系统中;在分布式系统中,需要保证消息的持久化;同时还需要解决幂等性问题,所谓幂等性问题,网络抖动时,发送多次同样的数据,消息队列应该能进行过滤去重;并且也需要考虑乱序问题,能让consumer能顺序消费消息;
应用场景
异步通信:分布式系统中的各个组件可以通过消息队列异步地进行通信,从而解耦各个组件之间的依赖关系。这种方式可以提高系统的稳定性和可扩展性,同时降低系统的复杂度。
假设在注册流程中,填写资料,发送注册包,服务端接收验证,入库,并调用其他接口发送验证码或者邮件通知,再返回给客户端;
系统解耦 :分布式系统间可以通过 rpc 或者 采用 restful api 进行交互;但是由于这些系统间可能由不同的部门负责开发,这样无形间增加沟通成本,因为在这里形成了耦合,需要知道对方的接口以及参数;此时可以通过消息队列来进行解耦,无需关注对方实现,只负责安全的数据推送;
流量削峰: 消息队列可以用于平滑处理系统的高峰流量,通过将请求缓存到消息队列中,然后再按照系统处理能力逐渐消费,从而减轻系统的负载压力,提高系统的稳定性和性能。
日志收集和监控: 消息队列可以用于实时日志收集和监控,将系统产生的日志数据发送到消息队列中,然后再通过消费者消费并进行处理和存储,从而实现实时的日志分析和监控。
任务队列: 消息队列可以用作任务队列,将系统中的任务封装成消息,并发送到消息队列中,然后通过消费者进行消费和执行,从而实现任务的异步处理和调度。
生产消费模型
点对点:一个生产者生产一个消息到消息队列只有一个消费者消费;严格保证消息消费的顺序性;
订阅发布:消费者可以订阅一个或者多个topic,消费者可以消费该topic中所有消息;同一条消息可以被多个消费者组消费;