分布式消息队列 Message Queue(MQ)

为什么用?

异步,解耦,削锋

  • 异步:放消息队列去做,自己可以同时做别的。
  • 解耦:生产消费不用一起,各自分开。
  • 削锋:短时间大量请求,去排队,一个个来。

难点?

  1. 多一个系统,可用性如何保障、
  2. 如何避免重复消费,保证消息幂等性(多次执行=一次执行)

解决方案

  1. 集群。一个坏了用另外的
  2. 用唯一id标识

常用MQ

ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ

ActiveMQ RabbitMQ* Kafka* RocketMQ ZeroMQ
公司 Apache - LinkedIn 阿里 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内部是有序的
  • 特点
  1. 同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
  2. 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
  3. 分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
  4. 消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
    支持online和offline的场景。
  • 设计要点
  1. 直接使用linux 文件系统的cache,来高效缓存数据。
  2. 采用linux Zero-Copy提高发送性能。传统的数据发送需要发送4次上下文切换,采用sendfile系统调用之后,数据直接在内核态交换,系统上下文切换减少为2次。根据测试结果,可以提高60%的数据发送性能。
  3. 数据在磁盘上存取代价为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。
  4. 显式分布式,即所有的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检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。

你可能感兴趣的:(分布式消息队列 Message Queue(MQ))