ActiveMQ的初步了解

什么是ActiveMQ:

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

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

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

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

ActiveMQ的使用场景:

其实也就是为何要使用MQ。 :watermelon:github

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

  2. 解耦 下降工程之间的耦合程度,从设计角度来说,达到低耦合高内聚的目的。当应用须要维护的时候,不一样应用能够独立的扩展或修改,只须要遵循一样的接口约束便可。session

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

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

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

  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();
//建立Session
ISession 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三种平台

相关文章
相关标签/搜索