高级开发人员必备技术:MQ

也许在大家公司从没有使用过MQ,也不知道这东西是用来干什么的,可是一旦你进入大公司你就会发现,这东西到处可见。今天就来讲说MQ方面的东西,我公众号有 activemq的 demo,你们能够本身去看看。

什么是MQ

Message Queue简称MQ,中文消息队列。前端

  • “消息”是在两台计算机间传送的数据单位。消息能够很是简单,例如只包含文本字符串;也能够更复杂,可能包含嵌入对象。
  • 消息被发送到队列中。“消息队列”是在消息的传输过程当中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;若是发送消息时接收者不可用,消息队列会保留消息,直到能够成功地传递它。

你能够把它理解为一个中间件,帮你完成多个系统或应用间的消息传递。java

为何要使用MQ

首先它有3个核心,解耦,异步,削峰,所以咱们能够想到如下使用场景:git

  • 你的系统要和多个系统发生关系,别的系统要从你这获取一些数据,今天A系统和你要这样的数据,明天B系统说你的数据有问题,后天C系统让你加个别的数据。你一我的要维护解决不少问题,忙得不可开交。而有了MQ,你就能够经过Pub/Sub 发布订阅消息这么一个模型,系统就跟其它系统完全解耦了。只要把消息放到队列里,其它系统就本身去处理本身须要的数据,本身再也不考虑该给谁发送数据。好比:下完订单,再也不去通知库存作同步处理。把该物品的信息放在队列中,库存本身去选择何时去处理计算本身的库存。
  • 仍是上面的例子,以前的流程,user浏览器端发起购物请求3ms,订单系统处理数据库300ms,以后库存系统处理数据库300ms,这样同步状况下加起来就要603ms。即便前端有加载提示框,等待时间超过300ms,人眼是能感觉到这种延迟的,体验很很差,速度越快才能留住user。如今使用MQ采用异步消息处理,假如消息放进队列须要3ms,那么最终的响应时间是3+3=6ms,对于建立订单和库存计算user并不关心,这样极大的提升了响应时间。
  • 一个大的网站或是应用,总会迎来访问量的高峰,多是营销活动忽然带来的大流量,或是节假日。好比双十一,购物人数忽然猛增,并发数提升,数据库的压力忽然增大,超出了每秒钟的处理能力,就会致使网站瘫痪。使用mq后,数据库能够没必要立马处理这么多的请求,能够本身选择能承受的消息慢慢去处理。全部的消息积压在队列中,而不是同时积压到数据库。加入队列中积压了1亿条数据,而个人数据库只能每秒处理100万条数据,那我就每秒从队列中取出100万条来处理,始终不会超出阈值,这样数据库就不会被挤垮。把峰值慢慢消耗。

如今想一想你为何没有使用到mq吧?或是考略使用mqgithub

使用后带来的威胁

任何事物都有它的两面性,既然有优势那也有缺点:数据库

  • 系统可用性下降

万一mq挂了,队列里面的数据没有了,其它系统数据还没处理完,这可咋整?浏览器

  • 系统的复杂度提升了

你用个mq是爽了,其它系统也要对应的修改本身的系统,来消费队列中的消息。硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的状况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。架构

  • 一致性问题

你订单系统操做成功了,可是库存系统却失败了,这样致使了数据的不一致。并发

因此消息队列实际是一种很是复杂的架构,你引入它有不少好处,可是也得针对它带来的坏处作各类额外的技术方案和架构来规避掉,作好以后,你会发现,妈呀,系统复杂度提高了一个数量级,也许是复杂了 10 倍。可是关键时刻,用,仍是得用的。异步

主流的MQ产品

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

上面表格来自:https://github.com/doocs/adva...分布式

推荐使用

  • 早期你们都在使用ActiveMQ ,适合小型项目,若是你尝试使用MQ,你能够选择。
  • RabbitMQ社区活跃度比较高,开源,有问题能够在社区寻求帮助。可是底层使用了erlang 语言,不是小公司又能力掌控的 。
  • RocketMQ 阿里出品,是用的中国公司比较多,经历过使用场景的考验,且自家产品也在用,不用担忧。可是社区活跃度不高。推荐使用。
  • 若是是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,况且几乎是全世界这个领域的事实性规范。
  • 因此中小型公司,技术实力较为通常,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。
相关文章
相关标签/搜索