在高并发业务场景下,典型的阿里双11秒杀等业务,消息队列中间件在流量削峰、解耦上有不可替代的作用。

之前介绍了消息队列的核心介绍,点击可参考:高并发架构系列:MQ消息队列的12点核心原理总结

今天我们一起来探讨:

  1. 市场上全量的消息队列究竟有哪些?
  2. 以及消息队列的优劣势比较。
  3. 以及什么样的业务场景选择哪类消息队列?

最全MQ消息队列有哪些

那么目前在业界有哪些比较知名的消息引擎呢?如下图所示

这里面几乎完全列举了当下比较知名的消息引擎,包括:

  1. ZeroMQ
  2. 推特的Distributedlog
  3. ActiveMQ:Apache旗下的老牌消息引擎
  4. RabbitMQ、Kafka:AMQP的默认实现。
  5. RocketMQ
  6. Artemis:Apache的ActiveMQ下的子项目
  7. Apollo:同样为Apache的ActiveMQ的子项目的号称下一代消息引擎
  8. 商业化的消息引擎IronMQ
  9. 以及实现了JMS(Java Message Service)标准的OpenMQ。

MQ消息队列的技术应用

1.解耦

解耦是消息队列要解决的最本质问题。

2.最终一致性

最终一致性指的是两个系统的状态保持一致,要么都成功,要么都失败

最终一致性不是消息队列的必备特性,但确实可以依靠消息队列来做最终一致性的事情。

2.广播

消息队列的基本功能之一是进行广播。

有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。

3.错峰与流控

典型的使用场景就是秒杀业务用于流量削峰场景。

由于篇幅的关系,本文重点介绍消息队列比较,详细应用场景请点击参考:高并发架构系列:什么是流量削峰?如何解决秒杀业务的削峰场景

最常用的MQ消息队列比较

Kafka大数据的杀手锏

谈到大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用,被LinkedIn,Uber, Twitter, Netflix等大公司所采纳,而storm,spark,flink等×××处理或批处理平台都有Kafka的相关插件支持。

Apache Kafka它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。

Kafka优点:

  1. 客户端语言丰富,支持java、.net、php、ruby、python、go等多种语言;
  2. 性能卓越,单机写入TPS约在百万条/秒,消息大小10个字节;
  3. 提供完全分布式架构, 并有replica机制, 拥有较高的可用性和可靠性, 理论上支持消息无限堆积;
  4. 支持批量操作;
  5. 消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;
  6. 有优秀的第三方Kafka Web管理界面Kafka-Manager;
  7. 在日志领域比较成熟,被多家公司和多个开源项目使用;

kafka缺点:

  1. Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长
  2. 使用短轮询方式,实时性取决于轮询间隔时间;
  3. 消费失败不支持重试;
  4. 支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
  5. 社区更新较慢;

RabbitMQ

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

使用RabbitMQ需要:

  • ErLang语言包
  • RabbitMQ安装包

RabbitMQ优点

  1. 由于erlang语言的特性,mq 性能较好,高并发;
  2. 健壮、稳定、易用、跨平台、支持多种语言、文档齐全;
  3. 有消息确认机制和持久化机制,可靠性高;
  4. 高度可定制的路由;
  5. 管理界面较丰富,在互联网公司也有较大规模的应用;
  6. 社区活跃度高;

RabbitMQ缺点:

  1. 尽管结合erlang语言本身的并发优势,性能较好,但是不利于做二次开发和维护;
  2. 实现了代理架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,但是使得其运行速度较慢,因为中央节点增加了延迟,消息封装后也比较大;
  3. 需要学习比较复杂的接口和协议,学习和维护成本较高;

RocketMQ

RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。

RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

使用RocketMQ需要:

  • Java JDK
  • 安装git、Maven
  • RocketMQ安装包

RocketMQ优点:

  1. 顺序性,它支持顺序性,可以做到局部有序,在单线程内使用该生产者发送的消息按照发送的顺序到达服务器并存储,并按照相同顺序被消费,但前提是这些消息发往同一服务器的同一个分区
  2. 实时性:采取长轮询+PULL消费消息,你可以自己决定如何在响应性和吞吐量之间做平衡,配合合理的参数设置来获得更高的响应时间,实时性不低于PUSH方式
  3. 提供了丰富的拉取模式
  4. 支持10亿级别的消息堆积,不会因为堆积导致性能下降
  5. 高效的订阅者水平扩展机制

RocketMQ缺点:

  1. 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
  2. RocketMQ社区关注度及成熟度也不及前两者;
  3. 没有web管理界面,提供了一个CLI(命令行界面)管理工具带来查询、管理和诊断各种问题;
  4. 没有在 mq 核心中去实现JMS等接口;

消息队列的业务场景选择

1.Kafka

Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。

是一个不折不扣的大数据通道,追求高吞吐,不过存在丢消息的可能。

2.RocketMQ

天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理,所以MQ的大量消息堆积功能就可以发挥作用。

RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。

3.RabbitMQ

RabbitMQ :结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。

最后,结合上面的介绍,简要总结如下:

1.中小型公司,建议选RabbitMQ,一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便,但是不利于做二次开发和维护。

所幸,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,推荐RabbitMQ。

2.大型公司,根据具体使用在rocketMq和kafka之间二选一。最后根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。


以上就是消息队列的选型与比较详解,更多Redis系列、Spring Cloud、Dubbo等微服务、MySQL数据库分库分表等高并发架构设计,具体请参考:
优知学院 2019-01-08 21:06:00

在高并发业务场景下,典型的阿里双11秒杀等业务,消息队列中间件在流量削峰、解耦上有不可替代的作用。

之前介绍了消息队列的核心介绍,点击可参考:高并发架构系列:MQ消息队列的12点核心原理总结

今天我们一起来探讨:

  1. 市场上全量的消息队列究竟有哪些?
  2. 以及消息队列的优劣势比较。
  3. 以及什么样的业务场景选择哪类消息队列?

最全MQ消息队列有哪些

那么目前在业界有哪些比较知名的消息引擎呢?如下图所示

这里面几乎完全列举了当下比较知名的消息引擎,包括:

  1. ZeroMQ
  2. 推特的Distributedlog
  3. ActiveMQ:Apache旗下的老牌消息引擎
  4. RabbitMQ、Kafka:AMQP的默认实现。
  5. RocketMQ
  6. Artemis:Apache的ActiveMQ下的子项目
  7. Apollo:同样为Apache的ActiveMQ的子项目的号称下一代消息引擎
  8. 商业化的消息引擎IronMQ
  9. 以及实现了JMS(Java Message Service)标准的OpenMQ。

MQ消息队列的技术应用

1.解耦

解耦是消息队列要解决的最本质问题。

2.最终一致性

最终一致性指的是两个系统的状态保持一致,要么都成功,要么都失败

最终一致性不是消息队列的必备特性,但确实可以依靠消息队列来做最终一致性的事情。

2.广播

消息队列的基本功能之一是进行广播。

有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。

3.错峰与流控

典型的使用场景就是秒杀业务用于流量削峰场景。

由于篇幅的关系,本文重点介绍消息队列比较,详细应用场景请点击参考:高并发架构系列:什么是流量削峰?如何解决秒杀业务的削峰场景

最常用的MQ消息队列比较

Kafka大数据的杀手锏

谈到大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用,被LinkedIn,Uber, Twitter, Netflix等大公司所采纳,而storm,spark,flink等×××处理或批处理平台都有Kafka的相关插件支持。

Apache Kafka它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。

Kafka优点:

  1. 客户端语言丰富,支持java、.net、php、ruby、python、go等多种语言;
  2. 性能卓越,单机写入TPS约在百万条/秒,消息大小10个字节;
  3. 提供完全分布式架构, 并有replica机制, 拥有较高的可用性和可靠性, 理论上支持消息无限堆积;
  4. 支持批量操作;
  5. 消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;
  6. 有优秀的第三方Kafka Web管理界面Kafka-Manager;
  7. 在日志领域比较成熟,被多家公司和多个开源项目使用;

kafka缺点:

  1. Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长
  2. 使用短轮询方式,实时性取决于轮询间隔时间;
  3. 消费失败不支持重试;
  4. 支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
  5. 社区更新较慢;

RabbitMQ

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

使用RabbitMQ需要:

  • ErLang语言包
  • RabbitMQ安装包

RabbitMQ优点

  1. 由于erlang语言的特性,mq 性能较好,高并发;
  2. 健壮、稳定、易用、跨平台、支持多种语言、文档齐全;
  3. 有消息确认机制和持久化机制,可靠性高;
  4. 高度可定制的路由;
  5. 管理界面较丰富,在互联网公司也有较大规模的应用;
  6. 社区活跃度高;

RabbitMQ缺点:

  1. 尽管结合erlang语言本身的并发优势,性能较好,但是不利于做二次开发和维护;
  2. 实现了代理架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,但是使得其运行速度较慢,因为中央节点增加了延迟,消息封装后也比较大;
  3. 需要学习比较复杂的接口和协议,学习和维护成本较高;

RocketMQ

RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。

RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

使用RocketMQ需要:

  • Java JDK
  • 安装git、Maven
  • RocketMQ安装包

RocketMQ优点:

  1. 顺序性,它支持顺序性,可以做到局部有序,在单线程内使用该生产者发送的消息按照发送的顺序到达服务器并存储,并按照相同顺序被消费,但前提是这些消息发往同一服务器的同一个分区
  2. 实时性:采取长轮询+PULL消费消息,你可以自己决定如何在响应性和吞吐量之间做平衡,配合合理的参数设置来获得更高的响应时间,实时性不低于PUSH方式
  3. 提供了丰富的拉取模式
  4. 支持10亿级别的消息堆积,不会因为堆积导致性能下降
  5. 高效的订阅者水平扩展机制

RocketMQ缺点:

  1. 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
  2. RocketMQ社区关注度及成熟度也不及前两者;
  3. 没有web管理界面,提供了一个CLI(命令行界面)管理工具带来查询、管理和诊断各种问题;
  4. 没有在 mq 核心中去实现JMS等接口;

消息队列的业务场景选择

1.Kafka

Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。

是一个不折不扣的大数据通道,追求高吞吐,不过存在丢消息的可能。

2.RocketMQ

天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理,所以MQ的大量消息堆积功能就可以发挥作用。

RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。

3.RabbitMQ

RabbitMQ :结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。

最后,结合上面的介绍,简要总结如下:

1.中小型公司,建议选RabbitMQ,一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便,但是不利于做二次开发和维护。

所幸,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,推荐RabbitMQ。

2.大型公司,根据具体使用在rocketMq和kafka之间二选一。最后根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。


原文链接

转载于:https://blog.51cto.com/zhangyc/2343764

高并发架构系列:最全消息队列有哪些?详解消息队列的选型与应用相关推荐

  1. 高并发架构系列:MQ消息队列的12点核心原理总结

    2019独角兽企业重金招聘Python工程师标准>>> 消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终 ...

  2. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  3. 高并发架构系列:Spring Cloud的核心成员、以及架构实现详细介绍

    高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 什么是微服务 微服务的概念源于Martin Fowler所写的一篇文章"Microservices". 微 ...

  4. 高并发架构系列:什么是流量削峰?如何解决秒杀业务的削峰场景

    流量削峰的由来 主要是还是来自于互联网的业务场景,例如,马上即将开始的春节火车票抢购,大量的用户需要同一时间去抢购:以及大家熟知的阿里双11秒杀, 短时间上亿的用户涌入,瞬间流量巨大(高并发),比如: ...

  5. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...

  6. 高并发架构系列:如何从0到1设计一个MQ消息队列

    消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...

  7. 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

    别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中, ...

  8. 高并发用redis还是mysql_高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  9. base cap 分布式_高并发架构系列:详解分布式一致性ACID、CAP、BASE,以及区别

    在面试环节,经常会问CAP.BASE等相关的分布式理论,其实这些名词主要还是来自于分布式的一致性,今天主要介绍分布式一致性:强一致性.最终一致性.ACID.CAP等理论. 分布式一致性的背景 随着分布 ...

  10. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

最新文章

  1. 【原】Java学习笔记020 - 面向对象
  2. 简单回声服务器的实现
  3. python将列表转换为字符串_每日一课 | Python将文件读入列表
  4. ThinkPHP5.0中报错could not find driver的解决方式
  5. SpringBoot2.x Nacos RocketMQ 事务消息
  6. Echarts数据可视化全解
  7. Windows 命令行及Git操作
  8. Qt——多语言程序设计
  9. 计算机结构系统的发展趋势,计算机体系结构的现状及发展趋势.docx
  10. ae合成设置快捷键_AE常用的快捷键(UI动效方向)
  11. AntD Selected 多选
  12. 邱天计算机,华北电力大学控制与计算机工程学院导师教师师资介绍简介-邱天...
  13. 协同过滤推荐算法及应用
  14. telegraf介绍
  15. BIGEMAP如何将高程数据转成南方CASS的DAT格式
  16. 【指派问题】基于matlab遗传算法求解指派优化问题【含Matlab源码 2292期】
  17. MOS管参数μCox得到的一种方法
  18. 联想笔记本如何开启笔记本的VT-x虚拟化技术功能
  19. postgresql 分组查询
  20. 剑指offer笔记(二)sizeof

热门文章

  1. 2021-09-13强化学 习 原理及技术介绍
  2. Contains Duplicate 包含重复值
  3. 485.最大连续1的个数
  4. 382.链表随机节点
  5. JSTL迭代操作--c:forEach,c:forTokens
  6. 将梯度下降运用到线性回归
  7. MATLAB dsolve 函数求解偏微分方程一例
  8. Chisel:一款基于HTTP的快速稳定TCPUDP隧道工具
  9. matlab中关闭mexfunction,mex文件的运行时Matlab自动关闭
  10. 简单的maven自定义webapp目录