八、消息队列
1.消息队列:指保存消息的一个容器,本质是队列,但同时需要支持高吞吐、高并发,且高可用。
常见的消息队列有Kafka、RockerMQ、Pulsar、BMQ
2.使用kafka的步骤:
(1)首先创建一个Kakfa集群
(2)在集群中新建一个Topic,并且设置好分片数量
(3)引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法
(4)引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Poll方法
简要介绍一些基本的概念:
Topic:Kakfa的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对应的所有数据都会存储在这个topic中;
Cluster:Kakfa的物理集群,每个集群中可以新建多个不同的topic;
Consumer:消息的消费端,负责消费已经发送到topic中的消息;
Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐;
Offset:消息在partition内的相对位置信息,可以理解成唯一ID,在内部严格递增;
Replica:分片的副本,分布在不同的机器上,可用来容灾。
思考题一:如果消息量很大,网络带宽不够用怎么办?
-
压缩消息: 在发送消息之前进行压缩,以减少消息的大小。Kafka本身支持消息的压缩,你可以选择合适的压 缩算法来减少数据在网络中的传输量。
-
增加网络带宽: 如果你的网络带宽确实不足以支撑消息量,可以考虑升级网络基础设施,增加网络带宽以满足消息传输的需求。
-
限制生产者速率: 调整生产者发送消息的速率,避免过多的消息涌入队列。这可以通过调整生产者的发送频率或实现一定形式的流量控制来实现。
-
增加消费者数量: 如果消费者处理消息的速度比生产者发送的速度慢,可以增加消费者的数量,以加快消息处理的速度。这将分摊消息处理的负担,有助于减轻网络压力。
-
分区和分片: 在Kafka中,你可以使用分区和分片来并行处理消息。合理地设计分区和分片策略可以帮助你分散消息负载,从而更有效地利用网络带宽。
-
流量控制和调节: 在Kafka中,你可以通过调整生产者和消费者的配额来控制消息的流量。这可以帮助你在网络带宽不足时防止过多的消息涌入。
思考题二:如果发送一条消息,等到其成功后再发一条会怎么样?
如果发送一条消息后等待其成功后再发送下一条消息,会导致发送方的处理速度受到一定的限制,从而可能影响整体系统的性能和吞吐量。这种同步等待的方式可能会引发如下几个问题:
-
低吞吐量: 等待每条消息成功后再发送下一条消息会导致发送速率变慢,从而降低整体的消息吞吐量。这在高负载场景下可能导致系统无法达到预期的性能。
-
延迟增加: 由于每条消息都需要等待确认才能发送下一条消息,系统的总体延迟将增加。这可能影响实时性要求较高的应用。
-
资源利用不高: 在等待确认的时间内,发送方的资源(如CPU、内存等)可能得不到充分利用,从而造成资源浪费。
-
不适用于异步处理: 消息队列的优势之一是能够支持异步消息处理,即发送方发送消息后即可继续执行其他操作,而不必等待消息的最终处理结果。