消息队列
文章平均质量分 86
斑马工
别在最好的年纪,选择安逸。
展开
-
深入浅出消息队列---12、Kafka存储
Kafka存储 Kafka作为一个支持大数据量写入写出的消息队列,由于是基于Scala和Java实现的,而Scala和Java均需要在JVM上运行,所以如果是基于内存的方式,即JVM的堆来进行数据存储则需要开辟很大的堆来支持数据读写,从而会导致GC频繁影响性能。考虑到这些因素,kafka是使用磁盘而不是kafka服务器broker进程内存来进行数据存储,并且基于磁盘顺序读写和MMAP技术来实现高性能。 存储结构介绍 Kafka一个topic下可以存在很多个分区,不考虑分区副本的情况下。一个分区对应一个日志(原创 2022-04-20 16:05:48 · 9736 阅读 · 0 评论 -
深入浅出消息队列---11、Kafka分区管理
Kafka为什么快 前面几章我们说到Rabbitmq存储消息的时候使用的是内存和磁盘的方式进行存储,而Kafka消息被持久化到本地磁盘。按照我们的理解Rabbimtq的消息吞吐量应该大于Kafka的消息吞吐量,但是相反Rabbitmq的消息吞吐量反而小于Kafka的,那么为什么呢? 分区管理 Kafka可以将主题(Topic)划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另原创 2022-04-20 16:04:59 · 11774 阅读 · 0 评论 -
深入浅出消息队列---10、Kafka消息幂等性
Kafka消息幂等性 生产端消息重复 问题描述 生产者发送的消息没有收到正确的broke响应,导致producer重试。producer发出一条消息,broker落盘以后因为网络等种种原因发送端得到一个发送失败的响应或者网络中断,然后producer收到一个可恢复的Exception重试消息导致消息重复。 解决方案 1、启动kafka的幂等性 2、retries=0,不重试(可能会丢消息,适用于吞吐量指标重要性高于数据丢失,例如:日志收集) 所谓幂等性,就是对接口的多次调用所产生的结果和调用一次是一致的。生原创 2022-04-20 16:03:45 · 9484 阅读 · 0 评论 -
深入浅出消息队列---9、Kafka消息顺序性
Kafka消息顺序性 消息顺序性 Kafka保证消息顺序性的特点如下所示: topic中的数据分割为一个或多个partition。每个topic至少有一个partition。在单个partition中的数据是有序的,如果消息分散在不同的 partition,Kafka 无法保证其顺序性。但只需要确保要求顺序性的若干消息发送到同一个 partiton,即可满足其顺序性。并且在进行消息消费的时候,需要确保消费者是进行单线程消费。 要保证若干消息发送到同一个partiton中,那么我们就需要在发送消息的时候指定一原创 2022-04-19 09:37:49 · 9685 阅读 · 0 评论 -
深入浅出消息队列---8、Kafka消息可靠性
Kafka消息可靠性 第一种情况 消费端消息丢失 场景描述: 位移提交:对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中的位置。对于消费者而言,它也有一个offset的概念,消费者使用offset来表示消费到分区中某个消息所在的位置。 单词"offset"可以编译为"偏移量",也可以翻译为"位移",在很多的中文资料中都会交叉使用"偏移量"和"位移"这两个词,对于消息在分区中的位置,我们将offset称之为"偏移量";对于消费者消费到的位置,将offset称为"位移",有时原创 2022-04-19 09:36:26 · 9445 阅读 · 0 评论 -
深入浅出消息队列---7、Kafka介绍
kafka架构回顾 kafka的具体架构如下所示: Producer 生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。 生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。 Comsumer 消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。 Topic 在Kafka中,使用一个类别属性来划分数据的所属类,划分数据的这原创 2022-04-19 09:35:09 · 9481 阅读 · 0 评论 -
深入浅出消息队列---6、RabbitMQ高可用
RabbitMQ高可用 Rabbitmq常见的部署模式:单机,普通集群,镜像集群 RabbitMQ普通集群 集群原理 这里先思考两个问题: 搭建集群的好处? 提供整体消息队列服务的可靠性 可以通过水平扩容提高整体服务的吞吐量 有了集群以后是否可以保证消息不丢失? 不可以 基于存储空间和性能的考虑,在Rabbitmq集群中创建队列,集群只会在单个节点而不是在所有节点上创建队列的进程并包含完整的队列消息(元数据,状态,内容)。 这样只有队列的宿主节点,即所有者节点知道队列的所有信息,所有其他非所原创 2022-04-19 09:34:14 · 9753 阅读 · 0 评论 -
深入浅出消息队列---5、RabbitMQ公平性保证
RabbitMQ公平性保证 消息的可靠性传输可以保证秒杀业务的公平性。关于秒杀业务的公平性,我们还需要考虑一点:消息的顺序性(先进入队列的消息先进行处理) RabbitMQ消息顺序性 顺序性:消息的顺序性是指消费者消费到的消息和发送者发布的消息的顺序是一致的。 举个例子,不考虑消息重复的情况,如果生产者发布的消息分别为msgl、msg2、msg3,那么消费者必然也是按照msgl、msg2、msg3的顺序进行消费的。 目前很多资料显示RabbitMQ的消息能够保障顺序性,这是不正确的,或者说这个观点有很大的局原创 2022-04-19 09:32:42 · 9703 阅读 · 0 评论 -
深入浅出消息队列---4、RabbitMQ消息可靠性传输
RabbitMQ消息可靠性传输 在我们的业务系统中,一旦使用到了消息队列,我们就必须考虑消息的丢失问题。比如在秒杀业务中,一旦消息丢失了对我们用户而言就是不公平的。 第一种情况 场景描述 生产者已经将消息发送给了队列,但是此时消费者还没以及时对消息进行消费,这个时候指定的队列主机宕机了,这样存储在队列的消息也会丢失。 解决方案 对消息进行持久化操作。当对消息进行持久化操作以后,这个消息一旦被发送到mq中的某一个队列,那么此时Rabbitmq会立马将消息进行持久化。 注意 spring boot和rabbit原创 2022-04-19 09:31:33 · 9996 阅读 · 0 评论 -
深入浅出消息队列---3、RabbitMQ延迟队列
延迟队列 当用户秒杀成功以后,就需要引导用户去订单页面进行支付。如果用户在规定的时间之内(30分钟),没有完成订单的支付,此时我们就需要进行库存的回退操作。 库存回退架构 回退库存的架构如下图所示: 过期时间 目前有两种方法可以设置消息的TTL: 1、通过队列的属性设置,队列中所有的消息都有相同的过期时间。 2、是对消息本身进行单独的设置,每条消息的TTL可以不同。 如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值为准。消息在队列中的生存时间一旦 超过设置的TTL值时,就会变成"死信"。 设置原创 2022-04-19 09:30:42 · 9683 阅读 · 0 评论 -
深入浅出消息队列---2、RabbitMQ介绍
RabbitMQ架构回顾 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的。它的实现架构如下图所示: 各个组件介绍: Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列 Queue:消息的载体,每个消息都会被投到一个或多个队列 Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来 Routing Key:路由关键字,exchange根据这个关键字进行消息投递 Pr原创 2022-04-19 09:29:42 · 9563 阅读 · 0 评论 -
深入浅出消息队列---1、消息队列概述
消息队列介绍 消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。 消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。 消息队列应用场景: 异步处理: 异步处理是将很多串行进行的步骤转成异步处理,还是已订单系统为例,下单订单需要创建订单和锁定库存,确定本次原创 2022-04-19 09:28:21 · 9500 阅读 · 0 评论