MQ全称为Message Queue
,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ
。
MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
JMS即Java消息服务(Java Message Service
)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS(Java Messaging Service
)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java DatabaseConnectivity
):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持JMS
,包括 IBM
的 MQSeries
、BEA的 Weblogic
JMS service和 Progress 的 SonicMQ,这只是几个例子。JMS使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个JMS客户机向另一个JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage
)、可序列化的对象 (ObjectMessage
)、属性集合 (MapMessage
)、字节流 (BytesMessage
)、原始值流 (StreamMessage
),还有无有效负载的消息 (Message
)。
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM
)的最终实现,是真正的服务提供者;MQ
的实现可以基于JMS,也可以基于其他规范或标准。
目前选择的最多的是ActiveMQ
。ActiveMQ
是Apache
出品,最流行的,能力强劲的开源消息总线。ActiveMQ
是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider
实现,尽管JMS
规范出台已经是很久的事情了,但是JMS
在当今的J2EE
应用中间仍然扮演着特殊的地位。
Java, C, C++, C#, Ruby, Perl, Python, PHP
。应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP
eronimo,JBoss 4, GlassFish,WebLogic
)的测试,其中通过JCA 1.5 resource adaptors
的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端API。但是ActiveMQ也为C/C++、.NET、Perl、PHP、Python、Ruby和一些其它语言提供客户端。在你考虑如何集成不同平台不同语言编写应用的时候,ActiveMQ拥有巨大优势。在这样的例子中,多种客户端API通过ActiveMQ发送和接受消息成为可能,无论使用的是什么语言。此外,ActiveMQ还提供交叉语言功能,该功能整合这种功能,无需使用远程过程调用(RPC)确实是个优势,因为消息协助应用解耦。
使用RPC同步调用的应用十分普遍。假设大多数客户端服务器应用使用RPC,包括ATM
、大多数WEB
应用、信用卡系统、销售点系统等等。尽管很多系统很成功,但是转换使用异步消息可以带来很多好处,而且也不会放弃响应保证。使用同步请求的系统在规模上有较大的限制,因为请求会被阻塞,从而导致整个系统变慢。如果使用异步消息替代,可以很容易增加额外的消息接收者,使得消息能被并发消耗,从而加快请求处理。当然,你的系统应用间应该是解耦的。
正如之前讨论的,紧耦合架构可以导致很多问题,尤其是如果他们是分布的。松耦合架构,在另一方面,证实了更少的依赖性,能够更好地处理不可预见的改变。不仅可以在系统中改变组件而不影响整个系统,而且组件交互也相当的简单。相比使用同步的系统(调用者必须等待被调用者返回信息),异步系统(调用方发送消息后就不管,即fire-and-forget)能够给我们带来事件驱动架构(
event-driven architecture EDA`)。
解耦,异步架构的系统允许通过代理器自己配置更多的客户端,内存等(即vertical scalability)来扩大系统,而不是增加更多的代理器(即horizontal scalability)。考虑如亚马逊这样繁忙的电子商务系统。当用户购买物品,事实上系统需要很多步骤去处理,包括下单,创建发票,付款,执行订单,运输等。但是用户下单后,会立即返回“谢谢你下单”的界面。不只是没有延迟,而且用户还会受到一封邮件表明订单已经收到。在亚马逊下单的例子就是一个多步处理的例子。每一步都由单独的服务去处理。当用户下单是,有一个同步的提交表单动作,但整个处理流程并不通过浏览器同步处理。相反地,订单马上被接受和反馈。而剩下的步骤就通过异步处理。如果在处理过程中出错,用户会通过邮件收到通知。这样的异步处理能提供高负载和高可用性。
很多使用事件驱动设计的系统是为了获得高可扩展性,例如电子商务,政府,制造业,线上游戏等。通过异步消息分开商业处理步骤给各个应用,能够带来很多可能性。考虑设计一个应用来完成一项特殊的任务。这就是面向服务的架构(service-oriented architecture SOA
)。每一个服务完成一个功能并且只有一个功能。应用就通过服务组合起来,服务间使用异步消息和最终一致性。这样的设计便可以引入一个复杂事件处理概念(complex event processing CEP
)。使用CEP,部件间的交互可以被记录追踪。在异步消息系统中,可以很容易在部件间增加一层处理。
activeMQ是什么?
是Apache公司旗下的一个消息总线
ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合的应用程序架构.
activeMQ能干什么?
用来在服务与服务之间进行异步通信的
activeMQ优势
1.流量肖锋
2.任务异步处理
特点:可以解耦合
(学习新技术的三要素:是什么?能干什么?有什么优势?)
图1:
通信模式:
2.发布/订阅模式(topic)
详解:这个特点的原理是这样的,在activeMQ
==注:消息是被推送和拉取的(消息生产端和消费端),不是mq服务器去主动发送的==
详解:最经典的就是当用户注册时,我们就需要用activeMQ来做为中间件,当用户注册后,我门把用户的邮箱号和验证码等信息通过activeMQ的生产端发送到activeMQ的消息队列中,而一旦消息队列中出现了数据,我们的邮件模块通过实时的监控activeMQ的消息队列就能通过消费端获取到这个数据,染回邮件模块就会自行的去对数据进行解析,给用户发送邮件
详解:原理同发送邮件相同
详解:为了缓解数据库的压力,我们把经常被调用的数据放入索引库中,当有请求查询时,我们会先去查询索引库,如果索引库内有数据,那么我们就不用就数据库进行查询,这样就能大大的减轻服务器的压力,可是随之而来的一个问题是,假如我们服务器内的数据已经发生了改变,而浏览用户查询数据时,因为索引库中已经有数据了,那么这样一来数据库与索引库的数据就不一致了,那么怎么解决这个问题呢?我们想到了通过用activeMQ来监听数据库的操作来实现数据库与索引库的数据同步,当后台管理员或房产经纪人对数据库的数据进行了增删改的操作时,我们通过activeMQ监听到了数据的改变,获取到被修改的数据的id,然后在另一个服务模块中通过这个数据的id去数据库先查询一把,然后根据查询结果进行判断,再去做索引库的数据同步。打个比方,如果查询结果返回的是空,就说明商品已经被删除,那么我们就可以根据数据的id去把索引库中的数据也一并删除了。
4.同步静态页面
详解:此原理同上一个同步索引库是一个原理,目的都是为了减缓服务器的压力,我们经过数据分析发现,其实我们的一些商品详情页面的数据其实都是大同小异的,完全可以通过freemarker
页面静态化的模块加上后台查询出的数据拼装成一个静态页面,而这些数据从哪来呢?我们经过讨论和研究,最后一致认为还是放在缓冲中比较好,这样一来就能大大的减轻了数据 库的压力,而另一个好处是,由于页面是纯静态页面,所以页面上的数据都是死数据,这样一来就不用像JSP动态页面那样需要和后台数据库有大量的数据交互,可以最大化的降低服务器的压力,其实这个技术已经有很多大型公司在使用了,比如淘宝,京东,网易等,我们要是细心一些就会发现,他们的页面其实就都是HTML格式的静态页面。
ActiveMQ的安装:
ActiveMQ安装很简单,只需从其 官网 下载至linux环境,解压并进入bin目录
|
使用启动命令运行就好了。然后我们打开浏览器进入管理后台 http://localhost:8161/admin/
输入默认的账号密码:admin
。就可以看到管控台了。
ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到
|
将property name
为authenticate
的属性value="false"
改为"true"
,
控制台的登录用户名密码保存在conf/jetty-realm.properties
文件中,内容如下:
|
值得注意的是 用户名和密码的格式是
用户名 : 密码 ,角色名