MQ在项目中的应用很普遍,本人所在项目组使用的是ActiveMQ,但是后面介绍的RabbitMQ。。。

一、应用场景

1、异步处理

2、流量削峰、秒杀

3、日志处理,推荐kafka

4、应用解耦

二、衡量指标

我们从服务性能、数据存储、集群结构三个方面去对比,选择适合自己项目的消息中间件

1、ActiveMQ

特点:

  早期主流的消息中间件,但是这几年使用的很少了,API丰富,本身很成熟但是在高并发、大数据环境下的性能不够出色,主要试用于中小型

项目,有较低的概率丢失数据,最主要是的,官方现在维护的频率一直在降低,好几个月才发布一个版本

架构:

  1、Master-Slave模式,通过Zookeeper实现节点切换和故障转移

  2、NetWork模式,相当于多套Master-Slave模式,通过NetWork网关进行集成

2、kafka

特点:

  基于pull模式来处理消息消费,追求高吞吐量,开始的目的是日志采集和传输,0.8版本开始支持复制,不支持事务,对消息的重复、丢失

、错误没有严格要求,适合大数据服务的数据计算、日志采集业务

  topic数量从几十到几百的时候,吞吐量会大幅度下降,本身支持的功能比较简单,可能有消息重复消费

集群:

  通过zookeeper集群管理多个kafka节点,节点之间相互replication

3、RocketMQ

特点:

  纯Java开发,具备高吞吐量(10W级别)、高可用性、适合大规模分布式系统应用的特点。思路起源于kafka,对事务的可靠性传递和事务性

进行优化,在阿里巴巴广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景,但是商业版收费

  MQ功能较为完善,拓展性好,因为是分布式的,接口简易,支持复杂的MQ业务场景,本身是阿里出品,品质有所保障

  社区维护一般,没有那么活跃,而且万一像之前的Dubbo一样,没人维护了,就凉了(Dubbo现在已经重新维护,接连发布很多版本)

集群:

  master-slave、2M-2S、多主多从等

4、RabbitMQ

特点:

  开源的消息代理和队列服务器,在普通协议在不同的应用之间共享数据,使用Erlang编写(Erlang进行数据交换的性能很好,和原生socket

一样好的延迟响应效果),遵守AMQP协议,AMQP主要特征是面向消息、队列、路由(点对点的发布/订阅)、可靠性、安全。适合对数据一致性、

稳定性(100%消息投递)和可靠性要求很高的场景,对性能和吞吐量的要求其次。

  优点:能达到几万级别的吞吐量(和具体的机器配置有关),但是相比kafka和RocketMQ差了不少,因为采用Erlang,时延性是微秒级别,

最重要的是有专门的可视化界面,很方便进行管理,社区非常活跃,功能很完备

  缺点:吞吐量的问题,因为是Erlang语言开发,很难去查看源码。如果存在什么问题,只能等官方去解决,对其掌控度很低,但是社区活跃

度很高,这个影响也不大的

综上:

  如果是大数据肯定推荐kafka,kafka是业内的标准,绝对没问题

  而RocketMQ更加优秀,但是好像商业版收费,社区有黄掉的风险,适合大公司对自己的技术实力有很大自信的,可以自己维护扩展

  RabbitMQ方面,Erlang语言是一个限制,毕竟国内精通这个的不多,好在是开源的,稳定支持,适合中小型公司吧,个人学习更推荐这个

  但是后面RocketMQ也是要学习的。。。

RabbitMQ系列(一)--消息中间件MQ如何去选择的更多相关文章

  1. RabbitMQ系列随笔——介绍及安装

    一.RabbitMQ介绍 RabbitMQ是由erlang开发的AMQP(Advanced Message Queuing Protocol)的开源实现.他是高级消息队列协议,是应用层协议的一个开放标 ...

  2. 消息中间件 MQ

    复制粘贴于:https://blog.csdn.net/wqc19920906/article/details/82193316 一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部 ...

  3. RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...

  4. 消息中间件MQ详解及四大MQ比较

    一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流 ...

  5. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  6. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)

    RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...

  7. 消息中间件MQ的学习境界和路线

    在<深入理解Java类加载机制,再也不用死记硬背了>里我提到了对于一门语言的"会"的三个层次.本篇将以知识地图的形式展现学习消息中间件MQ各个层次要掌握的内容. 知识地 ...

  8. RabbitMQ系列教程之四:路由(Routing)(转载)

    RabbitMQ系列教程之四:路由(Routing) (使用Net客户端) 在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ...

  9. RabbitMQ系列文章

    详解 RabbitMQ 管理界面解析框架 (一) RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用 RabbitMQ windows安装步骤 RabbitMQ管理页面各种属性详解 ...

随机推荐

  1. 硬件十万个为什么——运放篇(五)PCB设计技巧

    1.在PCB设计时,芯片电源处旁路滤波等电容应尽可能的接近器件.典型距离是小于3MM 2.运算放大器芯片电源处的小陶瓷旁路电容在放大器处于输入高频信号时能够为放大器的高频特性提供能量电容值的选择依据输 ...

  2. sdut 4-1 复数类的运算符重载

    4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握成员运算符重载及友元运算符重载 要求定义一个复数类.重 ...

  3. Silverlight之控件应用总结(二)(4)

    [置顶] Silverlight之控件应用总结(二)(4) 分类: 技术2012-04-03 22:12 846人阅读 评论(0) 收藏 举报 silverlightradiobuttonhyperl ...

  4. 【HDU4706】Children's Day

    http://acm.hdu.edu.cn/showproblem.php?pid=4706 水题,也不知道有没有spj // <4706.cpp> - 11/03/16 14:11:21 ...

  5. vue 基础知识 随笔

    window.localStorage.gettItem("someItem"||[])//如果localStorage中的someItem不存在就返回一个空数组 window.l ...

  6. JS如何遍历一个文件夹下的所有文件与目录(转)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. jQuery EasyUI,LinkButton(按钮)组件

    转自:https://www.cnblogs.com/adc8868/p/6639570.html jQuery EasyUI,LinkButton(按钮)组件 学习要点: 1.加载方式 2.属性列表 ...

  8. 【废弃中】【WIP】JavaScript 数组

    创建: 2018/01/22 更新: 2018/05/20 把此博文加入[javascript]分类, 原来忘记了 废弃: 2019/02/19 重构此篇.原文归入废弃  增加[废弃中]标签与总体任务 ...

  9. Objective-C程序

    创建: 2018/01/17 完成: 2018/01/19  对象(object)与信息  信息式 声明实例变量  id obj;  向对象变量发送信息 [obj msg] //这就是信息式 例: [ ...

  10. vue项目开发中踩过的坑

    一.路由 这两天移动端的同事在研究vue,跟我说看着我的项目做的,子路由访问的时候是空白的,我第一反应是,不会模块没加载进来吧,还是....此处省略一千字... 废话不多说上代码 路由代码 { pat ...