栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

消息队列相关问题

消息队列相关问题

    RabbitMQ

    RocketMQ
    可靠消息

    Kafka
    分布式的,可实时快速处理大量数据
    Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

没有主从,通过zookepper 完成协调

    ActiveMQ
    吞吐量较低
消息队列适合哪些场景

消息队列:它主要用来暂存生产者生产的消息,供后续其他消费者来消费。
它的功能主要有两个:a.暂存(存储)、b.队列(有序:先进先出)。

    异步处理数据:允许用户把一个消息放入队列,但并不立即处理它系统应用解耦:业务流量削峰:
RabbitMQ 1. 应用

服务间异步通信,顺序消费,定时任务,请求削峰

2. 工作模式
    简单模式:一个生产者一个消费者工作模式work:一个生产者,多个消费者;
    多个消费者同时监听同一个队列时会共同争抢当前消息队列的内容订阅者模式:群发路由模式routing:匹配对应关键字主题模式topic:交换机个根据通配符模糊匹配对应队列,由队列的监听消费者接收消息消费
3 问题 消息如何路由?

消息提供方–> 路由 —>一个至多个队列消息发布到交换器时,
消息将有一个路由键,在消息创建时设定;
通过队列路由键,可把队列绑定到交换器上;
消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行对应路由机制的匹配
fanout:交换器收到消息,将会广播到所有绑定队列
direct:路由键匹配,则把消息发送到相应队列
topic:可使用通配符模糊匹配

如何保证消息不被重复消费?(如何保证消息消费时的幂等性) 为什么会被重复消费?

正常来说消费者在消费完消息时,会发送一个确认消息给消息队列,队列得知该消息被消费就会将该消息从消息队列删除,
但有网络故障时,确认消息没有传到消息队列,导致消息队列不知道该消息已经被消费,会再次将该消息分发给其他的消费者

解决

保证消息的唯一性
在写入消息队列的数据做唯一标识,消息消费时,根据唯一标识判断是否消费过

例如有一个系统,消费一条消息后就往数据库插入一条数据,一个消息重复两次的话就会出错,应在插入数据库时根据唯一标识自己判断一下是否已经消费过,若消费过,直接丢掉,从而保证了数据的正确性

如何保证RabbitMQ消息的可靠传输?

消息

Kafka

实时快速处理大量数据
Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

没有主从,通过zookepper 完成协调

问题 kafka中的broker 是干什么的?

broker 是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。

kafka中的 zookeeper 起到什么作用,可以不用zookeeper么

zookeeper 是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖,
但是broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活等等。

kafka 为什么那么快?
    顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。
    硬盘的每次读写都会 寻址–>写入 ,采用顺序读写极大的提升速度
    Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入Cache Filesystem Cache PageCache缓存
    利用了操作系统本身的内存
    通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。Zero-copy 零拷技术减少拷贝次数
    允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据分区,分段,索引
    Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符
kafka producer如何优化打入速度

增加线程
提高 batch.size
增加更多 producer 实例
增加 partition 数
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
跨数据中心的传输:增加 socket 缓冲区设置以及 OS tcp 缓冲区设置。

整体架构:

zookeeper :分布式协调服务,协调kafka应用
broker:kafka的节点
producer:生产者生产数据
consumer:消费者
consumer group:消费者组,组内的消费者默认是不能重复消费
topic:主题,是消息的归类
partition:分区
replicas:副本,数据冗余储存
segment:文件段,文件按照1G大小进行拆分,主要包括两个文件,.index索引和.log(如何查找,二分)

消费者语义
    exactly at once:精准消费一次,主要的是要保存好消费的偏移量,比如存储到redis或hbase中at least once:至少消费一次,重复消费at most once:至多消费一次,数据丢失
数据的不丢失
    broker:通过副本机制,保证数据的不丢失producer:ack机制
    1)0:不管broker是否保存好数据,都一直发送数据
    2)1:至少leader节点保证存储好数据
    3)-1:leader和follower 都保存好数据,再发送下一条数据consumer:保存好offsetflume整合kafka
    关键点:设置好flume中的sink,到kafka
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/758151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号