公司的项目一直都是在使用MQ的,可是因为使用的功能很简单,因此一直都是知其然不知其因此然,做为一个程序猿有必要了解每个使用的技术,为何使用它?它的优势是什么?缺点是什么?等等。。。java
系统A要发送一个消息到多个系统,若是此时每增长一个系统,系统A都须要经过修改源码来增长接口,此时耦合很是高,可是若是中间使用消息队列的话,系统只须要发送一次到消息队列,别的系统就能复用该信息,当增长或删除系统调用接口的时候,不须要额外的更新代码。数据库
用户调用一个接口的时候,可能该接口调用了别的方法。例如:用户注册的时候,后台可能须要调用:查询数据库,插入数据库,发送邮件,发送用户指南等等...安全
可是用户可能并不须要后台将全部的任务执行完毕,那么此时在初入数据口后面加入mq队列,用户就能很快获得注册成功的响应而去作一些别的事情。mq的机制又能保证最终的一致性,因此使用起来很安全很稳定。架构
何为消峰,就是当系统压力过大的时候,让系统压力减少。如何作?并发
加入数据库的读写每秒3000,在高峰期,系统的访问达到了每秒10000。此时因为加入了消息队列,因此不会出现激增的访问致使系统奔溃。
(注意,晓峰并不会让用户的等待时间减小,因此通常会跟异步搭配来使用)异步
原本系统之间直接通行调用接口就好了,可是引入了mq致使系统的复杂度大大增长,而且若是mq挂掉了,那么系统之间的通讯就中断了,致使整个系统的所有挂掉。分布式
A系统处理完了发送到消息对流后直接返回成功了,用户觉得你这个请求就成功了;可是问题是,其余系统消费该消息后,若是当中有一个系统出现了问题,致使数据丢失。最后就会发生数据不一致等问题。性能
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 | 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 | 10万级,RocketMQ也是能够支撑高吞吐的一种MQ | 10万级别,这是kafka最大的优势,就是吞吐量高。通常配合大数据类的系统来进行实时数据计算、日志采集等场景 |
topic数量对吞吐量的影响 | topic能够达到几百,几千个的级别,吞吐量会有较小幅度的降低这是RocketMQ的一大优点,在同等机器下,可 | topic能够达到几百,几千个的级别,吞吐量会有较小幅度的降低这是RocketMQ的一大优点,在同等机器下,可 | ||
时效性 | ms级 | 微秒级,这是rabbitmq的一大特色,延迟是最低的 | ms级 | 延迟在ms级之内 |
可用性 | 高,基于主从架构实现高可用性 | 高,基于主从架构实现高可用性 | 很是高,分布式架构 | 很是高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会致使不可用 |
消息可靠性 | 有较低的几率丢失数据 | 通过参数优化配置,能够作到0丢失 | 通过参数优化配置,消息能够作到0丢失 | |
功能支持 | MQ领域的功能极其完备 | 基于erlang开发,因此并发能力很强,性能极其好,延时很低 | MQ功能较为完善,仍是分布式的,扩展性好 | 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
优劣势总结 | 很是成熟,功能强大,在业内大量的公司以及项目中都有应用偶尔会有较低几率丢失消息并且如今社区以及国内应用都愈来愈少,官方社区如今对ActiveMQ 5.x维护愈来愈少,几个月才发布一个版本并且确实主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用 | erlang语言开发,性能极其好,延时很低;吞吐量到万级,MQ功能比较完备并且开源提供的管理界面很是棒,用起来很好用社区相对比较活的。RabbitMQ吞吐量会低一些,这是由于他作的实现机制比较重。erlang开发很难去看懂源码,你公司对这个东西的掌控很弱,基本职能依赖于开源社区的快速维护和修复bug。 | 接口简单易用,并且毕竟在阿里大规模应用过,能够作到大规模吞吐,性能也很是好,分布式扩展也很方便,社区维护还能够,可靠性和可用性是ok的,还能够支撑大规模的topic数量。阿里出品都是java系的,咱们能够本身阅读源码。 | kafka的特色其实很明显,就是仅仅提供较少的核心功能,可是提供超高的吞吐量,ms级的延迟,极高的可用性以及可靠性,并且分布式能够任意扩展同时kafka最好是支撑较少的topic数量便可,保证其超高吞吐量并且kafka惟一的一点劣势是有可能消息重复消 |
因此在软件的正常功能开发中,并不须要去刻意的寻找消息队列的使用场景,而是当出现性能瓶颈时,去查看业务逻辑是否存在能够异步处理的耗时操做,若是存在的话即可以引入消息队列来解决。不然盲目的使用消息队列可能会增长维护和开发的成本却没法获得可观的性能提高,那就得不偿失了。大数据