初识消息中间件

在学习消息中间件之前,我们先来了解一下消息中间件是什么,消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。


假设用户下单之后调用库存系统减库存,然后需要调用物流系统进行发货,如果交易、库存、物流是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是RPC(Remote Procedure Call)。有关RPC的框架,可以了解一下Dubbo


随着系统继续发展,可能一笔交易后续需要调用几十个接口来执行业务,比如还有风控系统、短信提醒服务等等。这个时候就需要消息中间件登场来解决问题了。所以消息中间件主要解决分布式系统之间消息的传递,同时为分布式系统中其他子系统提供了伸缩性扩展性


其为系统带来了的好处如下:

  • 低耦合,不管是程序还是模块之间,使用消息中间件进行间接通信。
  • 异步通信能力,使得子系统之间得以充分执行自己的逻辑而无需等待。
  • 缓冲能力,消息中间件像是一个巨大的蓄水池,将高峰期大量的请求存储下来慢慢交给后台进行处理,对于秒杀业务来说尤为重要。

其上述提到的伸缩性扩展性主要是指:

  • 伸缩性,是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。衡量架构是否高伸缩性的主要标准就是是否可用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来服务器无差别的服务。集群中可容纳的总的服务器数量是否有限制。
  • 扩展性,主要标准就是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。可以简单理解为设计模式中的开闭原则(对扩展开放,对修改关闭)在架构层面的一个原则。



消息中间件和RPC一样,都是分布式下面的通信方式,但是相比于RPC框架需要分别去调用各个子系统的服务来看,消息中间件就无需这样呀,它只需生产消息,然后依赖于消息中间件去消费消息来完成自己的业务逻辑。那么消息中间件有哪些常见的运行场景呢?


异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种:

  1. 串行方式,将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。
    初识消息中间件_第1张图片

  2. 并行方式,将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。
    初识消息中间件_第2张图片


这里其实我们还有一种处理方式,就是我们的消息中间件了,我们可以对比下三种方式的响应时间,可以发现利用消息中间件,可以很大程度的缩短其响应时间,提供了系统的吞吐量
初识消息中间件_第3张图片


应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
初识消息中间件_第4张图片

但是上述的实现方式存在着:

  1. 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
  2. 订单系统与库存系统耦合

如何解决以上问题呢?引入应用消息队列后的方案,如下:
初识消息中间件_第5张图片
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。


流量削峰

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列:

  1. 可以控制活动的人数;
  2. 可以缓解短时间内高流量压垮应用。
    初识消息中间件_第6张图片

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;秒杀业务根据消息队列中的请求信息,再做后续处理。


日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下:
初识消息中间件_第7张图片


消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

  • 点对点通讯:客户端A和客户端B使用同一队列,进行消息通讯。
  • 聊天室通讯:客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。



下图就是有关消息中间件的编年史,有兴趣的同学可以了解一下,如下
初识消息中间件_第8张图片

最后我们就来了解一下几种常见的消息中间件,以及它们之间不同的特点

ActiveMQ RabbitMQ RocketMQ Kafka
性能(单台) 6000+ 万级(12000+) 十万级 百万级
消息持久化 支持 支持 支持 支持
多语言支持 支持 支持 很少 支持
社区活跃度
支持协议 多(JMS,AMQP…) 多(AMQP,STOMP,MQTT…)
综合评价 优点: 成熟,已经在很多公司得到应用。较多的文档。各种协议支持较好,有多个语言的成熟客户端。
缺点:性能较弱。缺乏大规模吞吐的场景的应用。
优点:性能较好,管理界面较丰富,在互联网公司也有较大规模的应用,有多个语言的成熟客户端。
缺点:内部机制很难了解,也意味很难定制和掌控。集群不支持动态扩展。
优点:模型简单,接口易用。在阿里有大规模应用。分布式系统,性能很好,版本更新很快。
缺点:文档少,支持的语言较少,尚未主流。
优点:天生分布式,性能最好,所以常见用于大数据领域。
缺点:运维难度大,偶尔有数据混乱的情况,对ZooKeeeper强依赖。多副本机制下对带宽有一定的要求。

在了解了上述几种不同消息中间件后,那么如果一般的业务系统要引入MQ,怎么选型:

  1. 用户访问量在ActiveMQ的可承受范围内,而且确实主要是基于解耦和异步来用的,可以考虑ActiveMQ,也比较贴近Java工程师的使用习惯。
  2. RabbitMQ性能等方面较为ActiveMQ较强,但是其采用erlang语言阻止了我们去深入研究和掌控,对公司而言,几乎处于不可控的状态,但是确实是开源的,有比较稳定的支持,活跃度也高。
  3. 对自己公司技术实力有绝对自信的,可以用RocketMQ 。所以中小型公司,技术实力较为一般,技术挑战不是特别高,用ActiveMQ、RabbitMQ是不错的选择;大型公司,基础架构研发实力较强,用RocketMQ是很好的选择
  4. 如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,几乎是全世界这个领域的事实性规范。

你可能感兴趣的:(ActiveMQ)