一个程序猿的奋斗史

【kafka学习笔记】了解消息队列

2022-02-17  本文已影响0人  快乐的提千万

kafka是什么

你可以将它作为消息队列使用,点对点或者发布订阅的模式都可以。

你也可以将它作为消息引擎使用,实现信息流的管理。

总之,他是传递消息的一个工具。

那么,我们首先要知道的问题就是:

下面我们慢慢来看。

什么是消息队列

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。
消息在被处理和删除之前一直存储在队列上。
每条消息仅可被一位用户处理一次。
消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

image

只要是用队列的形式将消息临时存储起来,然后一边写,一边读,就可以看做是个消息队列。
写入的一方我们成为生产者,读取的一端我们成为消费者

消息队列有两种模式:点对点(一对一)和发布订阅(一对多或多对多)。

为什么要使用消息队列

  1. 削峰填谷

这个可能是使用最多的情况。当上游的流量冲击过大, 想要不被打垮,要么抛弃这些流量,要么存储这些流量。很显然,存起来在大多数时候是更好地选择,注意这里是大多数,有时候一些具有时效性的场景,抛弃可能反而更好。

将流量存起来,在空闲的时候慢慢消费,缓冲上下游的瞬时突发流量,使其更平滑,增加系统的可用性,这就是削峰填谷。

  1. 解耦

通常我们的代码是存在调用链的,如果是一个单体里面,直接函数调用,等待返回就好了。但是在分布式、微服务中,我们可能不知道上下游的改动或者可靠性。

举个例子,A服务产生了一个事件,比如注册,调用了BCD三个服务,比如发短信、初始化用户缓存等操作。那么问题就来了:

如果我们使用发布订阅模型,将它们解耦,A只用发布消息,BCD去订阅消息,添加E只要它去添加订阅即可。A不用关心消费者的速度或者是否存在,消息的存储由消息队列负责,等它们自己重启了再去消费即可。

  1. 异步

和解耦的案例很像,我们可以将ABCD这种顺序执行的事情改成A发完消息后就返回,BCD自己异步消费的模式,这样就使得A不用被不重要的事情拖慢处理速度。

消息队列的缺点

程序的世界是没有银弹的,凡事有利必然有弊。

消息队列的三大难题:

这三个会在后面的篇章里面单独讲,因为每一个都有难度。

还有个比较简单的问题:消息积压。

消息队列也只是添加了一个池子,仿佛三峡大坝,也是有上限的。当它快承受不了的时候,我们成为消息积压。
解决起来比较简单:

消息队列的两种模型 Pull VS Push

Pull模式即消费者自己拉取,这样做的好处是消费者可以决定自己的速度。缺点是消费者需要轮训有没有新消息,如果消费者太慢,可能会反压上游。

Push模式就比较粗暴了,和发短信一样,直接消息队列推送,并不会管消费者的死活。这种方式显而易见会导致消息丢失,但是好处就是消息队列压力很小。


image

现在还有人用Redis写消息队列么?

答案是有的。虽然市面上已经有很多消息队列的程序,但是最简单的,还是Redis。

先说好处吧:

可以说这两点就足以秒杀千言万语了,事实上,在业务量不大的时候,它不失为一种选择。

可它的缺点也很致命:

kafka登场

既然Redis不靠谱,我们就要选择一个靠谱的。kafka当然只是一种选择,隔壁的RabbitMQ一样优秀。

kafka的优势

Kafka 的使用场景

结语

好了,先说这么多,下一章开始了解kafka的基本概念,如果你喜欢的话帮忙点赞一下,你的支持是我最大的动力。

上一篇下一篇

猜你喜欢

热点阅读