Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)

1、定义

JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。

1.1、点对点:Queue,不可重复消费

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

1.2、发布/订阅:Topic,可以重复消费

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。

支持订阅组的发布订阅模式:
发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue,每个Queue是点对点的方式,Queue之间是发布订阅方式。

2、区别

2.1、点对点模式

生产者发送一条消息到queue,一个queue可以有很多消费者,但是一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,所以Queue实现了一个可靠的负载均衡。

2.2、发布订阅模式

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

3、流行模型比较

传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循JMS规范。

3.1、RabbitMQ

RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。
RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。

(1)点对点
生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。


(2)多订阅
当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费不同的Queue。所以支持多订阅时,消息会多个拷贝。

3.2、Kafka

Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。但是可能产生重复消费的情况。

(1)点对点&多订阅
发布者生产一条消息到topic中,不同订阅组消费此消息。

消息队列模式(点对点发布订阅)相关推荐

  1. 【转】RabbitMQ六种队列模式-3.发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  2. MQ - 消息队列中点对点模型与发布/订阅模式的区别

    背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...

  3. 深入理解分布式技术 - 结合RocketMQ和Kafka理解MQ的两种经典模式_P2P模式和发布订阅模式

    文章目录 规范概述 实现标准: AMQP VS JMS 基础模型 点对点 发布订阅 Kafka 的消费模式 RocketMQ 的消费模式 RocketMQ 的 集群消费 RocketMQ 的 广播消费 ...

  4. 消息队列中点对点与发布订阅区别

    背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...

  5. 消息队列中点对点与发布订阅区别(good)

    背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...

  6. Kafka的点对点模式、发布订阅模式、基础架构

    一.定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于 大数据实时处理领域. 二.消息队列 使用消息队列的好处 1)解耦 允许你独立的扩展或修改两边 ...

  7. 消息队列篇—详谈ActiveMQ消息队列模式的分析及使用

    2019独角兽企业重金招聘Python工程师标准>>> 消息队列(Message Queue)是分布式系统中重要的组件,通用使用场景可以简单地描述为当不需要立即获得结果,但是并发量需 ...

  8. java 阅发布模式_redis发布订阅模式

    一 前言 虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!! 二发布订阅模式 PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者: SUBSCRIBE 向命令 ...

  9. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

最新文章

  1. 为什么要使用EJB?
  2. 字符指针(子串个数统计)
  3. PHP中变量类型的判断
  4. 重构改善既有代码的设计(笔记)
  5. 运维专家:我在大数据项目中踩过的那些坑
  6. 绝对定位的div图片居中自适应
  7. php在线翻译,php调用百度在线翻译api的代码
  8. Go-加密学(四) - 证书/SSL/TLS/https单向认证/思维导图
  9. 新人略谈关于积分墙盈利模式的思考
  10. Maximal submatrix(直方图最大矩阵)
  11. java中utp_5类UTP比3类UTP扭矩_______。
  12. Android Studio更新问题
  13. JmeterWeb接口测试使用指南
  14. 带你走进开源阿卡信-v1.0
  15. MT6758处理器芯片资料介绍
  16. [易飞]关于易飞ERP进货单审核过程的总结
  17. 2021年网络通信与信息安全国际学术会议(ICNCIS2021)
  18. 华为任意版本固件ROM下载技巧
  19. 【Java】广州三本秋招经历
  20. 机器学习实战之k-近邻算法识别手写数字(含拍照检验步骤详解)

热门文章

  1. 用pelican搭建完美博客
  2. mybatis 批量更新update详解
  3. DirectX 3D纹理
  4. 关于“珊瑚生长率用于重建历史时期海表温度变化”写一段3000字的国内外研究现状,引用文献不少于10篇...
  5. 基于 Dotnetty 的 Mqtt Client
  6. cobol连接数据库
  7. python 无法定位程序输入点ucrtbase_win7无法定位程序输入点ucrtbase.abort于动态链接库的解决办法...
  8. 【Android】开发干货-技术分享之高仿QQ换肤SkinEngine实现
  9. Paw for Mac v3.3.3 – API接口调试http客户端
  10. 用python函数画德国国旗代码_用Python绘制一面国旗