ActiveMQ入门

1,消息中间件的应用场景

  • 异步处理
  • 应用解耦
  • 流量削锋

异步处理

场景说明:用户注册,需要执行三个业务逻辑,分别为写入用户表,发送注册邮件以及注册短信
1,串行方式
将注册信息写入数据库成功后,发送注册邮件,再发送注册短信,以上三个任务全部完成后,返回客户端ActiveMQ入门
2,并行方式
将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信,以上三个任务完成后,返回给客户端,与串行的差别是,并行的方式可以提高处理的时间
ActiveMQ入门
3,异步处理
引入消息中间件,将部分的业务逻辑,进行异步处理
ActiveMQ入门
按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒,注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒,因此架构改变后,系统的吞吐量提高,比串行提高了3倍,比并行提高了两倍

应用解耦

场景说明:用户下单后,订单系统需要通知库存系统
传统的做法是,订单系统调用库存系统的接口,如下图:
ActiveMQ入门
传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统解耦,如何解决以上问题呢?引入应用消息队列后的方案,如下图:
ActiveMQ入门
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回订单下单成功
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉,为了解决这个问题,一般需要在应用前端加入消息队列
通过加入消息队列完成如下功能:

  • 可以控制活动的人数
  • 可以缓解短时间内高流量压垮应用
    ActiveMQ入门
    用户的请求,服务器接收后,首先写入消息队列,假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面,秒杀业务根据消息队列中的请求信息,在做后续处理

2,常见的消息中间件对比

ActiveMQ入门

3,ActiveMQ 简介及JMS

ActiveMQ入门

3.1,什么是ActiveMQ

官网
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现

3.2,什么是JMS

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,它可以在分布式环境下扩展进程间的通信,对于消息中间件,常见的角色大致也就有Producer(生产者)丶Consumer(消费者)
消息队里中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构
JMS(java Messaging Service) 是java平台上有关面向消息中间件的技术规范,它便于消息系统中的java应用程序进行消息交换,并且通过提供标准的产生,发送,接收消息的接口简化企业应用的开发
JMS本身只定义了一系列的接口规范,是一种与厂商无关的API,用来访问消息收发系统,它类似于JDBC(java Database Connectivity): 这里,JDBC是可以用来访问许多不同关系数据库的API,而JMS则提供同样与厂商无关的访问方法,以访问消息收发服务,许多厂商目前都支持JMS,包括IBM的MQSeries,BEA的Weblogic JMS service和Profress的SonicMQ,这只是几个例子,JMS使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个JMS客户机向另一个JMS客户机发送消息,消息是JMS中的一种类型对象,有两部分组成:报头和消息主体,报头由路由信息以及有关该消息的元.数据组成,消息主体则携带着应用程序的数据或有效负载。

3.3,JMS消息模型

消息中间件一般有两种传递模式:点对点模式(P2P)和发布-订阅模式(Pub/Sub)

  1. P2P(Point to Point)点对点模式(Queue队列模式)
  2. Publish/Subscribe(Pub/Sub)发布/订阅模式(Topic主题模式)

点对点模式

点对点模式(Point to Point):即生产者和消费者之间的消息往来ActiveMQ入门
如图所示:生产者将消息发送到特定的消息队列,消费者从队列中获取消息。队列保留着消息,直到他们被消费或超时,消费者从成功接收消息之后需要向队列应答成功。

点对点模式特点:

  1. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列;换句话说就是发送者和接收者谁先操作都可以,没有先后顺序
  3. 接收者在成功接收消息之后需要向队列应答成功

发布/订阅模式

发布/订阅(Publish-Subscribe)

包含三个角色:主题(Topic),发布者(Publisher),订阅者(Subscriber),多个发布者将消息发送到topic,系统将这些消息投递到订阅此topic的订阅者
ActiveMQ入门
如图所示:发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。

发布/订阅模式的特点:

  1. 每个消息可以有多个消费者;
  2. 发布者和订阅者之间有时间上的依赖性(先订阅主题,在发送消息)。
  3. 订阅者必须保持运行的状态,才能接受发布者发布的消息;

举例

ActiveMQ入门

JMS编程API

ActiveMQ入门
1,ConnectionFactory

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueCOnnectionFactory和TopicCOnnectionFactory两种。

2,Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象:Queue、Topic

3,Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session

4,Session

Session是我们对消息进行操作的接口,可以通过session创建生产者,消费者,消息等。session提供了事务的功能,如果需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。

5,Producter

Producter(消息生产者):消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

6,Consumer

ConSumer(消息消费者):消息消费者有Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过Session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

7,MessageLIstener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的ONMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。
ActiveMQ入门
如图:创建一个connectionFactory连接工厂,由连接工厂去创建连接,基于连接可以创建一个session会话,用session可以创建生成者也可以创建消费者,也可以创建消息,生成者把消息发送到Destination目的地,消费者从目的地接收消息消费。