现如今项目开发过程中由于功能多,流程长,机制繁多且复杂,让一个线程去跑完一个业务的整个流程的话会显得非常繁琐且耦合性太强,代码量很大,这个时候我们就可以用到一款技术叫做消息队列,我们可以通过定义好发送消息的模式以及一些其他数据,就可以在一个业务有很多流程的时候通过发送消息的形式让队列通知消息消费者去完成一些操作,比如说数据的存储与修改等,这样无形之中就把一个大业务拆分成了很多小的业务的组合体,实现了代码的解耦和和复杂业务的分割,逻辑清晰代码层次分明。

同步和异步

说到发送和接收消息这里得提一下消息的同步异步问题,同步和异步发送消息对于消息发送可靠性的保障上有区别。这里的消息发送可靠性指消息在网络连接异常断开,进程异常重启之后所有的消息都不丢失。

同步发送保证了每条消息都被顺利收到并得到处理,若发送消息之后等待ACK超时表示对方可能未妥善收到并处理消息,发送方可以对消息进行重发等操作。因此同步发送的方式一定程度上保证了消息的可靠性。

异步方式由于中间存在收发缓存,当接收端进程异常重启,缓存内消息可能丢失,因此发送方发出去的消息并不能保证被接收并得到处理。像线程级的异步来说,必须在收发双方的消息中增加消息序列号,并对发送的每条消息,消息发送的序列号,消息接收的序列号进行持久化,这样进程重启之后可以对双方的序列号进行同步,从持久化模块中取出丢失的部分消息。以这样的方式才能保证消息发送的可靠性。

ActiveMQ与JMS

JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。

JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。

简单的来说JMS类似接口开发规范,ActiveMQ是对它的具体实现,而ActiveMQ也可以基于其他的规范,比较灵活。

消息模型

我们常用的有两种:PTP和PUB/SUB即点对点(一对一)和发布订阅模式(一对多)

P2P的特点:

三个重点:队列(queue) 生产者(sender) 消费者(receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
接收者在成功接收消息之后需向队列应答成功
如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。

PUB/SUB的特点:

三个重点:主题(topic) 发布者(Publisher) 订阅者(Subscriber)

客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

消息消费

在JMS中消息的消费也分为同步和异步

同步 :订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞

异步 :订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)

Session

Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。

MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。

总结

消息队列的使用的好处:提供消息灵活性,松散耦合,异步性

浅谈对ActiveMQ的理解相关推荐

  1. web前端技术基础课程讲解之浅谈对soket的理解

    浅谈对soket的理解 定义: 网络上的两个程序通过一个双向的通信链实现数据的交换,这个链接的一端就成为Socket 它是进程通信的一种,即调用这个网络库的api函数实现分布在不同主机相关进程之间的数 ...

  2. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

  3. 【浅谈】我所理解的游戏场景设计:身临其境

    今天看了一篇关于场景设计的文章,让我比较有感触,于是也想谈一谈自己对它的理解.我认为场景设计不好被单独拿出来讨论,它牵涉到游戏设计中的很多内容,下面先从"场景设计"聊起. 场景是至 ...

  4. 委托学习总结(一)浅谈对C#委托理解

    要理解委托,我们首先要知道委托的概念: "委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Els ...

  5. 浅谈对xmpp的理解及应用

    参考原文链接 http://blog.sina.com.cn/s/blog_69f68f880102uyeg.html 一.xmpp是基于xml的协议.具有遵循标准,有安全性,使用TCP传的xml的流 ...

  6. java 线程的理解_浅谈对多线程的理解(一)

    今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...

  7. 系统学习NLP(二十三)--浅谈Attention机制的理解

    转自:https://zhuanlan.zhihu.com/p/35571412 Attentin机制的发家史 Attention机制最早是应用于图像领域的,九几年就被提出来的思想.随着谷歌大佬的一波 ...

  8. 浅谈Vue渐进式的理解

    对于刚刚接触前端的我来说,理解Vue的相关问题还是要从基础的模型结构入手.对于内容会持续更正.添加...... 传统的MVC模型与MVVC模型 前端设计中的经典模型,Model View Contro ...

  9. 浅谈partial class的理解

    第一种说法: partial classes:局部类型 partial 类型可以使我们把对某个类的描述写在不同地方,甚至写到两个或多个不同的文件中去.partial 信息只对编译器有用,编译器在编译时 ...

最新文章

  1. hihocoder 1152 Lucky Substrings
  2. runtime objc_msgSend
  3. 「软件项目管理」一文详解软件项目管理概述
  4. 【kibana】状态异常 Status: Red Unable to connect to Elasticsearch at http://127.0.0.1:9200.
  5. C#之判断Mysql数据库表是否存在
  6. cesium 加载Googl式的切片
  7. 带你了解HTTP协议(二)
  8. matlab 不同函数间传递结构体数据_VC与Matlab混合编程及复杂数据:结构体传递
  9. Arduino AT24C02详解读写地址位
  10. oracle数据库卸载过程,oracle数据库卸载教程,Oracle卸载步骤有哪几步?
  11. 【转贴】你必须知道的20个故事
  12. 猿创征文|磁盘满的本质分析——磁盘空间满与inode节点满
  13. 在网上疯传的行动艺术照
  14. 国有林场试点森林防火(资源监管)四位一体系统建设指南
  15. 9 种流行的文件、文件夹比较工具点评 (转贴)
  16. YOLOv7训练自己的数据集(超详细)
  17. Java将字符串分割为数组
  18. 谷歌全家桶大礼包最新更新-160kb轻量安装器
  19. 热水IC卡预付费充值系统
  20. 创建crawl—scrapy

热门文章

  1. influxDB自定义查询时区
  2. [黑群晖]DSM7.1 ds3617xs 志强e3 1265lv3 b85保姆级安装教程
  3. 注意力机制在推荐模型中的应用——AFM、DIN、DIEN
  4. 近200篇机器学习深度学习资料分享(含各种文档,视频,源码等)(3)
  5. Windows系统安装搭建ios开发环境
  6. IDEA如何多次启动同一个程序
  7. java中的反射详解
  8. MySQL 计算两个日期/时间之间相差的天数、分钟数、秒数...
  9. 配置Druid数据源监控
  10. Python运维开发学习(一)