初识MQ(消息队列)——不看不行

了解

小二在工作之余准备搞几篇mq的文章给大家实打实的训练一把mq,期间一些代码,文件啥的都会给大家发出来。希望我的讲解能够通俗易懂,祝大家能有所收获。

mq主要学习路线

  1. 消息中间件是什么?
  2. MQ常用的四大产品的对比?
  3. 应用场景有哪些?能解决那些实际应用问题?
  4. 如何下载安装并使用MQ?
  5. Java怎样编码实现MQ通讯?其中包含JMS Api ,消费情况分析,消费方式等开发步骤。
  6. JMS组成及特点?
  7. 持久性和事务的实现?
  8. spring整合MQ
  9. 一些高级特性(多节点集群)。

我这里主要教大家ActiveMQ,那很多人不爽了,这玩意谁还用啊,不都是RabbitMQ,RocketMQ,太low了! 但是呢,我想告诉大家,一般小公司的一些项目其实还会用到ActiveMQ啦,是有实战作用的。而且相对其他产品来说还是比较容易理解和学习的,我们先把容易学习的学好了,再整其他的就非常快了。 Rabbit后期会给大家也整一篇压压惊喔!

初识ActiveMQ

Apache ActiveMQ是开源的,多协议的,消息传递服务器。最重要的就是其无处不在的AMQP协议JMS基础结构。 大家只要知道这两个会贯穿我们ActiveMQ的学习很重要就行,其他的什么多余介绍我就不说了。

消息中间件

消息中间件注重数据的发送和接收,利用高效可靠的异步消息传递机制 进行平台无关的数据交流,并基于数据通信集成分布式系统。所以,咱们这个消息中间件又是分布式系统中重要的组件,主要用于解决应用耦合高可用可伸缩最终一致性 的架构。

消息中间件的产品对比

目前,我们常用的四种产品有ActiveMQ ,RocketMQ ,RabbitMQ ,kafka。
ActiveMQ:是Apache的产品,是一些传统的一般项目使用的比较多的,学习成本低,其实吞吐量也还行,没有那么鸡肋。

RabbitMQ:是使用Erlang语言写的,特色就是它使用的交换机,处理性能很好,一般互联网的大型项目,和少数一些传统大型项目也会使用,高并发,高吞吐量。集群来说性能比不上kafka。

RocketMQ:是阿里结合RabbitMQ和kafka做的一个优化中间件,和RabbitMQ差不多,互联网大型项目也很多会用到,还是要看公司中意哪个,吞吐量非常高。不过商业版是要收费的,嘿嘿。

kafka:是Apache的产品,主要用于大数据和日志采集,那应用多的就是大数据项目。但是它是不能保证数据不会丢失。每秒10万级的高吞吐,牛!

那我们主讲ActiveMQ咯!

应用场景和问题解决

  1. 解耦
    举个购物系统的例子,用户下单后要生成订单,然后付款,然后接收短信提示订单状态,那么一般是这样的。
    初识MQ(消息队列)——不看不行
    可以看到,下单后,到系统处理业务,然后完成,感觉没有什么问题。但是,到了高并发的情况再来看,会发现,短时间,一大堆用户进行这个业务逻辑,系统吃不消啊!
    那我们就来解决它。
    初识MQ(消息队列)——不看不行
    可以看到我们把各个业务分离出来,然后每个系统产生的消息数据发送到消息队列的集群中,然后其他后续系统就到消息队列中去订阅的队列把那些消息一条一条的去读取并操作,这就是解耦。

  2. 异步
    初识MQ(消息队列)——不看不行
    比如我们一个系统中完成某些操作需要比较长的时间(一般来说,我们操作响应时间不能太长,否则会影响用户体验),使用消息队列去异步读取,大大减少系统间操作时间。

  3. 削峰
    比如淘宝,在双十一的时候大批大批的人疯狂秒杀。这时,就用到了我们的MQ,大家好好想想,有双十一购物的朋友应该注意到了,当你在下单后会收到一条短信,显示你下单成功,这时你的钱其实还没付,可能等到第二天早上才会收到一条您已付款成功的短信。
    这是因为淘宝使用了消息队列,把我们的订单数据搞到里面,然后订单处理系统,付款系统去消费里面的消息(订单数据)。完成了高并发时期的流量削峰,大大提高了用户体验和系统承压能力。
    对于业务系统,我们要保证稳定性(KPI) 指标最高。
    也就是CAP定理中的高可用。我们系统最重要的指标就是稳定性,然后再是性能,最后是扩展等考虑的问题。
    所以流量的削峰处理的就是高并发情况下,比如上面的双十一秒杀,同一时间段,流量服务极大的处理很容易造成系统宕机,所以我们可以暂时不去处理那些请求而是 把那些处理请求放到消息队列中,慢慢"消化"。

  4. 日志处理
    对于kafka来说,它做的日志采集也用到咱们的MQ,因为客户端的数据发送到MQ中时,就可以对所有的这些日志数据做处理,方便分析。

  5. 关于RabbitMQ的通信
    RabbitMQ采用信道通信,不采用tcp直接通信,有什么好处呢?
    5.1. tcp的创建和销毁开销大,创建3次握手,销毁4次分手
    5.2. 高峰的时候成千上万的链接造成资源的浪费,而且操作系统处理tcp的数量也是有数量限制的,这时性能瓶颈的问题油然而生。
    5.3.一条线程一条信道,多条线程多条信道,然后共用一个tcp连接,因为一个tcp连接可以装载无限多的信道,消除性能上的瓶颈。

提几个问题

  1. 大家思考一下,什么是JavaEE
    我估计很多人都会想,这不就是企业级的java开发平台嘛?还有啥说的?
    那小二要给大家补充一下啦!

JavaEE是一套使用Java进行企业级应用开发的,大家一致遵循的13个核心规范工业标准
JavaEE平台提供了一个基于组件的方法来加快设计、开发、装配及部署企业应用程序。所以说它是一个标准和规范,我们都要遵循,其中重要的几个比如JDBC,JNDI,EJB,JSP,Servlet,XML,JMS,JTA等等都是我们 在开发中遵循的开发规范。

  1. 那我们使用消息中间件就要用到啥呢?
    用到的就是JMS啦,JMS就是Java消息服务,消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持Java应用程序开发。在JavaEE中,当两个应用程序进行JMS通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦、异步、削峰的效果

消息中间件其实理解起来也挺简单,就是把用户在系统中产生的一些数据放到一个队列中,然后就可以一条一条拿出来用,相当于寄存一些任务,当我有空的时候就拿出来根据任务去完成。

下篇就开始搞Active的具体配置和代码讲解啦!小二一定倾囊相授,希望有错误的地方请广大万能网友帮我指正出来!
初识MQ(消息队列)——不看不行