kafka 消息队列中点对点与发布订阅的区别说明

 更新时间:2022年05月05日 11:33:14   作者:幽灵之使  
这篇文章主要介绍了kafka 消息队列中点对点与发布订阅的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

背景知识

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

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

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

1.JMS中定义

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

点对点

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

发布/订阅

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

2.二者分析与区别

2.1 点对点模式

生产者发送一条消息到queue,只有一个消费者能收到。

2.2 发布订阅模式

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。

小结

  • queue实现了负载均衡,一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,一个queue可以有很多消费者,他们之间实现了负载均衡,所以Queue实现了一个可靠的负载均衡
  • topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到一个消息的拷贝,只有在消息代理收到消息时有一个有效订阅时的订阅者才能得到这个消息的拷贝

疑问

  • 发布订阅模式下,能否实现订阅者负载均衡消费呢?当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息,即分组订阅(如下图所示),这样订阅者很容易实现消费能力线性扩展

3.流行的消息队列模型比较

传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点发布订阅模型,但其他流行的消息队列RabbitMQKafka并没有遵循老态龙钟的JMS规范,是通过什么方式实现消费负载均衡多订阅呢?

3.1 RabbitMQ

RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。此外RabbitMQ是向消费端推送消息,订阅关系消费状态保存在服务端。

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

RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费此消息。 

RabbitMQ既支持内存队列也支持持久化队列,消费端为推(push)模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。所以支持多订阅时,消息会多个拷贝。

3.2 Kafka

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解

    spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解

    这篇文章主要为大家介绍了spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Springboot工程中使用filter过程解析

    Springboot工程中使用filter过程解析

    这篇文章主要介绍了springboot工程中使用filter过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • spring初始化源码代码浅析

    spring初始化源码代码浅析

    Spring框架被广泛应用于我们的日常工作中,但是很长时间以来我们都是只会使用,不懂它的作用原理,下面这篇文章主要给大家介绍了关于spring初始化源码的相关资料,需要的朋友可以参考下
    2023-04-04
  • java处理转义字符↑ → ↓ 保存后的展示还原操作

    java处理转义字符↑ → ↓ 保存后的展示还原操作

    这篇文章主要介绍了java处理转义字符↑ → ↓ 保存后的展示还原操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringCloud中的Consul详解

    SpringCloud中的Consul详解

    这篇文章主要介绍了SpringCloud中的Consul知识,本文使用的是docker-compose方式管理consul服务,直接启动即可,需要的朋友可以参考下
    2022-03-03
  • Java8-Stream流操作List去重问题

    Java8-Stream流操作List去重问题

    这篇文章主要介绍了Java8-Stream流操作List去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java线程中的interrupt方法解读

    Java线程中的interrupt方法解读

    这篇文章主要介绍了Java线程中的interrupt方法解读,Java中的interrupt是一种线程间通信的机制,用于请求中断线程的执行。当一个线程调用另一个线程的interrupt()方法时,被调用线程会收到一个中断信号,可以根据需要做出相应的处理,需要的朋友可以参考下
    2023-10-10
  • Java 报错 java.util.ConcurrentModificationException: null 的原因及解决方案

    Java 报错 java.util.ConcurrentModificationException: null 

    这篇文章主要介绍了Java 报错 java.util.ConcurrentModificationException: null 的原因和解决方案,这个异常通常在多线程环境下出现,意味着在迭代过程中,集合或者映射的结构发生了变化,本文分享完美解决方案,需要的朋友可以参考下
    2023-07-07
  • SpringBoot中@RestControllerAdvice注解的使用

    SpringBoot中@RestControllerAdvice注解的使用

    这篇文章主要介绍了SpringBoot中@RestControllerAdvice注解的使用,@RestControllerAdvice主要用精简客户端返回异常,它可以捕获各种异常,需要的朋友可以参考下
    2024-01-01
  • java文件操作之Path,Paths,Files

    java文件操作之Path,Paths,Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类,下面给大家分享用Files作为一个操作类的实例,需要的朋友可以参考
    2017-04-04

最新评论