ActiveMQ的初步了解

来源:互联网 发布:胸肌下轮廓 知乎 编辑:程序博客网 时间:2024/06/05 18:03

什么是ActiveMQ:

  1. 首先你得了解什么是MOM:
    MOM(Message Oriented Middleware),分布式系统的集成,指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

  2. 然后你得知道什么是JMS:
    JMS(Java Message Service)Java消息服务,应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

摘要来自百度百科,这里就不对前两个进行赘述,有兴趣的自行Google。 :cherries:

  1. 最后才是ActiveMQ:
    Apache下的一个非常流行的消息中间件,使用JAVA支持的JMS Provider实现,所以和JAVA程序完全兼容,开发java项目中间件首选。当然ActiveMQ不仅仅支持JAVA,在C++、Dotnet、Python、Php、Ruby、Websocket等多种客户端都可以提供良好的服务。

ActiveMQ的使用场景:

其实也就是为什么要使用MQ。 :watermelon:

  1. 异步通信
    不需要即时处理的业务,将其放去消息队列中,在需要处理的时候直接去队列中取出来,达到了生产者和消费者不用互相了解对方,生产者只需要专注于生产,消费者专注于消费。

  2. 解耦
    降低工程之间的耦合程度,从设计角度来讲,达到低耦合高内聚的目的。当应用需要维护的时候,不同应用可以独立的扩展或修改,只需要遵循同样的接口约束即可。

  3. 冗余
    消息队列可以对队列中的消息进行持久化处理,防止数据丢失。很多消息队列都采用“插入-获取-删除”的模式,只有当处理数据的过程成功并且返回提示,才会进行消息的删除,否则消息将一直保存在队列之中。

  4. 过载保护
    在请求量突发的高峰期间,为了让系统保持正常工作,又不想每时每刻都按最大峰值投入资源。使用消息队列就可以让关键组件顶住突发压力,不至于让整个系统崩溃。

  5. 保证有序
    消息队列可以对消息进行优先级设定,然后根据优先级来对消息进行排序,达到重要数据优先处理。

  6. 缓冲
    消息队列有助于控制和优化数据流经过系统的速度。以调节系统响应时间。

  7. 数据流处理
    大数据业务需要对数据流进行分析,在消息队列中进行处理是最好不过的。

ActiveMQ原理剖析:

  • 两种运行模型

    • PTP点对点通信:
      使用queue作为信息载体,满足生产者与消费者模式,一个消息只能被一个消费者使用,没有被消费的消息可以持久保持在queue 中等待被消费。
    • Pub/Sub发布订阅模式:
      使用Topic主题作为通信载体,类似于广播模式,在消息广播期间,所有的订阅者都可以接受到广播消息,在一条消息广播之后才订阅的用户是收不到该条消息的。
  • ActiveMQ的组成模块

    • Broker:消息服务器,作为server提供消息核心服务。
    • Producer:消息生产者,业务的发起方,负责生产消息传输给broker。
    • Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理。
    • Topic:主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播。
    • Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的 queue完成指定消息的接收。
    • Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务 数据,实现消息的传输。
  • ActiveMQ的常用协议

    • AMQP协议
      AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消 息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

    • MQTT协议
      MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时 通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网 物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协 议。

    • STOMP协议
      STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为 MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提 供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。
    • OPENWIRE协议
      ActiveMQ特有的协议,官方描述如下
      OpenWire is our cross language Wire Protocol to allow native access to ActiveMQ from a number of different languages and platforms. The Java OpenWire transport is the default transport in ActiveMQ 4.x or later. For other languages see the following...

对于ActiveMQ的上述协议,每种协议端口都不一样,可以自行修改。:tangerine:

编辑activemq.xml,在transportConnectors标签中注销、修改或删除不使用的协议。

<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/><transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

ActiveMQ运用实践:

csharp作为生产者实例。

//根据URI创建NMS连接工厂NMSConnectionFactory factory = new NMSConnectionFactory(brokerUri);//根据用户名密码创建连接IConnection connection = factory.CreateConnection(user, password);//打开连接connection.Start();//创建SessionISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);//根据destination创建主题IDestination dest = session.GetQueue(destination);//创建生产者IMessageProducer producer = session.CreateProducer(dest);producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//发送消息String body = "hello,javaJMS!!  I'm C#";producer.Send(session.CreateTextMessage(body));//关闭连接connection.Close();

创建Session时可以为会话设定消息确认模式:
- AUTO_ACKNOWLEDGE
当客户端成功从receive或onMessage方法返回之后,会话自动确认客户端的消息。
- CLIENT_ACKNOWLEDGE
客户通过消息的acknowledge 方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消费的消息。
- DUPS_ACKNOWLEDGE
该选择只是会话迟钝的确认消息的提交。如果JMS provider 失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider 必须把消息头的JMSRedelivered 字段设置为true。
- SESSION_TRANSACTED
即消息发送者发送消息后,需要提交事务,否则消息不进入broker待发送队列中。

相关实践在这里不进行详细描述,详情可以参考我的Demo项目。:lemon:
以ActiveMQ为消息中间件,关联dotnet,java,ws三种平台

原创粉丝点击