1. 消息队列

1.1 基本概念

消息队列的本质就是发送 —存储 — 消费:

生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者,仅此而已。

这是传统的队列模型,但是,如果有多个消费者都需要这个消息,但是,只有一个消费者获得消息消费掉,队列中该消息就被删除,其他消费者就无法获取。

于是,发布—订阅者模型被提出:

这里的队列就变成主题,订阅者需要提前订阅主题,然后所有订阅过的订阅者都能收到消息,另外,如果订阅者为1,那么就是传统的模型,也就是单播和广播的区别,其实大多数消息队列组件都是基于这个模型,然后做了一定的改动。

1.2 RabbitMQ

RabbitMQ的架构如下:

可以看出RabbitMQ的结构基本就是在基本结构基础上加了exchange,这个exchange称作交换机,制定消息按什么规则、路由到哪个队列,有四种类型:

  • Direct:处理路由键(routing key),需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配
  • Topic将路由键和某模式进行匹配。此时队列需要绑定要一个模式上,符号“#”匹配一个或多个词,符号“*”只能匹配一个词。模糊匹配。
  • Fanout不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到该类型交换机的消息都会被广播到与该交换机绑定的所有队列上
  • header不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的

通过交换机RabbitMQ可以实现广播,四种模式保证了灵活性。

1.3 KafKa

Kafka的架构如下:

Kafka中的常见概念如下:

  • broker: Kafka集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
  • topic: 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic
  • partition: topic中的数据分割为一个或多个partition每个topic至少有一个partition每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
  • leader: 每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
  • follower: Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。
  • zookeeper: broker、consumer信息存储,消费进度的存储、leader选举等。

1.4 两种常用的MQ的对比

  • 性能:Kafka的诞生的是处理高并发日志的,吞吐量比较高,每秒请求数达到数十万量级,RabbitMQ每秒请求数则为万级别,有测试报告指出Kafka是RabbitMQ的10倍以上性能
  • 运维便捷:RabbitMQ相对比较方便,可以使用yum或者docker安装,自带Web管理UI,没有额外的依赖,除了需要做镜像队列外需要引入HAproxy。Kafka则需要依赖Zookeeper,也没有自带的管理工具,可以使用第三方的Kafka Eagle代替,Kafka Manager过于难用,另外Kafka没有yum安装,docker镜像也是社区人员自己建的。
  • 有序性:RabbitMQ理论上是全局有序性的,但是由于发后既忘+自动确认机制的原因,如果在同个队列的多个消费者做相同的业务处理时,他们的各自的执行任务无法保证有序完成。如果确保100%有序可以使用非自动确认,但会影响消费性能。Kafka支持分区有序性,如果对有序性有严格要求可以设置单个Partition,可是单个Partition并发性比较低,因此在多个Partition情况下可以根据业务指定key把相关的消息路由到同一个Partition,例如相同UserId行为信息可以到Partition 1进行处理。
  • 时效性:Kafka基本上无论在客户端还是服务端都是以异步批量的机制进行处理,通俗的讲就是先攒起来一堆消息,到了某个阀值再发送,也会导致一些消息可靠性与消息有时效上的问题,当然可以通过各种配置策略进行解决。
  • 消息回溯:Kafka在消费完了消息后不会立即删除,只会修改offset,如果之前部分业务消费失败了可以重新设置offset进行重新消费。RabbitMQ则是[发后既忘]的机制,一但消费者确认消息则删除,但是可以通过死信进行补偿消费。此外RabbitMQ在队列消息堆积多的情况下性能表现不佳,所以尽可能的及时消费消息。
  • 特色功能:RabbitMQ具有死信的功能,可以通过死信形成重复消费与延时发送。Kafka具有流处理功能,可以收集用户的行为日志进行存储与分析。

1.5 使用场景

使用场景:MQ的使用一般是用于系统解耦异步通信流量削峰。除此之外,还有延迟通知、最终一致性保证、顺序消息、流式处理等等。

Java学习日报—消息队列—2021/11/23相关推荐

  1. Java学习日报—SQL基础—2021/11/29

    今天效率很低,就看了以下内容... 目录 1.1关键词DISTINCT 1.2 连表查询 1.2.1 内连接 1.2.2 外连接 1.3 查询执行顺序 1.1关键词DISTINCT DISTINCT  ...

  2. Java学习日报 — 问题记录 — 2021/12/14

    1.出现问题:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 分析:出现没有找到mapp ...

  3. Java redis实现消息队列

    文章目录 一.单元测试Java多线程 二.redis实现消息队列 三.java多线程模拟生产者消费者 四.阻塞读 一.单元测试Java多线程 使用junit测试多线程代码,但是等到程序结束,输出结果不 ...

  4. Java笔试面试-消息队列面试题总结

    1.消息队列的应用场景有哪些? 答:消息队列的应用场景如下. 应用解耦,比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单失败.订单系统与库存系统耦合, ...

  5. Java架构之消息队列 (一):消息队列的概述

    消息队列系列分享大纲: 一.消息队列的概述 二.消息队列之RabbitMQ的使用 三.消息队列之Kafka的使用 四.消息队列之RabbitMQ的原理详解 五.消息队列之Kafka的原理详解 六.消息 ...

  6. Java学习经验分享(2021秋招)

    背景 楼主本硕均为电子信息相关专业,之前使用的主要语言也是C,到研究生阶段才开始自学Java,做的两个项目也比较简单,一个是JavaGuide的RPC项目还有一个是基于SpringBoot的博客项目 ...

  7. Java 帝国之消息队列

    张家村的历史 Java 帝国的张家村正在迎来一次重大的变革. 5年前网上购物兴起的时候, 帝国非常看好, 决定向这个领域进军, 于是兴建了张家村, 在这里安装了Java 虚拟机和数据库, 然后部署了一 ...

  8. rabbitmq java实例_RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

    转载http://blog.csdn.net/u013142781 一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式 ...

  9. java并发包消息队列

    消息队列常用于有生产者和消费者两类角色的多线程同步场景 BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. 主要的方法是:put.take一对阻塞存 ...

最新文章

  1. pytorch遇见RuntimeError: CUDA out of memory的解决
  2. vs2013配置opencv2.4.9
  3. web自动化如何在不同浏览器运行_Web自动化测试:元素的基础操作和浏览器基础操作...
  4. VB.NET水晶报表控件经验总结
  5. 开课吧Java课堂:什么是线程优先级?
  6. 单片机练习 - 计时器
  7. [翻译]xml的加密和解密
  8. 华为hcia认证有哪些方向?华为hcia认证哪些方向比较好,值得推荐?
  9. PR、PS小技巧汇总
  10. Git 版本控制系统的安装与使用
  11. 除了 P 站,程序员摸鱼还喜欢上哪些网站?
  12. c++实现n阶行列式计算
  13. 手机浏览器能上网微信无法连接服务器,苹果手机微信可以上网浏览器不能
  14. 有道云笔记markdown字体增大、生成目录
  15. 不能不知道的分布式基础理论
  16. AUTO CAD出现无法识别的版本,如何解决?
  17. R︱sparkR的安装与使用、函数尝试笔记、一些案例
  18. 速看!!带你揭秘3D建模行业内幕!!
  19. MeepoPS基本使用方法
  20. 计算机主机无反应,详解电脑开机没反应怎么办

热门文章

  1. 数据分箱4——卡方最优分箱 ChiMerge算法使用(有监督)
  2. pandas查看两个series、list元素的包含关系(查看一个series的每个元素是否在另一个series中)
  3. R语言快速学习第一部分(有其他语言基础)
  4. python计算AA制时砍价后大家需要分摊的钱
  5. Mac latex vscode配置外部PDF阅读器并配置对应跳转
  6. 青海师大c语言研究生专业课_【考研资讯】多所高校更改专业课科目!考研人还能再怎么惨?...
  7. mysql 常用的列类型_MySQL 常用列类型
  8. 详解如何在vue项目中引入饿了么elementUI组件
  9. 基于Consul的数据库高可用架构【转】
  10. Oracle并行事务回滚相关参数及视图