浅谈对消息队列的理解

消息队列:我们可以把消息队列看成一个存放消息的容器,当我们需要时可以从直接容器内获取使用即可。
使用消息队列主要是为了异步通讯处理消息来提高系统性能、削峰\降流、系统间解耦的作用

消息队列的作用(为什么要使用消息队列)

有以下三个好处

  1. 通过异步处理提高系统的性能(减少响应的时间):
    当客户端访问服务器的时,将用户的耗时较长的请求成功放到消息队列里后就直接响应客户端,随后系统在慢慢消费消息从而减少客户端响应时间。
    场景:系统将用户的的请求信息放到消息队列后,直接响应客户端。但此时不能给客户一个成功转态的回复,可以回复一个处理中。由于后续可能对消息消费失败例如校验,入库等。等到一系列业务场景全部成功后可以给客户发一个短信或邮件提示。例如12306订票系统,电影票系统。
  2. 削疯\限流
    如果在秒杀系统,或促销伙同 系统短时间内接收到大量的请求。服务器接收压力等于业务系统处理压力。很容易造成系统崩 或者雪崩现象
    如果把接收到的请求都放进消息队列中,把客户请求的压力转换到MQ消息队列的压力,让后业务系统慢慢处理请求MQ内堆积的海量消息。
  3. 系统间解耦让系统扩展性更好
    系统间都没有直接调用,消息生产者 向消息队列中推送消息,消息消费者从消息队列中取消息
    模块之间没有直接调用,新增和改动对其它模块并没有影响,这样是系统很大程度的解耦,让系统 扩展性更好。
    三、消息队列带来的缺点
    系统的可用性降低
    系统的可用性在某种程度上会降低,在使用MQ之前,我们不用考虑消息丢失或MQ服务挂掉等问题,现在引入 MQ则必须考虑这些问题。这也是加一些中间件必须要面临的问题
    系统的复杂性提高
    我们要保证消息的重复消费、消息丢失、消息传递的顺序性问题
    数据的一致性问题
    我们知道消息队列可以通过异步处理消息提高系统的性能,但是如果消费者并没有对消息进行正确的消费,就会导致数据不 一致的情况
    四、JMS和AMQP
    JMS(java message service java消息服务),java客户端之间可以通过JMS服务进行异步消息调用,javaAPI是它的一种规范和标准。允许JavaEE构建的平台创建、发送、接收、读取。
    想ActiveMQ底层就基于JMS规范实现的。它支持两种消息模型:
    一、点对点模型(P2P):
    使用队列作为消息的载体。一个消息只能被一个消费者消费。未消费的消息只能在队列里等待消费或超市剔除
    二、发布订阅模型(pub/sub):
    使用主题(topic)作为消息的载体,类似于广播模型。每一个订阅的消费者都可以消费发布的消息
    AMQP:
    一个提供消息应用层标准(高级消息队列协议),底层采用二进制协议。是应用层的开放标准,为面向消息中间件设计,兼容JMS。代表:RabbitMQ。
    总结(JMS、AMQP区别):
    一、AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。在 Java 体系中,多个 client 均可以通过 JMS 进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而 AMQP 天然具有跨平台、跨语言特性。
    二、JMS 支持 TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
    三、由于 Exchange 提供的路由算法,AMQP 可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

希望小弟总结的可以对看官老爷们在面试的时候有点用。