首页 > 编程语言 >Java中间件学习之RabbitMQ

Java中间件学习之RabbitMQ

时间:2023-03-09 10:45:50浏览次数:40  
标签:Java 队列 JMS 中间件 RabbitMQ 生产者 交换机 消息

什么是MQ

 

 消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

MQ是消息通信的模型,并不是具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。

  • AMQP:

  • JMS:

两者间的区别和联系:

  1. JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  2. JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
  3. JMS规定了两种消息模型;而AMQP的消息模型更加丰富

补充:

  • ActiveMQ:基于JMS
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
  • RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
  • Kafka:分布式消息系统,高吞吐量

MQ的好处

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

MQ的对比和选择

 

RabbitMQ的组成部分

  • 生产者Producer:产生数据发送消息的程序是生产者。
  • 交换机Exchange:交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定。
  • 队列Queue:队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式。
  • 消费者Consumer:消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

 MQ的工作模式

  • Hello Wold 简单模式:简单的“生产者-消息队列-消费者”的工作模式。
  • Work queues工作 队列模式:一个消息队列对应多个消费者,由多个消费者竞争消费信息。
  • Publish/Subscribe发布订阅模式:引入交换机Exchange,类型为Fanout,特点是将消息分发到绑定的多个消息队列中。
  • Routing 路由模式:这种模式下的交换机类型为Direct,特点是可以根据指定的Routing Key去匹配BindingKey相同的消息队列。
  • Topics 主题模式:这种工作模式的交换机类型为Topic,特点是RoutingKey和BindingKey中引入通配符,然后两者通过模糊匹配相关联。
  • Publisher Confirms 发布确认模式(RPC):这种工作模式实际应用不广泛暂不学习。

补充:生产者(Producter)和交换机(Exchange)之间通过RoutingKey相关联,交换机(Exchange)和消息队列(Queue)之间通过BindingKey来绑定。

RabbitMQ如何避免消息丢失

生产者:在生产者端开启comfirm 确认模式,生产消息发到RabbitMQ后,会给你回传一个ack消息,告诉你说这个消息成功写入了。

消息队列:消息队列设置为持久化队列,将内存数据持久化到磁盘中。

消费者:消费者把自动ACK关闭,设置为手动ACK,等消息被消费以后再返回ACK信息。

RabbitMQ如何保证顺序性消费

方案一:拆分多个Queue,每个Queue对应一个Consumer。(性能慢,需要增加Consumer的数量,风险小一点)

方案二:Producter和Consumer根据实际业务制定好规则,然后Consumer增加本地缓存或者队列,将消息按规则拍好顺序后消费,如果觉得效率慢可以引入多线程去处理。(不需要增加Consumer,性能快,如果用多线程风险会高一些)

RabbitMQ如何幂等性消费信息(不重复消费信息)

每条消息绑定一个不重复的Id作为标识,消费方在消费的时候通过Id去判断是否已经被消费。例如消费方可以把信息先存到数据库中,把Id作为主键,如果主键冲突说明此条消息已被消费过,然后再根据实际业务场景选择由插入数据改为更新,或者直接舍弃掉。

标签:Java,队列,JMS,中间件,RabbitMQ,生产者,交换机,消息
From: https://www.cnblogs.com/Bernard94/p/17196521.html

相关文章

  • java 集合嵌套之ArrayList嵌套HashMap
       ......
  • Java应用【XVII】在Java中使用WebSocket
    如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!一、 简介1.1什么是W......
  • JAVAScript 跨平台客户端脚本语言
    前端内容三大基础性技术  Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解......
  • Java知识回顾
    一、Java的特性以及优势简单性面向对象(人与人直接的交流万物皆对象)可移植性(对于不同的平台有对应的JVM)高性能分布式动态性(Java反射机制)多线程安全性健壮性......
  • Java学生信息管理系统小改进
    原项目地址:Java实现学生管理系统项目完整版,每个功能详细介绍,最后面完整源代码可直接执行_学生管理后台项目介绍_菜鸟Java学习者杰的博客-CSDN博客原项目运行示意图 ......
  • 02-RabbitMQ的安装和配置
    RabbitMQ的安装和配置一、安装依赖环境在线安装依赖环境:yuminstallbuild-essentialopensslopenssl-develunixODBCunixODBC-develmakegccgcc-c++kernel-devel......
  • 基于JSP+javaBean的留言板--改进(附源码)
    一、系统的主要功能和特点系统主要实现了以JSP和JavaBean为基础的留言板。主要包括登录、登陆检查、增加留言、查看全部留言信息、查看指定留言信息等功能实现了数据的读......
  • Redis 的Java客户端——Jedis连接池的使用详解
    一.Redis的Java客户端jedis的官方仓库地址:https://github.com/redis/jedisRedis数据结构Redis是一个key-value的数据库,key一般是String类型,不过value的类......
  • Java学习笔记13
    1.Date类1.1概述​ java.util.Date类表示特定的瞬间,精确到毫秒。1.2构造方法Date类有多个构造方法,部分已经过时。方法作用publicDate()从此刻到计算机时......
  • Java 逻辑运算
    逻辑运算基本语法逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。运算符说明:      &和&&:表示"且"关系,当符号左右两边......