• Activemq入门


    ActiveMQ入门

    消息中间件应用场景

    异步处理

    场景说明:用户注册,需要执行三个业务逻辑,分别为写入用户表,发注册邮件以及注册短信。

    串行方式

    将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。

    image-20201013152453320

    并行方式

    将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

    image-20201013152531311

    异步处理

    引入消息中间件,将部分的业务逻辑,进行异步处理。改造后的架构如下:

    image-20201013152556738

    按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高啦,比串行提高了3倍,比并行提高了两倍。

    应用解耦
    场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:

    image-20201013152631216

    传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合。如何解决以上问题呢?引入应用消息队列后的方案,如下图:

    image-20201013152738062

    订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

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

    通过加入消息队列完成如下功能:
    a、可以控制活动的人数
    b、可以缓解短时间内高流量压垮应用

    image-20201013152829406

    用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。秒杀业务根据消息队列中的请求信息,再做后续处理
    常见的消息中间件产品对比

    特 性 ActiveMQ RabbitMQ RocketMQ Kafka
    开 发 语 言 Java Erlang Java Scala
    单 击 吞 吐 量 万级 万级 10万级 10万级
    时 效 性 毫秒级 微秒级 毫秒级 毫秒级
    可 用 性 高(支持主从架构) 高(支持主从架构) 非常高(分 布式架构) 非常高(分布式 架构)
    功能特性 ActiveMQ 公司得到应用;有较 多的文档;各种协议 支持较好 RabbitMQ 发能力很强,性能极其 好,延时很低;管理界面 较丰富 RocketMQ 较完备,扩 展性佳 Kafka 功能没有提供, 在大数据领域应用广。

    ActiveMQ简介及JMS

    image-20201013153153814

    什么是ActiveMQ?
    官网: http://activemq.apache.org/
    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。我们在本次课程中介绍 ActiveMQ的使用。

    什么是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和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。

    JMS消息模型
    消息中间件一般有两种传递模式:点对点模式(P2P)和发布-订阅模式(Pub/Sub)。
    (1) P2P (Point to Point) 点对点模型(Queue队列模型)
    (2) Publish/Subscribe(Pub/Sub) 发布/订阅模型(Topic主题模型)
    点对点模型

    点对点模型(Pointer-to-Pointer):即生产者和消费者之间的消息往来。

    image-20201013153439284

    每个消息都被发送到特定的消息队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

    点对点模型的特点:
    每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);
    发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列;
    接收者在成功接收消息之后需向队列应答成功。

    image-20201013153613702

    发布/订阅模型
    包含三个角色:主题(Topic),发布者(Publisher),订阅者(Subscriber),多个发布者将消息发送到topic,系统将这些消息投递到订阅此topic的订阅者

    image-20201013153633085

    发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。

    发布/订阅模型的特点:
    每个消息可以有多个消费者;
    发布者和订阅者之间有时间上的依赖性(先订阅主题,再来发送消息)。
    订阅者必须保持运行的状态,才能接受发布者发布的消息;

    JMS编程API

    要 素 作 用
    Destination 表示消息所走通道的目标定义,,用来定义消息从发送端发出后要走的通 道,而不是接收方。Destination属于管理类对象
    ConnectionFactory 顾名思义,用于创建连接对象,ConnectionFactory属于管理类的对象
    Connection 连接接口,所负责的重要工作时创建Session
    Session 会话接口,这是一个非常重要的对象,消息发送者、消息接收者以及消息 对象本身,都是通过这个会话对象创建的
    MessageConsume 消息的消费者,也就是订阅消息并处理消息的对象
    MessageProducer 消息的生产者,也就是用来发送消息的对象

    ( 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。

    image-20201013154248638

    安装

    第一步:安装 jdk(略)
    第二步:把 activemq的压缩包(apache-activemq-5.14.5-bin.tar.gz)上传到 linux 系统
    第三步:解压缩压缩包
    tar -zxvf apache-activemq-5.14.5-bin.tar.gz
    第四步:进入apache-activemq-5.14.5的bin目录
    cd apache-activemq-5.14.5/bin
    第五步:启动 activemq
    ./activemq start (执行2次:第一次:生成配置信息;第二次:启动)
    第六步:停止activemq:
    ./activemq stop
    

    image-20201013165707010

  • 相关阅读:
    springboot + 自定义配置文件读取
    springboot + mybatis分页插件pagehelper
    Python学习日记(三十九) Mysql数据库篇 七
    Python学习日记(三十八) Mysql数据库篇 六
    Python学习日记(三十七) Mysql数据库篇 五
    Python学习日记(三十六) Mysql数据库篇 四
    Python学习日记(三十五) Mysql数据库篇 三
    Python学习日记(三十四) Mysql数据库篇 二
    Python学习日记(三十三) Mysql数据库篇 一
    Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13809910.html
Copyright © 2020-2023  润新知