为什么用?
异步,解耦,削锋
- 异步:放消息队列去做,自己可以同时做别的。
- 解耦:生产消费不用一起,各自分开。
- 削锋:短时间大量请求,去排队,一个个来。
难点?
- 多一个系统,可用性如何保障、
- 如何避免重复消费,保证消息幂等性(多次执行=一次执行)
解决方案
- 集群。一个坏了用另外的
- 用唯一id标识
常用MQ
ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ
ActiveMQ | RabbitMQ* | Kafka* | RocketMQ | ZeroMQ | |
---|---|---|---|---|---|
公司 | Apache | - | 阿里 to Apache | - | |
语言 | Java | Erlang | Scala | Java | C |
优点 | - | 性能好,可靠性高,管理界面丰富,社区活跃 | 高吞吐 | 性能非常好,接口易用 | 快 |
缺点 | - | Erlang语言二次开发难,接口使用难度大 | 可靠性低,无重试 | 界面部署CLI | - |
kafka
- Broker 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群
- Topic主题,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
- Producer 消息生产者,向Broker发送消息的客户端
- Consumer 消息消费者,从Broker读取消息的客户端
- ConsumerGroup 每个Consumer属于一个特定的Consumer Group,一条消息可以发送到多个不同的Consumer Group,但是一个Consumer Group中只能有一个Consumer能够消费该消息
- Partition物理上的概念,一个topic可以分为多个partition,每个partition内部是有序的
- 特点:
- 同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
- 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
- 分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
- 消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
支持online和offline的场景。
- 设计要点:
- 直接使用linux 文件系统的cache,来高效缓存数据。
- 采用linux Zero-Copy提高发送性能。传统的数据发送需要发送4次上下文切换,采用sendfile系统调用之后,数据直接在内核态交换,系统上下文切换减少为2次。根据测试结果,可以提高60%的数据发送性能。
- 数据在磁盘上存取代价为O(1)。kafka以topic来进行消息管理,每个topic包含多个part(ition),每个part对应一个逻辑log,有多个segment组成。每个segment中存储多条消息,消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。
- 显式分布式,即所有的producer、broker和consumer都会有多个,均为分布式的。Producer和broker之间没有负载均衡机制。broker和consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。
(参考https://blog.csdn.net/caisini_vc/article/details/48007297)
解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使用Kafka吗?
- Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。
- 不,不可能越过Zookeeper,直接联系Kafka broker。一旦Zookeeper停止工作,它就不能服务客户端请求。
- Zookeeper主要用于在集群中不同节点之间进行通信
-在Kafka中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取- 除此之外,它还执行其他活动,如: leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。
网友评论