转载: https://blog.csdn.net/henlf/article/details/82085685
- https://blog.csdn.net/uniquecapo/article/details/79292965
- https://blog.csdn.net/yuan_xw/article/details/51210954
1 kafka 是什么
Apache kafka is a distributed streaming platform, 即官方定义 kafka 是一个分布式流式计算平台. 而在大部分企业开发人员中, 都是把 kafka 当成消息系统使用, 即它是一个分布式消息队列, 很少会使用 kafka 的流式计算. 它有四个关键概念:
topic
kafka 把收到的消息按 topic 进行分类, 因此可以理解为 topic 是一种类别
producer
往 kafka 发送消息的用户
consumer
接收 kafka 消息的用户
borker
kafka 集群可以由多个 kafka 实例组成, 每个实例 (server) 称为 broker
无论是 kafka broker 本身, 还是 producer 或者 consumer, 都依赖于 zookeeper 集群保存一些 meta 信息, 保证系统可用性, 以及使用 zookeeper 的选举机制.
2 消息队列实现原理
点对点模式
一对一, 消费者主动拉取数据, 消息收到后消息清除. 点对点模式通常是一个基于拉取或轮询的消息发送模型. 此模型中, 消费者从队列主动拉取信息, 而不是消息系统推送消息给消费者, 并且, 消息只能被一个且只有一个消费者接收处理, 即使有多个消息监听者也是如此.
发布订阅模式
一对多, 数据生产后, 推送给所有订阅者. 发布订阅模型则是一个基于推送的消息传送模型. 发布订阅模型可以有多种不同的订阅者, 临时订阅者只在主动监听主题时才接收消息, 而持久订阅者则监听主题的所有消息, 即使当前订阅者不可用, 处于离线状态.
3 消息队列的作用
3 消息队列的作用
解耦
服务与服务之间不需要紧密结合, 可以独立扩展, 只要确保它们遵守一致的数据结构定义. 也可以作为一种异步的实现方式.
冗余
消息队列把数据持久化直到它明确被处理, 通过这一方式规避了数据丢失的风险. 许多消息队列采用的 "插入 - 获取 - 删除" 范式中, 在把一个消息从队列中删除之前, 需要你的处理系统明确的指出该消息已经被处理完毕, 从而确保你的数据被安全的保存直到你使用完毕.
扩展性
因为消息队列解耦了你的处理过程, 所以增大消息入队和处理的频率是很容易的, 只要另外增加处理过程即可.
灵活性 & 峰值处理能力
在访问量剧增的情况下, 应用仍然需要继续发挥作用, 但是这样的突发流量并不常见. 如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费. 使用消息队列能够使关键组件顶住突发的访问压力, 而不会因为突发的超负荷的请求而完全崩溃
顺序保证
在大多使用场景下, 数据处理的顺序都很重要. 大部分消息队列本来就是排序的, 并且能保证数据会按照特定的顺序来处理.(Kafka 保证一个 Partition 内的消息的有序性)
异步通信
很多时候, 用户不想也不需要立即处理消息. 消息队列提供了异步处理机制, 允许用户把一个消息放入队列, 但并不立即处理它. 想向队列中放入多少消息就放多少, 然后在需要的时候再去处理它们.
来源: http://www.bubuko.com/infodetail-3297062.html