问题

activemq的作用是什么

答案

  • activemq是apache提供的性能强劲的消息队列,类似的技术还有rabbitmq, zeromq,kafka等。消息队列是典型的的生产者消费者的实现,非常完美的解决了生产者消费者速度不一致的问题,也将一个JVM中的多线程升级到了不同服务去代替。
  • 解决了生产者消费者速度不一致的问题体现在假设生产者[请求]每秒钟有100次请求,作为消费者[响应]最好能每秒接收100次以上的请求,数据才不会丢失。如此就需要就很强悍的数据处理能力,但在实际工作中,用户请求增长远大于数据处理能力增长,所以基本上消费者的数据处理速度相对慢,这样就会造成有些用户的请求产生异常。如何避免丢包或者异常,就需要有一个缓冲地带,而消息队列就是这个缓冲。只要有消息队列在,生产者消费者在速度相差不是很夸张的情况下都能连续运行且没有异常。
  • 请求频率高于响应处理频率,也可以使用多线程来解决,但是无论怎样的多线程,始终是处于同一个服务器之内。同一个服务器就决定了其资源总有限制,引入分布式思想,那么生产者处于一个服务器,消费者处于另一个服务器,这两个服务器由第三个服务即消息队列产生关联,如此一来,整个系统的性能就不会受制于一个服务器,而是依赖于整个分布式系统。
  • activemq有两种模式,一是queue,即点对点或者一对一;二是topic,即发布订阅或者一对多。
    所谓一对一,是指生产者生产的一个消息,最多只能被一个消费者消费,而且必达。要注意以下两种情况:一个生产者可以对应多个消费者,只是只能有一个消费者拿到发送的消息;一个生产者发送消息时,可以没有消费者,但当后面的消费者上线时,刚才的消息依然能被消费者接收到。
    所谓一对多,是指一个生产者对应多个消费者,一个生产者发送的消息,能被所有的消费者接收到。要注意以下两种情况:生产者[发布者]在发送消息的时候,倘若此时没有消费者[订阅者],则这个消息会湮灭消失,哪怕后面有消费者上线,也不会收到该消息。
  • activemq有五种数据类型:
    TextMessage:java.lang.String对象,如xml文件内容。
    MapMessage:key/value键值对的集合,key是String对象,值类型可以是Java任何基本类型。
    BytesMessage:java中的字节流。
    StreamMessage:Java 中的输入输出流。
    ObjectMessage:Java实现了Serializeable的对象。