初探消息中间件Kafka、ActiveMQ、RabbitMQ、RocketMQ的优缺点

我们在开发软件的时候,经常会用到消息队列,凭借其自身的特点,可以在满足业务需求的前提下,一定程度上系统的抗压性,但是消息队列使用不当或者是选择不当,效果可能不会那么好,所以我们有必要了解消息队列的优缺点。

1、优点:解耦、异步、削峰

解耦:解除俩个系统的耦合度,凭借中间层,减少俩个系统直接调用的耦合度。

异步:系统直接的调用由同步变成了异步,例如系统A、B、C,系统生产的消息不仅可以提供给B系统,还可以扩展到C系统,我生产者A不需要修改代码逻辑,只负责生产消息,而且生产者不关心你是否有没有消费、啥时候消费;而消费B和C,我们只需要订阅生产的消息,到时候消费消息即可,有消息就消费。

削峰:当流量出现急剧上升,系统的处理能力达到瓶颈的时候,通过消息队列,逐渐放行消息,减缓系统的处理频率,从而不至于将系统的CPU耗尽,从而使请求依次处理,达到削峰效果。

但是消息队列也存在一些缺点

2、缺点:系统可用性降低、系统复杂度提高、数据一致性等问题

  系统可用性降级:既然在系统中引入第三方,就像是婚姻中引入第三者一样,你要处理好家庭和第三者之间的平衡,否者家庭系统就会崩塌,其实系统也是如此,如果消息中间件宕机,或者中间件出现网络波动等异常情况,下面的消费者系统就会出现数据异常,如果系统中只有AB系统,可能这样的问题不会发生或者发生的频率很低,但是消息中间件从当中间层,我们需要关注的系统多了一个。

系统复杂度提高:这个很好理解,以前由系统A、B、C组成,现在变成A、B、C、消息中间件组成,要考虑消息中间件的一系列问题,如高可用、异常情况等。

数据一致性问题:如果消息中间件出现当机,消费者无法成功消费消息,导致消息遗漏,从而发生消息不一致的问题。

3、我们经常用到的消息队列有一下几种:Kafka、ActiveMQ、RabbitMQ、RocketMQ,下图为各自的特点:

特性ActiveMQRabbitMQRocketMQKafka
单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级同 ActiveMQ10 万级,支撑高吞吐10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响  topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topictopic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性ms 级微秒级,这是 RabbitMQ 的一大特点,延迟最低ms 级延迟在 ms 级以内
可用性高,基于主从架构实现高可用同 ActiveMQ非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性有较低的概率丢失数据基本不丢经过参数优化配置,可以做到 0 丢失同 RocketMQ
功能支持MQ 领域的功能极其完备基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

4、高可用框架

1)Kafka

         Kafka基本框架是由多个broker组成,一个broker也就是一个节点。当创建一个主题Topic,会将Topic分成多个partition,一个partition分布在一个broker,Kafka在8.0对框架进行优化,支持复制,即每个broker可以复制多个,由选举产生leader,假如leader宕机后,从存活的follower中选举出leader,保证了系统的高可用。消费者读消息直接读leader,生产者生产消息即对消息队列写,操作leader,leader在同步到follower,保持leader的数据与followew保持一致。

2)RabbitMQ

        RabbitMQ的HA框架是由多个RabbitMQ实例组层,也就是部署多个相同的RabbitMQ,当创建一个queue,不论是元数据还是queue中的数据都会存在多个实例上;用户没次写queue,RabbitMQ都会将数据同步到其他实例上。优点是假如某个实例宕机了,没关系,其他实例还存在相同的数据,进而实现了HA。缺点是,我没次写入的数据都会同步到其他实例上,将导致网络带宽压力和消耗很大以及它的框架不是分布式的,扩展性很差,假如某个queue很大,你加机器也解决不了,它还会将该queue同步到新加的机器上,如果这个queue大到你服务器无法存下的程度了,那就很危险了。

5、Kafka实现高吞吐量的机制:

1)吞吐量:单位时间内发送的数据量。

2)高吞吐量--》尽量少垃圾回收或者不对该部分内存进行gc + 足够大的内存--》kafka采用缓存池机制。

3)客户端发送数据,先到kafka缓冲中,多条数据组成一个Batch或多个Batch发送给kafka服务器。

4)缓冲池机制:将整个内存分成若干个大小相同的内存块,如果需要创建一个新的Batch,则从缓冲池中拿出一块内存,一个或者多个Batch发送给kafka服务器后,该Batch内存归还给缓冲池。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值